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