1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-21 12:02:58 +02:00
llvm-mirror/test/Transforms/LowerExpectIntrinsic/basic.ll
Sanjay Patel 65b8c3537e [LowerExpectIntrinsic] make default likely/unlikely ratio bigger
We need the default ratio to be sufficiently large that it triggers transforms 
based on block frequency info (BFI) and plays well with the recently introduced
BranchProbability used by CGP.

Differential Revision: http://reviews.llvm.org/D19435

llvm-svn: 267615
2016-04-26 22:23:38 +00:00

282 lines
8.2 KiB
LLVM

; RUN: opt -lower-expect -strip-dead-prototypes -S -o - < %s | FileCheck %s
; RUN: opt -S -passes='function(lower-expect),strip-dead-prototypes' < %s | FileCheck %s
; CHECK-LABEL: @test1(
define i32 @test1(i32 %x) nounwind uwtable ssp {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%tmp = load i32, i32* %x.addr, align 4
%cmp = icmp sgt i32 %tmp, 1
%conv = zext i1 %cmp to i32
%conv1 = sext i32 %conv to i64
%expval = call i64 @llvm.expect.i64(i64 %conv1, i64 1)
%tobool = icmp ne i64 %expval, 0
; CHECK: !prof !0
; CHECK-NOT: @llvm.expect
br i1 %tobool, label %if.then, label %if.end
if.then: ; preds = %entry
%call = call i32 (...) @f()
store i32 %call, i32* %retval
br label %return
if.end: ; preds = %entry
store i32 1, i32* %retval
br label %return
return: ; preds = %if.end, %if.then
%0 = load i32, i32* %retval
ret i32 %0
}
declare i64 @llvm.expect.i64(i64, i64) nounwind readnone
declare i32 @f(...)
; CHECK-LABEL: @test2(
define i32 @test2(i32 %x) nounwind uwtable ssp {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%tmp = load i32, i32* %x.addr, align 4
%conv = sext i32 %tmp to i64
%expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
%tobool = icmp ne i64 %expval, 0
; CHECK: !prof !0
; CHECK-NOT: @llvm.expect
br i1 %tobool, label %if.then, label %if.end
if.then: ; preds = %entry
%call = call i32 (...) @f()
store i32 %call, i32* %retval
br label %return
if.end: ; preds = %entry
store i32 1, i32* %retval
br label %return
return: ; preds = %if.end, %if.then
%0 = load i32, i32* %retval
ret i32 %0
}
; CHECK-LABEL: @test3(
define i32 @test3(i32 %x) nounwind uwtable ssp {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%tmp = load i32, i32* %x.addr, align 4
%tobool = icmp ne i32 %tmp, 0
%lnot = xor i1 %tobool, true
%lnot.ext = zext i1 %lnot to i32
%conv = sext i32 %lnot.ext to i64
%expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
%tobool1 = icmp ne i64 %expval, 0
; CHECK: !prof !0
; CHECK-NOT: @llvm.expect
br i1 %tobool1, label %if.then, label %if.end
if.then: ; preds = %entry
%call = call i32 (...) @f()
store i32 %call, i32* %retval
br label %return
if.end: ; preds = %entry
store i32 1, i32* %retval
br label %return
return: ; preds = %if.end, %if.then
%0 = load i32, i32* %retval
ret i32 %0
}
; CHECK-LABEL: @test4(
define i32 @test4(i32 %x) nounwind uwtable ssp {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%tmp = load i32, i32* %x.addr, align 4
%tobool = icmp ne i32 %tmp, 0
%lnot = xor i1 %tobool, true
%lnot1 = xor i1 %lnot, true
%lnot.ext = zext i1 %lnot1 to i32
%conv = sext i32 %lnot.ext to i64
%expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
%tobool2 = icmp ne i64 %expval, 0
; CHECK: !prof !0
; CHECK-NOT: @llvm.expect
br i1 %tobool2, label %if.then, label %if.end
if.then: ; preds = %entry
%call = call i32 (...) @f()
store i32 %call, i32* %retval
br label %return
if.end: ; preds = %entry
store i32 1, i32* %retval
br label %return
return: ; preds = %if.end, %if.then
%0 = load i32, i32* %retval
ret i32 %0
}
; CHECK-LABEL: @test5(
define i32 @test5(i32 %x) nounwind uwtable ssp {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%tmp = load i32, i32* %x.addr, align 4
%cmp = icmp slt i32 %tmp, 0
%conv = zext i1 %cmp to i32
%conv1 = sext i32 %conv to i64
%expval = call i64 @llvm.expect.i64(i64 %conv1, i64 0)
%tobool = icmp ne i64 %expval, 0
; CHECK: !prof !1
; CHECK-NOT: @llvm.expect
br i1 %tobool, label %if.then, label %if.end
if.then: ; preds = %entry
%call = call i32 (...) @f()
store i32 %call, i32* %retval
br label %return
if.end: ; preds = %entry
store i32 1, i32* %retval
br label %return
return: ; preds = %if.end, %if.then
%0 = load i32, i32* %retval
ret i32 %0
}
; CHECK-LABEL: @test6(
define i32 @test6(i32 %x) nounwind uwtable ssp {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%tmp = load i32, i32* %x.addr, align 4
%conv = sext i32 %tmp to i64
%expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
; CHECK: !prof !2
; CHECK-NOT: @llvm.expect
switch i64 %expval, label %sw.epilog [
i64 1, label %sw.bb
i64 2, label %sw.bb
]
sw.bb: ; preds = %entry, %entry
store i32 0, i32* %retval
br label %return
sw.epilog: ; preds = %entry
store i32 1, i32* %retval
br label %return
return: ; preds = %sw.epilog, %sw.bb
%0 = load i32, i32* %retval
ret i32 %0
}
; CHECK-LABEL: @test7(
define i32 @test7(i32 %x) nounwind uwtable ssp {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%tmp = load i32, i32* %x.addr, align 4
%conv = sext i32 %tmp to i64
%expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
; CHECK: !prof !3
; CHECK-NOT: @llvm.expect
switch i64 %expval, label %sw.epilog [
i64 2, label %sw.bb
i64 3, label %sw.bb
]
sw.bb: ; preds = %entry, %entry
%tmp1 = load i32, i32* %x.addr, align 4
store i32 %tmp1, i32* %retval
br label %return
sw.epilog: ; preds = %entry
store i32 0, i32* %retval
br label %return
return: ; preds = %sw.epilog, %sw.bb
%0 = load i32, i32* %retval
ret i32 %0
}
; CHECK-LABEL: @test8(
define i32 @test8(i32 %x) nounwind uwtable ssp {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%tmp = load i32, i32* %x.addr, align 4
%cmp = icmp sgt i32 %tmp, 1
%conv = zext i1 %cmp to i32
%expval = call i32 @llvm.expect.i32(i32 %conv, i32 1)
%tobool = icmp ne i32 %expval, 0
; CHECK: !prof !0
; CHECK-NOT: @llvm.expect
br i1 %tobool, label %if.then, label %if.end
if.then: ; preds = %entry
%call = call i32 (...) @f()
store i32 %call, i32* %retval
br label %return
if.end: ; preds = %entry
store i32 1, i32* %retval
br label %return
return: ; preds = %if.end, %if.then
%0 = load i32, i32* %retval
ret i32 %0
}
declare i32 @llvm.expect.i32(i32, i32) nounwind readnone
; CHECK-LABEL: @test9(
define i32 @test9(i32 %x) nounwind uwtable ssp {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%tmp = load i32, i32* %x.addr, align 4
%cmp = icmp sgt i32 %tmp, 1
%expval = call i1 @llvm.expect.i1(i1 %cmp, i1 1)
; CHECK: !prof !0
; CHECK-NOT: @llvm.expect
br i1 %expval, label %if.then, label %if.end
if.then: ; preds = %entry
%call = call i32 (...) @f()
store i32 %call, i32* %retval
br label %return
if.end: ; preds = %entry
store i32 1, i32* %retval
br label %return
return: ; preds = %if.end, %if.then
%0 = load i32, i32* %retval
ret i32 %0
}
declare i1 @llvm.expect.i1(i1, i1) nounwind readnone
; CHECK: !0 = !{!"branch_weights", i32 2000, i32 1}
; CHECK: !1 = !{!"branch_weights", i32 1, i32 2000}
; CHECK: !2 = !{!"branch_weights", i32 1, i32 2000, i32 1}
; CHECK: !3 = !{!"branch_weights", i32 2000, i32 1, i32 1}