137fb8603SZhi Zhuang; RUN: opt -S -passes='function(lower-expect),strip-dead-prototypes' < %s | FileCheck %s 237fb8603SZhi Zhuang 337fb8603SZhi Zhuang; CHECK-LABEL: @test1( 437fb8603SZhi Zhuangdefine i32 @test1(i32 %x) nounwind uwtable ssp { 537fb8603SZhi Zhuangentry: 637fb8603SZhi Zhuang %retval = alloca i32, align 4 737fb8603SZhi Zhuang %x.addr = alloca i32, align 4 847f25462SMatt Arsenault store i32 %x, ptr %x.addr, align 4 947f25462SMatt Arsenault %tmp = load i32, ptr %x.addr, align 4 1037fb8603SZhi Zhuang %cmp = icmp sgt i32 %tmp, 1 1137fb8603SZhi Zhuang %conv = zext i1 %cmp to i32 1237fb8603SZhi Zhuang %conv1 = sext i32 %conv to i64 1337fb8603SZhi Zhuang %expval = call i64 @llvm.expect.with.probability.i64(i64 %conv1, i64 1, double 8.000000e-01) 1437fb8603SZhi Zhuang %tobool = icmp ne i64 %expval, 0 156861d938SRoman Lebedev; CHECK: !prof !0 1637fb8603SZhi Zhuang; CHECK-NOT: @llvm.expect.with.probability 1737fb8603SZhi Zhuang br i1 %tobool, label %if.then, label %if.end 1837fb8603SZhi Zhuang 1937fb8603SZhi Zhuangif.then: ; preds = %entry 2037fb8603SZhi Zhuang %call = call i32 (...) @f() 2147f25462SMatt Arsenault store i32 %call, ptr %retval 2237fb8603SZhi Zhuang br label %return 2337fb8603SZhi Zhuang 2437fb8603SZhi Zhuangif.end: ; preds = %entry 2547f25462SMatt Arsenault store i32 1, ptr %retval 2637fb8603SZhi Zhuang br label %return 2737fb8603SZhi Zhuang 2837fb8603SZhi Zhuangreturn: ; preds = %if.end, %if.then 2947f25462SMatt Arsenault %0 = load i32, ptr %retval 3037fb8603SZhi Zhuang ret i32 %0 3137fb8603SZhi Zhuang} 3237fb8603SZhi Zhuang 3337fb8603SZhi Zhuangdeclare i64 @llvm.expect.with.probability.i64(i64, i64, double) nounwind readnone 3437fb8603SZhi Zhuang 3537fb8603SZhi Zhuangdeclare i32 @f(...) 3637fb8603SZhi Zhuang 3737fb8603SZhi Zhuang; CHECK-LABEL: @test2( 3837fb8603SZhi Zhuangdefine i32 @test2(i32 %x) nounwind uwtable ssp { 3937fb8603SZhi Zhuangentry: 4037fb8603SZhi Zhuang %retval = alloca i32, align 4 4137fb8603SZhi Zhuang %x.addr = alloca i32, align 4 4247f25462SMatt Arsenault store i32 %x, ptr %x.addr, align 4 4347f25462SMatt Arsenault %tmp = load i32, ptr %x.addr, align 4 4437fb8603SZhi Zhuang %conv = sext i32 %tmp to i64 4537fb8603SZhi Zhuang %expval = call i64 @llvm.expect.with.probability.i64(i64 %conv, i64 1, double 8.000000e-01) 4637fb8603SZhi Zhuang %tobool = icmp ne i64 %expval, 0 476861d938SRoman Lebedev; CHECK: !prof !0 4837fb8603SZhi Zhuang; CHECK-NOT: @llvm.expect.with.probability 4937fb8603SZhi Zhuang br i1 %tobool, label %if.then, label %if.end 5037fb8603SZhi Zhuang 5137fb8603SZhi Zhuangif.then: ; preds = %entry 5237fb8603SZhi Zhuang %call = call i32 (...) @f() 5347f25462SMatt Arsenault store i32 %call, ptr %retval 5437fb8603SZhi Zhuang br label %return 5537fb8603SZhi Zhuang 5637fb8603SZhi Zhuangif.end: ; preds = %entry 5747f25462SMatt Arsenault store i32 1, ptr %retval 5837fb8603SZhi Zhuang br label %return 5937fb8603SZhi Zhuang 6037fb8603SZhi Zhuangreturn: ; preds = %if.end, %if.then 6147f25462SMatt Arsenault %0 = load i32, ptr %retval 6237fb8603SZhi Zhuang ret i32 %0 6337fb8603SZhi Zhuang} 6437fb8603SZhi Zhuang 6537fb8603SZhi Zhuang; CHECK-LABEL: @test3( 6637fb8603SZhi Zhuangdefine i32 @test3(i32 %x) nounwind uwtable ssp { 6737fb8603SZhi Zhuangentry: 6837fb8603SZhi Zhuang %retval = alloca i32, align 4 6937fb8603SZhi Zhuang %x.addr = alloca i32, align 4 7047f25462SMatt Arsenault store i32 %x, ptr %x.addr, align 4 7147f25462SMatt Arsenault %tmp = load i32, ptr %x.addr, align 4 7237fb8603SZhi Zhuang %tobool = icmp ne i32 %tmp, 0 7337fb8603SZhi Zhuang %lnot = xor i1 %tobool, true 7437fb8603SZhi Zhuang %lnot.ext = zext i1 %lnot to i32 7537fb8603SZhi Zhuang %conv = sext i32 %lnot.ext to i64 7637fb8603SZhi Zhuang %expval = call i64 @llvm.expect.with.probability.i64(i64 %conv, i64 1, double 8.000000e-01) 7737fb8603SZhi Zhuang %tobool1 = icmp ne i64 %expval, 0 786861d938SRoman Lebedev; CHECK: !prof !0 7937fb8603SZhi Zhuang; CHECK-NOT: @llvm.expect.with.probability 8037fb8603SZhi Zhuang br i1 %tobool1, label %if.then, label %if.end 8137fb8603SZhi Zhuang 8237fb8603SZhi Zhuangif.then: ; preds = %entry 8337fb8603SZhi Zhuang %call = call i32 (...) @f() 8447f25462SMatt Arsenault store i32 %call, ptr %retval 8537fb8603SZhi Zhuang br label %return 8637fb8603SZhi Zhuang 8737fb8603SZhi Zhuangif.end: ; preds = %entry 8847f25462SMatt Arsenault store i32 1, ptr %retval 8937fb8603SZhi Zhuang br label %return 9037fb8603SZhi Zhuang 9137fb8603SZhi Zhuangreturn: ; preds = %if.end, %if.then 9247f25462SMatt Arsenault %0 = load i32, ptr %retval 9337fb8603SZhi Zhuang ret i32 %0 9437fb8603SZhi Zhuang} 9537fb8603SZhi Zhuang 9637fb8603SZhi Zhuang; CHECK-LABEL: @test4( 9737fb8603SZhi Zhuangdefine i32 @test4(i32 %x) nounwind uwtable ssp { 9837fb8603SZhi Zhuangentry: 9937fb8603SZhi Zhuang %retval = alloca i32, align 4 10037fb8603SZhi Zhuang %x.addr = alloca i32, align 4 10147f25462SMatt Arsenault store i32 %x, ptr %x.addr, align 4 10247f25462SMatt Arsenault %tmp = load i32, ptr %x.addr, align 4 10337fb8603SZhi Zhuang %tobool = icmp ne i32 %tmp, 0 10437fb8603SZhi Zhuang %lnot = xor i1 %tobool, true 10537fb8603SZhi Zhuang %lnot1 = xor i1 %lnot, true 10637fb8603SZhi Zhuang %lnot.ext = zext i1 %lnot1 to i32 10737fb8603SZhi Zhuang %conv = sext i32 %lnot.ext to i64 10837fb8603SZhi Zhuang %expval = call i64 @llvm.expect.with.probability.i64(i64 %conv, i64 1, double 8.000000e-01) 10937fb8603SZhi Zhuang %tobool2 = icmp ne i64 %expval, 0 1106861d938SRoman Lebedev; CHECK: !prof !0 11137fb8603SZhi Zhuang; CHECK-NOT: @llvm.expect.with.probability 11237fb8603SZhi Zhuang br i1 %tobool2, label %if.then, label %if.end 11337fb8603SZhi Zhuang 11437fb8603SZhi Zhuangif.then: ; preds = %entry 11537fb8603SZhi Zhuang %call = call i32 (...) @f() 11647f25462SMatt Arsenault store i32 %call, ptr %retval 11737fb8603SZhi Zhuang br label %return 11837fb8603SZhi Zhuang 11937fb8603SZhi Zhuangif.end: ; preds = %entry 12047f25462SMatt Arsenault store i32 1, ptr %retval 12137fb8603SZhi Zhuang br label %return 12237fb8603SZhi Zhuang 12337fb8603SZhi Zhuangreturn: ; preds = %if.end, %if.then 12447f25462SMatt Arsenault %0 = load i32, ptr %retval 12537fb8603SZhi Zhuang ret i32 %0 12637fb8603SZhi Zhuang} 12737fb8603SZhi Zhuang 12837fb8603SZhi Zhuang; CHECK-LABEL: @test5( 12937fb8603SZhi Zhuangdefine i32 @test5(i32 %x) nounwind uwtable ssp { 13037fb8603SZhi Zhuangentry: 13137fb8603SZhi Zhuang %retval = alloca i32, align 4 13237fb8603SZhi Zhuang %x.addr = alloca i32, align 4 13347f25462SMatt Arsenault store i32 %x, ptr %x.addr, align 4 13447f25462SMatt Arsenault %tmp = load i32, ptr %x.addr, align 4 13537fb8603SZhi Zhuang %cmp = icmp slt i32 %tmp, 0 13637fb8603SZhi Zhuang %conv = zext i1 %cmp to i32 13737fb8603SZhi Zhuang %conv1 = sext i32 %conv to i64 13837fb8603SZhi Zhuang %expval = call i64 @llvm.expect.with.probability.i64(i64 %conv1, i64 0, double 8.000000e-01) 13937fb8603SZhi Zhuang %tobool = icmp ne i64 %expval, 0 1406861d938SRoman Lebedev; CHECK: !prof !1 14137fb8603SZhi Zhuang; CHECK-NOT: @llvm.expect.with.probability 14237fb8603SZhi Zhuang br i1 %tobool, label %if.then, label %if.end 14337fb8603SZhi Zhuang 14437fb8603SZhi Zhuangif.then: ; preds = %entry 14537fb8603SZhi Zhuang %call = call i32 (...) @f() 14647f25462SMatt Arsenault store i32 %call, ptr %retval 14737fb8603SZhi Zhuang br label %return 14837fb8603SZhi Zhuang 14937fb8603SZhi Zhuangif.end: ; preds = %entry 15047f25462SMatt Arsenault store i32 1, ptr %retval 15137fb8603SZhi Zhuang br label %return 15237fb8603SZhi Zhuang 15337fb8603SZhi Zhuangreturn: ; preds = %if.end, %if.then 15447f25462SMatt Arsenault %0 = load i32, ptr %retval 15537fb8603SZhi Zhuang ret i32 %0 15637fb8603SZhi Zhuang} 15737fb8603SZhi Zhuang 15837fb8603SZhi Zhuang; CHECK-LABEL: @test6( 15937fb8603SZhi Zhuangdefine i32 @test6(i32 %x) nounwind uwtable ssp { 16037fb8603SZhi Zhuangentry: 16137fb8603SZhi Zhuang %retval = alloca i32, align 4 16237fb8603SZhi Zhuang %x.addr = alloca i32, align 4 16347f25462SMatt Arsenault store i32 %x, ptr %x.addr, align 4 16447f25462SMatt Arsenault %tmp = load i32, ptr %x.addr, align 4 16537fb8603SZhi Zhuang %conv = sext i32 %tmp to i64 16637fb8603SZhi Zhuang %expval = call i64 @llvm.expect.with.probability.i64(i64 %conv, i64 2, double 8.000000e-01) 1676861d938SRoman Lebedev; CHECK: !prof !2 16837fb8603SZhi Zhuang; CHECK-NOT: @llvm.expect.with.probability 16937fb8603SZhi Zhuang switch i64 %expval, label %sw.epilog [ 17037fb8603SZhi Zhuang i64 1, label %sw.bb 17137fb8603SZhi Zhuang i64 2, label %sw.bb 17237fb8603SZhi Zhuang ] 17337fb8603SZhi Zhuang 17437fb8603SZhi Zhuangsw.bb: ; preds = %entry, %entry 17547f25462SMatt Arsenault store i32 0, ptr %retval 17637fb8603SZhi Zhuang br label %return 17737fb8603SZhi Zhuang 17837fb8603SZhi Zhuangsw.epilog: ; preds = %entry 17947f25462SMatt Arsenault store i32 1, ptr %retval 18037fb8603SZhi Zhuang br label %return 18137fb8603SZhi Zhuang 18237fb8603SZhi Zhuangreturn: ; preds = %sw.epilog, %sw.bb 18347f25462SMatt Arsenault %0 = load i32, ptr %retval 18437fb8603SZhi Zhuang ret i32 %0 18537fb8603SZhi Zhuang} 18637fb8603SZhi Zhuang 18737fb8603SZhi Zhuang; CHECK-LABEL: @test7( 18837fb8603SZhi Zhuangdefine i32 @test7(i32 %x) nounwind uwtable ssp { 18937fb8603SZhi Zhuangentry: 19037fb8603SZhi Zhuang %retval = alloca i32, align 4 19137fb8603SZhi Zhuang %x.addr = alloca i32, align 4 19247f25462SMatt Arsenault store i32 %x, ptr %x.addr, align 4 19347f25462SMatt Arsenault %tmp = load i32, ptr %x.addr, align 4 19437fb8603SZhi Zhuang %conv = sext i32 %tmp to i64 19537fb8603SZhi Zhuang %expval = call i64 @llvm.expect.with.probability.i64(i64 %conv, i64 1, double 8.000000e-01) 1966861d938SRoman Lebedev; CHECK: !prof !3 19737fb8603SZhi Zhuang; CHECK-NOT: @llvm.expect.with.probability 19837fb8603SZhi Zhuang switch i64 %expval, label %sw.epilog [ 19937fb8603SZhi Zhuang i64 2, label %sw.bb 20037fb8603SZhi Zhuang i64 3, label %sw.bb 20137fb8603SZhi Zhuang ] 20237fb8603SZhi Zhuang 20337fb8603SZhi Zhuangsw.bb: ; preds = %entry, %entry 20447f25462SMatt Arsenault %tmp1 = load i32, ptr %x.addr, align 4 20547f25462SMatt Arsenault store i32 %tmp1, ptr %retval 20637fb8603SZhi Zhuang br label %return 20737fb8603SZhi Zhuang 20837fb8603SZhi Zhuangsw.epilog: ; preds = %entry 20947f25462SMatt Arsenault store i32 0, ptr %retval 21037fb8603SZhi Zhuang br label %return 21137fb8603SZhi Zhuang 21237fb8603SZhi Zhuangreturn: ; preds = %sw.epilog, %sw.bb 21347f25462SMatt Arsenault %0 = load i32, ptr %retval 21437fb8603SZhi Zhuang ret i32 %0 21537fb8603SZhi Zhuang} 21637fb8603SZhi Zhuang 21737fb8603SZhi Zhuang; CHECK-LABEL: @test8( 21837fb8603SZhi Zhuangdefine i32 @test8(i32 %x) nounwind uwtable ssp { 21937fb8603SZhi Zhuangentry: 22037fb8603SZhi Zhuang %retval = alloca i32, align 4 22137fb8603SZhi Zhuang %x.addr = alloca i32, align 4 22247f25462SMatt Arsenault store i32 %x, ptr %x.addr, align 4 22347f25462SMatt Arsenault %tmp = load i32, ptr %x.addr, align 4 22437fb8603SZhi Zhuang %cmp = icmp sgt i32 %tmp, 1 22537fb8603SZhi Zhuang %conv = zext i1 %cmp to i32 22637fb8603SZhi Zhuang %expval = call i32 @llvm.expect.with.probability.i32(i32 %conv, i32 1, double 8.000000e-01) 22737fb8603SZhi Zhuang %tobool = icmp ne i32 %expval, 0 2286861d938SRoman Lebedev; CHECK: !prof !0 22937fb8603SZhi Zhuang; CHECK-NOT: @llvm.expect.with.probability 23037fb8603SZhi Zhuang br i1 %tobool, label %if.then, label %if.end 23137fb8603SZhi Zhuang 23237fb8603SZhi Zhuangif.then: ; preds = %entry 23337fb8603SZhi Zhuang %call = call i32 (...) @f() 23447f25462SMatt Arsenault store i32 %call, ptr %retval 23537fb8603SZhi Zhuang br label %return 23637fb8603SZhi Zhuang 23737fb8603SZhi Zhuangif.end: ; preds = %entry 23847f25462SMatt Arsenault store i32 1, ptr %retval 23937fb8603SZhi Zhuang br label %return 24037fb8603SZhi Zhuang 24137fb8603SZhi Zhuangreturn: ; preds = %if.end, %if.then 24247f25462SMatt Arsenault %0 = load i32, ptr %retval 24337fb8603SZhi Zhuang ret i32 %0 24437fb8603SZhi Zhuang} 24537fb8603SZhi Zhuang 24637fb8603SZhi Zhuangdeclare i32 @llvm.expect.with.probability.i32(i32, i32, double) nounwind readnone 24737fb8603SZhi Zhuang 24837fb8603SZhi Zhuang; CHECK-LABEL: @test9( 24937fb8603SZhi Zhuangdefine i32 @test9(i32 %x) nounwind uwtable ssp { 25037fb8603SZhi Zhuangentry: 25137fb8603SZhi Zhuang %retval = alloca i32, align 4 25237fb8603SZhi Zhuang %x.addr = alloca i32, align 4 25347f25462SMatt Arsenault store i32 %x, ptr %x.addr, align 4 25447f25462SMatt Arsenault %tmp = load i32, ptr %x.addr, align 4 25537fb8603SZhi Zhuang %cmp = icmp sgt i32 %tmp, 1 25637fb8603SZhi Zhuang %expval = call i1 @llvm.expect.with.probability.i1(i1 %cmp, i1 1, double 8.000000e-01) 2576861d938SRoman Lebedev; CHECK: !prof !0 25837fb8603SZhi Zhuang; CHECK-NOT: @llvm.expect.with.probability 25937fb8603SZhi Zhuang br i1 %expval, label %if.then, label %if.end 26037fb8603SZhi Zhuang 26137fb8603SZhi Zhuangif.then: ; preds = %entry 26237fb8603SZhi Zhuang %call = call i32 (...) @f() 26347f25462SMatt Arsenault store i32 %call, ptr %retval 26437fb8603SZhi Zhuang br label %return 26537fb8603SZhi Zhuang 26637fb8603SZhi Zhuangif.end: ; preds = %entry 26747f25462SMatt Arsenault store i32 1, ptr %retval 26837fb8603SZhi Zhuang br label %return 26937fb8603SZhi Zhuang 27037fb8603SZhi Zhuangreturn: ; preds = %if.end, %if.then 27147f25462SMatt Arsenault %0 = load i32, ptr %retval 27237fb8603SZhi Zhuang ret i32 %0 27337fb8603SZhi Zhuang} 27437fb8603SZhi Zhuang 27537fb8603SZhi Zhuang; CHECK-LABEL: @test10( 27637fb8603SZhi Zhuangdefine i32 @test10(i64 %t6) { 27737fb8603SZhi Zhuang %t7 = call i64 @llvm.expect.with.probability.i64(i64 %t6, i64 0, double 8.000000e-01) 27837fb8603SZhi Zhuang %t8 = icmp ne i64 %t7, 0 27937fb8603SZhi Zhuang %t9 = select i1 %t8, i32 1, i32 2 2806861d938SRoman Lebedev; CHECK: select{{.*}}, !prof !1 28137fb8603SZhi Zhuang ret i32 %t9 28237fb8603SZhi Zhuang} 28337fb8603SZhi Zhuang 28437fb8603SZhi Zhuang 28537fb8603SZhi Zhuangdeclare i1 @llvm.expect.with.probability.i1(i1, i1, double) nounwind readnone 28637fb8603SZhi Zhuang 287*294f3ce5SPaul Kirth; CHECK: !0 = !{!"branch_weights", !"expected", i32 1717986918, i32 429496731} 288*294f3ce5SPaul Kirth; CHECK: !1 = !{!"branch_weights", !"expected", i32 429496731, i32 1717986918} 289*294f3ce5SPaul Kirth; CHECK: !2 = !{!"branch_weights", !"expected", i32 214748366, i32 214748366, i32 1717986918} 290*294f3ce5SPaul Kirth; CHECK: !3 = !{!"branch_weights", !"expected", i32 1717986918, i32 214748366, i32 214748366} 291