xref: /llvm-project/llvm/test/Transforms/LowerExpectIntrinsic/expect-with-probability.ll (revision 294f3ce5dde916c358d8f672b4a1c706c0387154)
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