Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / branch-fold-three.ll
blob9fe70eae5bb80222d93d895cab6a440f4eae9519
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
4 ; s >= t, s != t, s <= t
5 define void @foo1(i32 %s, i32 %t) {
6 ; CHECK-LABEL: @foo1(
7 ; CHECK-NEXT:  entry:
8 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[S:%.*]], [[T:%.*]]
9 ; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]]
10 ; CHECK:       if.then:
11 ; CHECK-NEXT:    call void @bar1(i32 [[S]], i32 [[T]])
12 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i32 [[S]], [[T]]
13 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]]
14 ; CHECK:       if.then2:
15 ; CHECK-NEXT:    call void @bar2(i32 [[S]], i32 [[T]])
16 ; CHECK-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]]
17 ; CHECK-NEXT:    br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]]
18 ; CHECK:       if.then4:
19 ; CHECK-NEXT:    call void @bar3(i32 [[S]], i32 [[T]])
20 ; CHECK-NEXT:    br label [[IF_END6]]
21 ; CHECK:       if.end6:
22 ; CHECK-NEXT:    ret void
24 entry:
25   %cmp = icmp sge i32 %s, %t
26   br i1 %cmp, label %if.then, label %if.end6
28 if.then:
29   call void @bar1(i32 %s, i32 %t)
30   %cmp1 = icmp ne i32 %s, %t
31   br i1 %cmp1, label %if.then2, label %if.end6
33 if.then2:
34   call void @bar2(i32 %s, i32 %t)
35   %cmp3 = icmp sle i32 %s, %t
36   br i1 %cmp3, label %if.then4, label %if.end6
38 if.then4:
39   call void @bar3(i32 %s, i32 %t)
40   br label %if.end6
42 if.end6:
43   ret void
46 ; s != t, s >= t, s <= t
47 define void @foo11(i32 %s, i32 %t) {
48 ; CHECK-LABEL: @foo11(
49 ; CHECK-NEXT:  entry:
50 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[S:%.*]], [[T:%.*]]
51 ; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]]
52 ; CHECK:       if.then:
53 ; CHECK-NEXT:    call void @bar1(i32 [[S]], i32 [[T]])
54 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i32 [[S]], [[T]]
55 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]]
56 ; CHECK:       if.then2:
57 ; CHECK-NEXT:    call void @bar2(i32 [[S]], i32 [[T]])
58 ; CHECK-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]]
59 ; CHECK-NEXT:    br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]]
60 ; CHECK:       if.then4:
61 ; CHECK-NEXT:    call void @bar3(i32 [[S]], i32 [[T]])
62 ; CHECK-NEXT:    br label [[IF_END6]]
63 ; CHECK:       if.end6:
64 ; CHECK-NEXT:    ret void
66 entry:
67   %cmp = icmp ne i32 %s, %t
68   br i1 %cmp, label %if.then, label %if.end6
70 if.then:
71   call void @bar1(i32 %s, i32 %t)
72   %cmp1 = icmp sge i32 %s, %t
73   br i1 %cmp1, label %if.then2, label %if.end6
75 if.then2:
76   call void @bar2(i32 %s, i32 %t)
77   %cmp3 = icmp sle i32 %s, %t
78   br i1 %cmp3, label %if.then4, label %if.end6
80 if.then4:
81   call void @bar3(i32 %s, i32 %t)
82   br label %if.end6
84 if.end6:
85   ret void
88 ; s >= t, t != s, s <= t
89 define void @foo2(i32 %s, i32 %t) {
90 ; CHECK-LABEL: @foo2(
91 ; CHECK-NEXT:  entry:
92 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[S:%.*]], [[T:%.*]]
93 ; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]]
94 ; CHECK:       if.then:
95 ; CHECK-NEXT:    call void @bar1(i32 [[S]], i32 [[T]])
96 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i32 [[T]], [[S]]
97 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]]
98 ; CHECK:       if.then2:
99 ; CHECK-NEXT:    call void @bar2(i32 [[S]], i32 [[T]])
100 ; CHECK-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]]
101 ; CHECK-NEXT:    br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]]
102 ; CHECK:       if.then4:
103 ; CHECK-NEXT:    call void @bar3(i32 [[S]], i32 [[T]])
104 ; CHECK-NEXT:    br label [[IF_END6]]
105 ; CHECK:       if.end6:
106 ; CHECK-NEXT:    ret void
108 entry:
109   %cmp = icmp sge i32 %s, %t
110   br i1 %cmp, label %if.then, label %if.end6
112 if.then:
113   call void @bar1(i32 %s, i32 %t)
114   %cmp1 = icmp ne i32 %t, %s
115   br i1 %cmp1, label %if.then2, label %if.end6
117 if.then2:
118   call void @bar2(i32 %s, i32 %t)
119   %cmp3 = icmp sle i32 %s, %t
120   br i1 %cmp3, label %if.then4, label %if.end6
122 if.then4:
123   call void @bar3(i32 %s, i32 %t)
124   br label %if.end6
126 if.end6:
127   ret void
130 ; s != t, t <= s, s <= t
131 define void @foo21(i32 %s, i32 %t) {
132 ; CHECK-LABEL: @foo21(
133 ; CHECK-NEXT:  entry:
134 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[S:%.*]], [[T:%.*]]
135 ; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]]
136 ; CHECK:       if.then:
137 ; CHECK-NEXT:    call void @bar1(i32 [[S]], i32 [[T]])
138 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[T]], [[S]]
139 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]]
140 ; CHECK:       if.then2:
141 ; CHECK-NEXT:    call void @bar2(i32 [[S]], i32 [[T]])
142 ; CHECK-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]]
143 ; CHECK-NEXT:    br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]]
144 ; CHECK:       if.then4:
145 ; CHECK-NEXT:    call void @bar3(i32 [[S]], i32 [[T]])
146 ; CHECK-NEXT:    br label [[IF_END6]]
147 ; CHECK:       if.end6:
148 ; CHECK-NEXT:    ret void
150 entry:
151   %cmp = icmp ne i32 %s, %t
152   br i1 %cmp, label %if.then, label %if.end6
154 if.then:
155   call void @bar1(i32 %s, i32 %t)
156   %cmp1 = icmp sle i32 %t, %s
157   br i1 %cmp1, label %if.then2, label %if.end6
159 if.then2:
160   call void @bar2(i32 %s, i32 %t)
161   %cmp3 = icmp sle i32 %s, %t
162   br i1 %cmp3, label %if.then4, label %if.end6
164 if.then4:
165   call void @bar3(i32 %s, i32 %t)
166   br label %if.end6
168 if.end6:
169   ret void
172 ; t <= s, t != s, s <= t
173 define void @foo3(i32 %s, i32 %t) {
174 ; CHECK-LABEL: @foo3(
175 ; CHECK-NEXT:  entry:
176 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[T:%.*]], [[S:%.*]]
177 ; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]]
178 ; CHECK:       if.then:
179 ; CHECK-NEXT:    call void @bar1(i32 [[S]], i32 [[T]])
180 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i32 [[T]], [[S]]
181 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]]
182 ; CHECK:       if.then2:
183 ; CHECK-NEXT:    call void @bar2(i32 [[S]], i32 [[T]])
184 ; CHECK-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]]
185 ; CHECK-NEXT:    br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]]
186 ; CHECK:       if.then4:
187 ; CHECK-NEXT:    call void @bar3(i32 [[S]], i32 [[T]])
188 ; CHECK-NEXT:    br label [[IF_END6]]
189 ; CHECK:       if.end6:
190 ; CHECK-NEXT:    ret void
192 entry:
193   %cmp = icmp sle i32 %t, %s
194   br i1 %cmp, label %if.then, label %if.end6
196 if.then:
197   call void @bar1(i32 %s, i32 %t)
198   %cmp1 = icmp ne i32 %t, %s
199   br i1 %cmp1, label %if.then2, label %if.end6
201 if.then2:
202   call void @bar2(i32 %s, i32 %t)
203   %cmp3 = icmp sle i32 %s, %t
204   br i1 %cmp3, label %if.then4, label %if.end6
206 if.then4:
207   call void @bar3(i32 %s, i32 %t)
208   br label %if.end6
210 if.end6:
211   ret void
214 ; t != s, t <= s, s <= t
215 define void @foo31(i32 %s, i32 %t) {
216 ; CHECK-LABEL: @foo31(
217 ; CHECK-NEXT:  entry:
218 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[T:%.*]], [[S:%.*]]
219 ; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]]
220 ; CHECK:       if.then:
221 ; CHECK-NEXT:    call void @bar1(i32 [[S]], i32 [[T]])
222 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[T]], [[S]]
223 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]]
224 ; CHECK:       if.then2:
225 ; CHECK-NEXT:    call void @bar2(i32 [[S]], i32 [[T]])
226 ; CHECK-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]]
227 ; CHECK-NEXT:    br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]]
228 ; CHECK:       if.then4:
229 ; CHECK-NEXT:    call void @bar3(i32 [[S]], i32 [[T]])
230 ; CHECK-NEXT:    br label [[IF_END6]]
231 ; CHECK:       if.end6:
232 ; CHECK-NEXT:    ret void
234 entry:
235   %cmp = icmp ne i32 %t, %s
236   br i1 %cmp, label %if.then, label %if.end6
238 if.then:
239   call void @bar1(i32 %s, i32 %t)
240   %cmp1 = icmp sle i32 %t, %s
241   br i1 %cmp1, label %if.then2, label %if.end6
243 if.then2:
244   call void @bar2(i32 %s, i32 %t)
245   %cmp3 = icmp sle i32 %s, %t
246   br i1 %cmp3, label %if.then4, label %if.end6
248 if.then4:
249   call void @bar3(i32 %s, i32 %t)
250   br label %if.end6
252 if.end6:
253   ret void
256 declare void @bar1(i32, i32)
257 declare void @bar2(i32, i32)
258 declare void @bar3(i32, i32)