1 ; RUN: opt -flattencfg -S < %s -enable-new-pm=0 | FileCheck %s
2 ; RUN: opt -passes=flattencfg -S < %s | FileCheck %s
5 ; This test checks whether the pass completes without a crash.
6 ; The code is not transformed in any way
8 ; CHECK-LABEL: @test_not_crash
9 define void @test_not_crash(i32 %in_a) #0 {
11 %cmp0 = icmp eq i32 %in_a, -1
12 %cmp1 = icmp ne i32 %in_a, 0
13 %cond0 = and i1 %cmp0, %cmp1
14 br i1 %cond0, label %b0, label %b1
17 %cmp2 = icmp eq i32 %in_a, 0
18 %cmp3 = icmp ne i32 %in_a, 1
19 %cond1 = or i1 %cmp2, %cmp3
20 br i1 %cond1, label %exit, label %b1
22 b1: ; preds = %entry, %b0
25 exit: ; preds = %entry, %b0, %b1
29 ; CHECK-LABEL: @test_not_crash2
31 ; CHECK-NEXT: %0 = fcmp ult float %a
32 ; CHECK-NEXT: %1 = fcmp ult float %b
33 ; CHECK-NEXT: [[COND:%[a-z0-9]+]] = and i1 %0, %1
34 ; CHECK-NEXT: br i1 [[COND]], label %bb4, label %bb3
36 ; CHECK-NEXT: br label %bb4
38 ; CHECK-NEXT: ret void
39 define void @test_not_crash2(float %a, float %b) #0 {
41 %0 = fcmp ult float %a, 1.000000e+00
42 br i1 %0, label %bb0, label %bb1
47 bb4: ; preds = %bb0, %bb3
53 bb0: ; preds = %bb1, %entry
54 %1 = fcmp ult float %b, 1.000000e+00
55 br i1 %1, label %bb4, label %bb3
58 ; CHECK-LABEL: @test_not_crash3
60 ; CHECK-NEXT: %a_eq_0 = icmp eq i32 %a, 0
61 ; CHECK-NEXT: %a_eq_1 = icmp eq i32 %a, 1
62 ; CHECK-NEXT: [[COND:%[a-z0-9]+]] = or i1 %a_eq_0, %a_eq_1
63 ; CHECK-NEXT: br i1 [[COND]], label %bb2, label %bb3
65 ; CHECK-NEXT: br label %bb3
67 ; CHECK-NEXT: %check_badref = phi i32 [ 17, %entry ], [ 11, %bb2 ]
68 ; CHECK-NEXT: ret void
69 define void @test_not_crash3(i32 %a) #0 {
71 %a_eq_0 = icmp eq i32 %a, 0
72 br i1 %a_eq_0, label %bb0, label %bb1
77 bb1: ; preds = %bb0, %entry
78 %a_eq_1 = icmp eq i32 %a, 1
79 br i1 %a_eq_1, label %bb2, label %bb3
84 bb3: ; preds = %bb2, %bb1
85 %check_badref = phi i32 [ 17, %bb1 ], [ 11, %bb2 ]
90 @g = global i32 0, align 4
92 ; CHECK-LABEL: @test_then
93 ; CHECK-NEXT: entry.x:
94 ; CHECK-NEXT: %cmp.x = icmp ne i32 %x, 0
95 ; CHECK-NEXT: %cmp.y = icmp ne i32 %y, 0
96 ; CHECK-NEXT: [[COND:%[a-z0-9]+]] = or i1 %cmp.x, %cmp.y
97 ; CHECK-NEXT: br i1 [[COND]], label %if.then.y, label %exit
99 ; CHECK-NEXT: store i32 %z, i32* @g, align 4
100 ; CHECK-NEXT: br label %exit
102 ; CHECK-NEXT: ret void
103 define void @test_then(i32 %x, i32 %y, i32 %z) {
105 %cmp.x = icmp ne i32 %x, 0
106 br i1 %cmp.x, label %if.then.x, label %entry.y
109 store i32 %z, i32* @g, align 4
113 %cmp.y = icmp ne i32 %y, 0
114 br i1 %cmp.y, label %if.then.y, label %exit
117 store i32 %z, i32* @g, align 4
124 ; CHECK-LABEL: @test_else
125 ; CHECK-NEXT: entry.x:
126 ; CHECK-NEXT: %cmp.x = icmp eq i32 %x, 0
127 ; CHECK-NEXT: %cmp.y = icmp eq i32 %y, 0
128 ; CHECK-NEXT: [[COND:%[a-z0-9]+]] = and i1 %cmp.x, %cmp.y
129 ; CHECK-NEXT: br i1 [[COND]], label %exit, label %if.else.y
131 ; CHECK-NEXT: store i32 %z, i32* @g, align 4
132 ; CHECK-NEXT: br label %exit
134 ; CHECK-NEXT: ret void
135 define void @test_else(i32 %x, i32 %y, i32 %z) {
137 %cmp.x = icmp eq i32 %x, 0
138 br i1 %cmp.x, label %entry.y, label %if.else.x
141 store i32 %z, i32* @g, align 4
145 %cmp.y = icmp eq i32 %y, 0
146 br i1 %cmp.y, label %exit, label %if.else.y
149 store i32 %z, i32* @g, align 4
156 ; CHECK-LABEL: @test_combine_and
157 ; CHECK-NEXT: entry.x:
158 ; CHECK-NEXT: %cmp.x = icmp eq i32 %x, 0
159 ; CHECK-NEXT: %cmp.y = icmp eq i32 %y, 0
160 ; CHECK-NEXT: [[COND:%[a-z0-9]+]] = and i1 %cmp.x, %cmp.y
161 ; CHECK-NEXT: br i1 [[COND]], label %exit, label %if.then.y
163 ; CHECK-NEXT: store i32 %z, i32* @g, align 4
164 ; CHECK-NEXT: br label %exit
166 ; CHECK-NEXT: ret void
167 define void @test_combine_and(i32 %x, i32 %y, i32 %z) {
169 %cmp.x = icmp eq i32 %x, 0
170 br i1 %cmp.x, label %entry.y, label %if.else.x
173 store i32 %z, i32* @g, align 4
177 %cmp.y = icmp ne i32 %y, 0
178 br i1 %cmp.y, label %if.then.y, label %exit
181 store i32 %z, i32* @g, align 4
188 ; CHECK-LABEL: @test_combine_or
189 ; CHECK-NEXT: entry.x:
190 ; CHECK-NEXT: %cmp.x = icmp ne i32 %x, 0
191 ; CHECK-NEXT: %cmp.y = icmp ne i32 %y, 0
192 ; CHECK-NEXT: [[COND:%[a-z0-9]+]] = or i1 %cmp.x, %cmp.y
193 ; CHECK-NEXT: br i1 [[COND]], label %if.else.y, label %exit
195 ; CHECK-NEXT: store i32 %z, i32* @g, align 4
196 ; CHECK-NEXT: br label %exit
198 ; CHECK-NEXT: ret void
199 define void @test_combine_or(i32 %x, i32 %y, i32 %z) {
201 %cmp.x = icmp ne i32 %x, 0
202 br i1 %cmp.x, label %if.then.x, label %entry.y
205 store i32 %z, i32* @g, align 4
209 %cmp.y = icmp eq i32 %y, 0
210 br i1 %cmp.y, label %exit, label %if.else.y
213 store i32 %z, i32* @g, align 4