Home | History | Annotate | Download | only in LowerExpectIntrinsic
      1 ; RUN: opt -lower-expect -strip-dead-prototypes -S -o - < %s | FileCheck %s
      2 
      3 ; CHECK: @test1
      4 define i32 @test1(i32 %x) nounwind uwtable ssp {
      5 entry:
      6   %retval = alloca i32, align 4
      7   %x.addr = alloca i32, align 4
      8   store i32 %x, i32* %x.addr, align 4
      9   %tmp = load i32* %x.addr, align 4
     10   %cmp = icmp sgt i32 %tmp, 1
     11   %conv = zext i1 %cmp to i32
     12   %conv1 = sext i32 %conv to i64
     13   %expval = call i64 @llvm.expect.i64(i64 %conv1, i64 1)
     14   %tobool = icmp ne i64 %expval, 0
     15 ; CHECK: !prof !0
     16 ; CHECK-NOT: @llvm.expect
     17   br i1 %tobool, label %if.then, label %if.end
     18 
     19 if.then:                                          ; preds = %entry
     20   %call = call i32 (...)* @f()
     21   store i32 %call, i32* %retval
     22   br label %return
     23 
     24 if.end:                                           ; preds = %entry
     25   store i32 1, i32* %retval
     26   br label %return
     27 
     28 return:                                           ; preds = %if.end, %if.then
     29   %0 = load i32* %retval
     30   ret i32 %0
     31 }
     32 
     33 declare i64 @llvm.expect.i64(i64, i64) nounwind readnone
     34 
     35 declare i32 @f(...)
     36 
     37 ; CHECK: @test2
     38 define i32 @test2(i32 %x) nounwind uwtable ssp {
     39 entry:
     40   %retval = alloca i32, align 4
     41   %x.addr = alloca i32, align 4
     42   store i32 %x, i32* %x.addr, align 4
     43   %tmp = load i32* %x.addr, align 4
     44   %conv = sext i32 %tmp to i64
     45   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
     46   %tobool = icmp ne i64 %expval, 0
     47 ; CHECK: !prof !0
     48 ; CHECK-NOT: @llvm.expect
     49   br i1 %tobool, label %if.then, label %if.end
     50 
     51 if.then:                                          ; preds = %entry
     52   %call = call i32 (...)* @f()
     53   store i32 %call, i32* %retval
     54   br label %return
     55 
     56 if.end:                                           ; preds = %entry
     57   store i32 1, i32* %retval
     58   br label %return
     59 
     60 return:                                           ; preds = %if.end, %if.then
     61   %0 = load i32* %retval
     62   ret i32 %0
     63 }
     64 
     65 ; CHECK: @test3
     66 define i32 @test3(i32 %x) nounwind uwtable ssp {
     67 entry:
     68   %retval = alloca i32, align 4
     69   %x.addr = alloca i32, align 4
     70   store i32 %x, i32* %x.addr, align 4
     71   %tmp = load i32* %x.addr, align 4
     72   %tobool = icmp ne i32 %tmp, 0
     73   %lnot = xor i1 %tobool, true
     74   %lnot.ext = zext i1 %lnot to i32
     75   %conv = sext i32 %lnot.ext to i64
     76   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
     77   %tobool1 = icmp ne i64 %expval, 0
     78 ; CHECK: !prof !0
     79 ; CHECK-NOT: @llvm.expect
     80   br i1 %tobool1, label %if.then, label %if.end
     81 
     82 if.then:                                          ; preds = %entry
     83   %call = call i32 (...)* @f()
     84   store i32 %call, i32* %retval
     85   br label %return
     86 
     87 if.end:                                           ; preds = %entry
     88   store i32 1, i32* %retval
     89   br label %return
     90 
     91 return:                                           ; preds = %if.end, %if.then
     92   %0 = load i32* %retval
     93   ret i32 %0
     94 }
     95 
     96 ; CHECK: @test4
     97 define i32 @test4(i32 %x) nounwind uwtable ssp {
     98 entry:
     99   %retval = alloca i32, align 4
    100   %x.addr = alloca i32, align 4
    101   store i32 %x, i32* %x.addr, align 4
    102   %tmp = load i32* %x.addr, align 4
    103   %tobool = icmp ne i32 %tmp, 0
    104   %lnot = xor i1 %tobool, true
    105   %lnot1 = xor i1 %lnot, true
    106   %lnot.ext = zext i1 %lnot1 to i32
    107   %conv = sext i32 %lnot.ext to i64
    108   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
    109   %tobool2 = icmp ne i64 %expval, 0
    110 ; CHECK: !prof !0
    111 ; CHECK-NOT: @llvm.expect
    112   br i1 %tobool2, label %if.then, label %if.end
    113 
    114 if.then:                                          ; preds = %entry
    115   %call = call i32 (...)* @f()
    116   store i32 %call, i32* %retval
    117   br label %return
    118 
    119 if.end:                                           ; preds = %entry
    120   store i32 1, i32* %retval
    121   br label %return
    122 
    123 return:                                           ; preds = %if.end, %if.then
    124   %0 = load i32* %retval
    125   ret i32 %0
    126 }
    127 
    128 ; CHECK: @test5
    129 define i32 @test5(i32 %x) nounwind uwtable ssp {
    130 entry:
    131   %retval = alloca i32, align 4
    132   %x.addr = alloca i32, align 4
    133   store i32 %x, i32* %x.addr, align 4
    134   %tmp = load i32* %x.addr, align 4
    135   %cmp = icmp slt i32 %tmp, 0
    136   %conv = zext i1 %cmp to i32
    137   %conv1 = sext i32 %conv to i64
    138   %expval = call i64 @llvm.expect.i64(i64 %conv1, i64 0)
    139   %tobool = icmp ne i64 %expval, 0
    140 ; CHECK: !prof !1
    141 ; CHECK-NOT: @llvm.expect
    142   br i1 %tobool, label %if.then, label %if.end
    143 
    144 if.then:                                          ; preds = %entry
    145   %call = call i32 (...)* @f()
    146   store i32 %call, i32* %retval
    147   br label %return
    148 
    149 if.end:                                           ; preds = %entry
    150   store i32 1, i32* %retval
    151   br label %return
    152 
    153 return:                                           ; preds = %if.end, %if.then
    154   %0 = load i32* %retval
    155   ret i32 %0
    156 }
    157 
    158 ; CHECK: @test6
    159 define i32 @test6(i32 %x) nounwind uwtable ssp {
    160 entry:
    161   %retval = alloca i32, align 4
    162   %x.addr = alloca i32, align 4
    163   store i32 %x, i32* %x.addr, align 4
    164   %tmp = load i32* %x.addr, align 4
    165   %conv = sext i32 %tmp to i64
    166   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
    167 ; CHECK: !prof !2
    168 ; CHECK-NOT: @llvm.expect
    169   switch i64 %expval, label %sw.epilog [
    170     i64 1, label %sw.bb
    171     i64 2, label %sw.bb
    172   ]
    173 
    174 sw.bb:                                            ; preds = %entry, %entry
    175   store i32 0, i32* %retval
    176   br label %return
    177 
    178 sw.epilog:                                        ; preds = %entry
    179   store i32 1, i32* %retval
    180   br label %return
    181 
    182 return:                                           ; preds = %sw.epilog, %sw.bb
    183   %0 = load i32* %retval
    184   ret i32 %0
    185 }
    186 
    187 ; CHECK: @test7
    188 define i32 @test7(i32 %x) nounwind uwtable ssp {
    189 entry:
    190   %retval = alloca i32, align 4
    191   %x.addr = alloca i32, align 4
    192   store i32 %x, i32* %x.addr, align 4
    193   %tmp = load i32* %x.addr, align 4
    194   %conv = sext i32 %tmp to i64
    195   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
    196 ; CHECK: !prof !3
    197 ; CHECK-NOT: @llvm.expect
    198   switch i64 %expval, label %sw.epilog [
    199     i64 2, label %sw.bb
    200     i64 3, label %sw.bb
    201   ]
    202 
    203 sw.bb:                                            ; preds = %entry, %entry
    204   %tmp1 = load i32* %x.addr, align 4
    205   store i32 %tmp1, i32* %retval
    206   br label %return
    207 
    208 sw.epilog:                                        ; preds = %entry
    209   store i32 0, i32* %retval
    210   br label %return
    211 
    212 return:                                           ; preds = %sw.epilog, %sw.bb
    213   %0 = load i32* %retval
    214   ret i32 %0
    215 }
    216 
    217 ; CHECK: @test8
    218 define i32 @test8(i32 %x) nounwind uwtable ssp {
    219 entry:
    220   %retval = alloca i32, align 4
    221   %x.addr = alloca i32, align 4
    222   store i32 %x, i32* %x.addr, align 4
    223   %tmp = load i32* %x.addr, align 4
    224   %cmp = icmp sgt i32 %tmp, 1
    225   %conv = zext i1 %cmp to i32
    226   %expval = call i32 @llvm.expect.i32(i32 %conv, i32 1)
    227   %tobool = icmp ne i32 %expval, 0
    228 ; CHECK: !prof !0
    229 ; CHECK-NOT: @llvm.expect
    230   br i1 %tobool, label %if.then, label %if.end
    231 
    232 if.then:                                          ; preds = %entry
    233   %call = call i32 (...)* @f()
    234   store i32 %call, i32* %retval
    235   br label %return
    236 
    237 if.end:                                           ; preds = %entry
    238   store i32 1, i32* %retval
    239   br label %return
    240 
    241 return:                                           ; preds = %if.end, %if.then
    242   %0 = load i32* %retval
    243   ret i32 %0
    244 }
    245 
    246 declare i32 @llvm.expect.i32(i32, i32) nounwind readnone
    247 
    248 ; CHECK: !0 = metadata !{metadata !"branch_weights", i32 64, i32 4}
    249 ; CHECK: !1 = metadata !{metadata !"branch_weights", i32 4, i32 64}
    250 ; CHECK: !2 = metadata !{metadata !"branch_weights", i32 4, i32 64, i32 4}
    251 ; CHECK: !3 = metadata !{metadata !"branch_weights", i32 64, i32 4, i32 4}
    252