Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / branch-cond-dont-merge.ll
blob0f540007b242e29a403ce7e9719f4675057fe956
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=simplifycfg -S | FileCheck %s
4 declare void @bar()
5 declare i1 @uniform_result(i1 %c)
7 define void @dont_merge_cbranches1(i32 %V) {
8 ; CHECK-LABEL: @dont_merge_cbranches1(
9 ; CHECK-NEXT:    [[DIVERGENT_COND:%.*]] = icmp ne i32 [[V:%.*]], 0
10 ; CHECK-NEXT:    [[UNIFORM_COND:%.*]] = call i1 @uniform_result(i1 [[DIVERGENT_COND]])
11 ; CHECK-NEXT:    br i1 [[UNIFORM_COND]], label [[BB2:%.*]], label [[EXIT:%.*]], !prof [[PROF0:![0-9]+]]
12 ; CHECK:       bb2:
13 ; CHECK-NEXT:    br i1 [[DIVERGENT_COND]], label [[BB3:%.*]], label [[EXIT]]
14 ; CHECK:       bb3:
15 ; CHECK-NEXT:    call void @bar()
16 ; CHECK-NEXT:    br label [[EXIT]]
17 ; CHECK:       exit:
18 ; CHECK-NEXT:    ret void
20   %divergent_cond = icmp ne i32 %V, 0
21   %uniform_cond = call i1 @uniform_result(i1 %divergent_cond)
22   br i1 %uniform_cond, label %bb2, label %exit, !prof !0
23 bb2:
24   br i1 %divergent_cond, label %bb3, label %exit
25 bb3:
26   call void @bar( )
27   br label %exit
28 exit:
29   ret void
32 define void @dont_merge_cbranches2(i32 %V) {
33 ; CHECK-LABEL: @dont_merge_cbranches2(
34 ; CHECK-NEXT:    [[DIVERGENT_COND:%.*]] = icmp ne i32 [[V:%.*]], 0
35 ; CHECK-NEXT:    [[UNIFORM_COND:%.*]] = call i1 @uniform_result(i1 [[DIVERGENT_COND]])
36 ; CHECK-NEXT:    br i1 [[UNIFORM_COND]], label [[EXIT:%.*]], label [[BB2:%.*]], !prof [[PROF1:![0-9]+]]
37 ; CHECK:       bb2:
38 ; CHECK-NEXT:    br i1 [[DIVERGENT_COND]], label [[BB3:%.*]], label [[EXIT]]
39 ; CHECK:       bb3:
40 ; CHECK-NEXT:    call void @bar()
41 ; CHECK-NEXT:    br label [[EXIT]]
42 ; CHECK:       exit:
43 ; CHECK-NEXT:    ret void
45   %divergent_cond = icmp ne i32 %V, 0
46   %uniform_cond = call i1 @uniform_result(i1 %divergent_cond)
47   br i1 %uniform_cond, label %exit, label %bb2, !prof !1
48 bb2:
49   br i1 %divergent_cond, label %bb3, label %exit
50 bb3:
51   call void @bar( )
52   br label %exit
53 exit:
54   ret void
57 define void @merge_cbranches(i32 %V) {
58 ; CHECK-LABEL: @merge_cbranches(
59 ; CHECK-NEXT:    [[DIVERGENT_COND:%.*]] = icmp ne i32 [[V:%.*]], 0
60 ; CHECK-NEXT:    [[UNIFORM_COND:%.*]] = call i1 @uniform_result(i1 [[DIVERGENT_COND]])
61 ; CHECK-NEXT:    [[DIVERGENT_COND_NOT:%.*]] = xor i1 [[DIVERGENT_COND]], true
62 ; CHECK-NEXT:    [[BRMERGE:%.*]] = select i1 [[UNIFORM_COND]], i1 true, i1 [[DIVERGENT_COND_NOT]]
63 ; CHECK-NEXT:    br i1 [[BRMERGE]], label [[EXIT:%.*]], label [[BB3:%.*]], !prof [[PROF2:![0-9]+]]
64 ; CHECK:       bb3:
65 ; CHECK-NEXT:    call void @bar()
66 ; CHECK-NEXT:    br label [[EXIT]]
67 ; CHECK:       exit:
68 ; CHECK-NEXT:    ret void
70   %divergent_cond = icmp ne i32 %V, 0
71   %uniform_cond = call i1 @uniform_result(i1 %divergent_cond)
72   br i1 %uniform_cond, label %exit, label %bb2, !prof !2
73 bb2:
74   br i1 %divergent_cond, label %bb3, label %exit
75 bb3:
76   call void @bar( )
77   br label %exit
78 exit:
79   ret void
82 define void @uint32_overflow_test(i1 %arg, i1 %arg1) {
83 ; CHECK-LABEL: @uint32_overflow_test(
84 ; CHECK-NEXT:  bb:
85 ; CHECK-NEXT:    [[BRMERGE:%.*]] = select i1 [[ARG:%.*]], i1 true, i1 [[ARG1:%.*]]
86 ; CHECK-NEXT:    ret void
88 bb:
89   br i1 %arg, label %bb4, label %bb2, !prof !3
91 bb2:
92   br i1 %arg1, label %bb4, label %bb3
94 bb3:
95   br label %bb4
97 bb4:
98   ret void
101 !0 = !{!"branch_weights", i32 1, i32 1000}
102 !1 = !{!"branch_weights", i32 1000, i32 1}
103 !2 = !{!"branch_weights", i32 3, i32 2}
104 !3 = !{!"branch_weights", i32 -258677585, i32 -1212131848}