xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/loops.ll (revision 13ffde316a8541d77116bd18f73efada236617f3)
1802d21cdSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3802d21cdSFlorian Hahn
4be0bf04bSFlorian Hahndeclare void @use(i1)
5be0bf04bSFlorian Hahn
6802d21cdSFlorian Hahn; Make sure conditions in loops are not used to simplify themselves.
7802d21cdSFlorian Hahn
834e477e9SFlorian Hahndefine void @loop1(ptr %T, ptr %x, i32 %points, i32 %trigint) {
9802d21cdSFlorian Hahn; CHECK-LABEL: @loop1(
10802d21cdSFlorian Hahn; CHECK-NEXT:  entry:
11802d21cdSFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = sext i32 [[POINTS:%.*]] to i64
1234e477e9SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds float, ptr [[X:%.*]], i64 [[IDX_EXT]]
1334e477e9SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR1:%.*]] = getelementptr inbounds float, ptr [[ADD_PTR]], i64 -8
14802d21cdSFlorian Hahn; CHECK-NEXT:    [[SHR:%.*]] = ashr i32 [[POINTS]], 1
15802d21cdSFlorian Hahn; CHECK-NEXT:    [[IDX_EXT2:%.*]] = sext i32 [[SHR]] to i64
1634e477e9SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 [[IDX_EXT2]]
1734e477e9SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR4:%.*]] = getelementptr inbounds float, ptr [[ADD_PTR3]], i64 -8
18802d21cdSFlorian Hahn; CHECK-NEXT:    br label [[DO_BODY:%.*]]
19802d21cdSFlorian Hahn; CHECK:       do.body:
2034e477e9SFlorian Hahn; CHECK-NEXT:    [[X2_0:%.*]] = phi ptr [ [[ADD_PTR4]], [[ENTRY:%.*]] ], [ [[ADD_PTR106:%.*]], [[DO_BODY]] ]
2134e477e9SFlorian Hahn; CHECK-NEXT:    [[X1_0:%.*]] = phi ptr [ [[ADD_PTR1]], [[ENTRY]] ], [ [[ADD_PTR105:%.*]], [[DO_BODY]] ]
2234e477e9SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR105]] = getelementptr inbounds float, ptr [[X1_0]], i64 -8
2334e477e9SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR106]] = getelementptr inbounds float, ptr [[X2_0]], i64 -8
2434e477e9SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp uge ptr [[ADD_PTR106]], [[X]]
25802d21cdSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[DO_BODY]], label [[DO_END:%.*]]
26802d21cdSFlorian Hahn; CHECK:       do.end:
27802d21cdSFlorian Hahn; CHECK-NEXT:    ret void
28802d21cdSFlorian Hahn;
29802d21cdSFlorian Hahnentry:
30802d21cdSFlorian Hahn  %idx.ext = sext i32 %points to i64
3134e477e9SFlorian Hahn  %add.ptr = getelementptr inbounds float, ptr %x, i64 %idx.ext
3234e477e9SFlorian Hahn  %add.ptr1 = getelementptr inbounds float, ptr %add.ptr, i64 -8
33802d21cdSFlorian Hahn  %shr = ashr i32 %points, 1
34802d21cdSFlorian Hahn  %idx.ext2 = sext i32 %shr to i64
3534e477e9SFlorian Hahn  %add.ptr3 = getelementptr inbounds float, ptr %x, i64 %idx.ext2
3634e477e9SFlorian Hahn  %add.ptr4 = getelementptr inbounds float, ptr %add.ptr3, i64 -8
37802d21cdSFlorian Hahn  br label %do.body
38802d21cdSFlorian Hahn
39802d21cdSFlorian Hahndo.body:                                          ; preds = %do.body, %entry
4034e477e9SFlorian Hahn  %x2.0 = phi ptr [ %add.ptr4, %entry ], [ %add.ptr106, %do.body ]
4134e477e9SFlorian Hahn  %x1.0 = phi ptr [ %add.ptr1, %entry ], [ %add.ptr105, %do.body ]
4234e477e9SFlorian Hahn  %add.ptr105 = getelementptr inbounds float, ptr %x1.0, i64 -8
4334e477e9SFlorian Hahn  %add.ptr106 = getelementptr inbounds float, ptr %x2.0, i64 -8
4434e477e9SFlorian Hahn  %cmp = icmp uge ptr %add.ptr106, %x
45802d21cdSFlorian Hahn  br i1 %cmp, label %do.body, label %do.end
46802d21cdSFlorian Hahn
47802d21cdSFlorian Hahndo.end:                                           ; preds = %do.body
48802d21cdSFlorian Hahn  ret void
49802d21cdSFlorian Hahn}
50be0bf04bSFlorian Hahn
51be0bf04bSFlorian Hahn
52be0bf04bSFlorian Hahn; Some tests with loops with conditions in the header.
53be0bf04bSFlorian Hahn
54be0bf04bSFlorian Hahndefine i32 @loop_header_dom(i32 %y, i1 %c) {
55be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom(
56be0bf04bSFlorian Hahn; CHECK-NEXT:  entry:
57be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
58be0bf04bSFlorian Hahn; CHECK:       loop.header:
59be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
60be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 10
61be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]
62be0bf04bSFlorian Hahn; CHECK:       loop.latch:
63be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
64be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
65be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 9
66be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
67be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[X]], 9
68be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
69be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
70be0bf04bSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
71be0bf04bSFlorian Hahn; CHECK:       exit:
72be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10
73be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
74be0bf04bSFlorian Hahn; CHECK-NEXT:    ret i32 20
75be0bf04bSFlorian Hahn;
76be0bf04bSFlorian Hahnentry:
77be0bf04bSFlorian Hahn  br i1 %c, label %loop.header, label %exit
78be0bf04bSFlorian Hahn
79be0bf04bSFlorian Hahnloop.header:
80be0bf04bSFlorian Hahn  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
81be0bf04bSFlorian Hahn  %c.1 = icmp ule i32 %x, 10
82be0bf04bSFlorian Hahn  br i1 %c.1, label %loop.latch, label %exit
83be0bf04bSFlorian Hahn
84be0bf04bSFlorian Hahnloop.latch:
85be0bf04bSFlorian Hahn  %t.1 = icmp ule i32 %x, 10
86be0bf04bSFlorian Hahn  call void @use(i1 %t.1)
87be0bf04bSFlorian Hahn  %f.1 = icmp ugt i32 %x, 10
88be0bf04bSFlorian Hahn  call void @use(i1 %f.1)
89be0bf04bSFlorian Hahn
90be0bf04bSFlorian Hahn  %c.2 = icmp ule i32 %x, 9
91be0bf04bSFlorian Hahn  call void @use(i1 %c.2)
92be0bf04bSFlorian Hahn  %c.3 = icmp ugt i32 %x, 9
93be0bf04bSFlorian Hahn  call void @use(i1 %c.3)
94be0bf04bSFlorian Hahn
95be0bf04bSFlorian Hahn  %x.next = add i32 %x, 1
96be0bf04bSFlorian Hahn  br label %loop.header
97be0bf04bSFlorian Hahn
98be0bf04bSFlorian Hahnexit:
99be0bf04bSFlorian Hahn  %c.4 = icmp ugt i32 %y, 10
100be0bf04bSFlorian Hahn  call void @use(i1 %c.4)
101be0bf04bSFlorian Hahn  ret i32 20
102be0bf04bSFlorian Hahn}
103be0bf04bSFlorian Hahn
104be0bf04bSFlorian Hahndefine i32 @loop_header_dom_successors_flipped(i32 %y, i1 %c) {
105be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_successors_flipped(
106be0bf04bSFlorian Hahn; CHECK-NEXT:  entry:
107be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
108be0bf04bSFlorian Hahn; CHECK:       loop.header:
109be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
110be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 10
111be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT]], label [[LOOP_LATCH]]
112be0bf04bSFlorian Hahn; CHECK:       loop.latch:
113be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
114be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
115be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 11
116be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
117be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[X]], 11
118be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
119be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
120be0bf04bSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
121be0bf04bSFlorian Hahn; CHECK:       exit:
122be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10
123be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
124be0bf04bSFlorian Hahn; CHECK-NEXT:    ret i32 20
125be0bf04bSFlorian Hahn;
126be0bf04bSFlorian Hahnentry:
127be0bf04bSFlorian Hahn  br i1 %c, label %loop.header, label %exit
128be0bf04bSFlorian Hahn
129be0bf04bSFlorian Hahnloop.header:
130be0bf04bSFlorian Hahn  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
131be0bf04bSFlorian Hahn  %c.1 = icmp ule i32 %x, 10
132be0bf04bSFlorian Hahn  br i1 %c.1, label %exit, label %loop.latch
133be0bf04bSFlorian Hahn
134be0bf04bSFlorian Hahnloop.latch:
135be0bf04bSFlorian Hahn  %f.1 = icmp ule i32 %x, 10
136be0bf04bSFlorian Hahn  call void @use(i1 %f.1)
137be0bf04bSFlorian Hahn  %t.1 = icmp ugt i32 %x, 10
138be0bf04bSFlorian Hahn  call void @use(i1 %t.1)
139be0bf04bSFlorian Hahn
140be0bf04bSFlorian Hahn  %c.2 = icmp ugt i32 %x, 11
141be0bf04bSFlorian Hahn  call void @use(i1 %c.2)
142be0bf04bSFlorian Hahn  %c.3 = icmp ule i32 %x,11
143be0bf04bSFlorian Hahn  call void @use(i1 %c.3)
144be0bf04bSFlorian Hahn
145be0bf04bSFlorian Hahn  %x.next = add i32 %x, 1
146be0bf04bSFlorian Hahn  br label %loop.header
147be0bf04bSFlorian Hahn
148be0bf04bSFlorian Hahnexit:
149be0bf04bSFlorian Hahn  %c.4 = icmp ugt i32 %y, 10
150be0bf04bSFlorian Hahn  call void @use(i1 %c.4)
151be0bf04bSFlorian Hahn  ret i32 20
152be0bf04bSFlorian Hahn}
153be0bf04bSFlorian Hahn
154*c32c668cSFlorian Hahndefine void @loop_header_dom_or(i32 %y, i1 %c, i32 %start) {
155be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_or(
156be0bf04bSFlorian Hahn; CHECK-NEXT:  entry:
157be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
158be0bf04bSFlorian Hahn; CHECK:       loop.header:
159*c32c668cSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
160be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X]], 10
161be0bf04bSFlorian Hahn; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y:%.*]], 99
162be0bf04bSFlorian Hahn; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
163be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[OR]], label [[EXIT]], label [[LOOP_LATCH]]
164be0bf04bSFlorian Hahn; CHECK:       loop.latch:
165be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
166be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
167be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i32 [[X]], 11
168be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
169be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 11
170be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
171be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
172be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
173be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[Y]], 98
174be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
175be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i32 [[Y]], 98
176be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
177be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
178be0bf04bSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
179be0bf04bSFlorian Hahn; CHECK:       exit:
180be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y]], 10
181be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
182be0bf04bSFlorian Hahn; CHECK-NEXT:    ret void
183be0bf04bSFlorian Hahn;
184be0bf04bSFlorian Hahnentry:
185be0bf04bSFlorian Hahn  br i1 %c, label %loop.header, label %exit
186be0bf04bSFlorian Hahn
187be0bf04bSFlorian Hahnloop.header:
188*c32c668cSFlorian Hahn  %x = phi i32 [ %start, %entry ], [ %x.next, %loop.latch ]
189be0bf04bSFlorian Hahn  %x.1 = icmp ule i32 %x, 10
190be0bf04bSFlorian Hahn  %y.1 = icmp ugt i32 %y, 99
191be0bf04bSFlorian Hahn  %or = or i1 %x.1, %y.1
192be0bf04bSFlorian Hahn  br i1 %or, label %exit, label %loop.latch
193be0bf04bSFlorian Hahn
194be0bf04bSFlorian Hahnloop.latch:
195be0bf04bSFlorian Hahn  %t.1 = icmp ugt i32 %x, 10
196be0bf04bSFlorian Hahn  call void @use(i1 %t.1)
197be0bf04bSFlorian Hahn  %f.1 = icmp ule i32 %x, 10
198be0bf04bSFlorian Hahn  call void @use(i1 %f.1)
199be0bf04bSFlorian Hahn  %c.1 = icmp ugt i32 %x, 11
200be0bf04bSFlorian Hahn  call void @use(i1 %c.1)
201be0bf04bSFlorian Hahn  %c.2 = icmp ule i32 %x, 11
202be0bf04bSFlorian Hahn  call void @use(i1 %c.2)
203be0bf04bSFlorian Hahn
204be0bf04bSFlorian Hahn
205be0bf04bSFlorian Hahn  %t.2 = icmp ule i32 %y, 99
206be0bf04bSFlorian Hahn  call void @use(i1 %t.2)
207be0bf04bSFlorian Hahn  %f.2 = icmp ugt i32 %y, 99
208be0bf04bSFlorian Hahn  call void @use(i1 %f.2)
209be0bf04bSFlorian Hahn
210be0bf04bSFlorian Hahn  %c.3 = icmp ule i32 %y, 98
211be0bf04bSFlorian Hahn  call void @use(i1 %c.3)
212be0bf04bSFlorian Hahn  %c.4 = icmp ule i32 %y, 98
213be0bf04bSFlorian Hahn  call void @use(i1 %c.4)
214be0bf04bSFlorian Hahn
215be0bf04bSFlorian Hahn  %x.next = add i32 %x, 1
216be0bf04bSFlorian Hahn  br label %loop.header
217be0bf04bSFlorian Hahn
218be0bf04bSFlorian Hahnexit:
219be0bf04bSFlorian Hahn  %c.5 = icmp ugt i32 %y, 10
220be0bf04bSFlorian Hahn  call void @use(i1 %c.5)
221be0bf04bSFlorian Hahn  ret void
222be0bf04bSFlorian Hahn}
223be0bf04bSFlorian Hahn
224be0bf04bSFlorian Hahndefine void @loop_header_dom_or_successors_flipped(i32 %y, i1 %c) {
225be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_or_successors_flipped(
226be0bf04bSFlorian Hahn; CHECK-NEXT:  entry:
227be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
228be0bf04bSFlorian Hahn; CHECK:       loop.header:
229be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
230be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X]], 10
231be0bf04bSFlorian Hahn; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y:%.*]], 99
232be0bf04bSFlorian Hahn; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
233be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[OR]], label [[LOOP_LATCH]], label [[EXIT]]
234be0bf04bSFlorian Hahn; CHECK:       loop.latch:
235be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 10
236be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
237be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 10
238be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
239be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[X]], 9
240be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
241be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[X]], 9
242be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
243be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y]], 99
244be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
245be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i32 [[Y]], 99
246be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_6]])
247be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i32 [[Y]], 100
248be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_7]])
249be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_8:%.*]] = icmp ugt i32 [[Y]], 100
250be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_8]])
251be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
252be0bf04bSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
253be0bf04bSFlorian Hahn; CHECK:       exit:
254be0bf04bSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i32 [[Y]], 10
255be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
256be0bf04bSFlorian Hahn; CHECK-NEXT:    ret void
257be0bf04bSFlorian Hahn;
258be0bf04bSFlorian Hahnentry:
259be0bf04bSFlorian Hahn  br i1 %c, label %loop.header, label %exit
260be0bf04bSFlorian Hahn
261be0bf04bSFlorian Hahnloop.header:
262be0bf04bSFlorian Hahn  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
263be0bf04bSFlorian Hahn  %x.1 = icmp ule i32 %x, 10
264be0bf04bSFlorian Hahn  %y.1 = icmp ugt i32 %y, 99
265be0bf04bSFlorian Hahn  %or = or i1 %x.1, %y.1
266be0bf04bSFlorian Hahn  br i1 %or, label %loop.latch, label %exit
267be0bf04bSFlorian Hahn
268be0bf04bSFlorian Hahnloop.latch:
269be0bf04bSFlorian Hahn  %c.1 = icmp ule i32 %x, 10
270be0bf04bSFlorian Hahn  call void @use(i1 %c.1)
271be0bf04bSFlorian Hahn  %c.2 = icmp ugt i32 %x, 10
272be0bf04bSFlorian Hahn  call void @use(i1 %c.2)
273be0bf04bSFlorian Hahn  %c.3 = icmp ule i32 %x, 9
274be0bf04bSFlorian Hahn  call void @use(i1 %c.3)
275be0bf04bSFlorian Hahn  %c.4 = icmp ugt i32 %x, 9
276be0bf04bSFlorian Hahn  call void @use(i1 %c.4)
277be0bf04bSFlorian Hahn
278be0bf04bSFlorian Hahn
279be0bf04bSFlorian Hahn  %c.5 = icmp ugt i32 %y, 99
280be0bf04bSFlorian Hahn  call void @use(i1 %c.5)
281be0bf04bSFlorian Hahn  %c.6 = icmp ule i32 %y, 99
282be0bf04bSFlorian Hahn  call void @use(i1 %c.6)
283be0bf04bSFlorian Hahn
284be0bf04bSFlorian Hahn  %c.7 = icmp ugt i32 %y, 100
285be0bf04bSFlorian Hahn  call void @use(i1 %c.7)
286be0bf04bSFlorian Hahn  %c.8 = icmp ugt i32 %y, 100
287be0bf04bSFlorian Hahn  call void @use(i1 %c.8)
288be0bf04bSFlorian Hahn
289be0bf04bSFlorian Hahn  %x.next = add i32 %x, 1
290be0bf04bSFlorian Hahn  br label %loop.header
291be0bf04bSFlorian Hahn
292be0bf04bSFlorian Hahnexit:
293be0bf04bSFlorian Hahn  %t.1 = icmp ugt i32 %y, 10
294be0bf04bSFlorian Hahn  call void @use(i1 %t.1)
295be0bf04bSFlorian Hahn  ret void
296be0bf04bSFlorian Hahn}
297be0bf04bSFlorian Hahn
298be0bf04bSFlorian Hahn
299be0bf04bSFlorian Hahndefine void @loop_header_dom_and(i32 %y, i1 %c) {
300be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_and(
301be0bf04bSFlorian Hahn; CHECK-NEXT:  entry:
302be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
303be0bf04bSFlorian Hahn; CHECK:       exit:
304be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y:%.*]], 10
305be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
306be0bf04bSFlorian Hahn; CHECK-NEXT:    ret void
307be0bf04bSFlorian Hahn; CHECK:       loop.header:
308be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
309be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X]], 10
310be0bf04bSFlorian Hahn; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99
311be0bf04bSFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
312be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
313be0bf04bSFlorian Hahn; CHECK:       loop.latch:
314be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
315be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
316be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 9
317be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
318be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 9
319be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
320be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
321be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
322be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[Y]], 100
323be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
324be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[Y]], 100
325be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
326be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
327be0bf04bSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
328be0bf04bSFlorian Hahn; CHECK:       exit.1:
329be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ugt i32 [[Y]], 10
330be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_6]])
331be0bf04bSFlorian Hahn; CHECK-NEXT:    ret void
332be0bf04bSFlorian Hahn;
333be0bf04bSFlorian Hahnentry:
334be0bf04bSFlorian Hahn  br i1 %c, label %loop.header, label %exit
335be0bf04bSFlorian Hahn
336be0bf04bSFlorian Hahnexit:
337be0bf04bSFlorian Hahn  %c.5 = icmp ugt i32 %y, 10
338be0bf04bSFlorian Hahn  call void @use(i1 %c.5)
339be0bf04bSFlorian Hahn  ret void
340be0bf04bSFlorian Hahn
341be0bf04bSFlorian Hahnloop.header:
342be0bf04bSFlorian Hahn  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
343be0bf04bSFlorian Hahn  %x.1 = icmp ule i32 %x, 10
344be0bf04bSFlorian Hahn  %y.1 = icmp ugt i32 %y, 99
345be0bf04bSFlorian Hahn  %and = and i1 %x.1, %y.1
346be0bf04bSFlorian Hahn  br i1 %and, label %loop.latch, label %exit.1
347be0bf04bSFlorian Hahn
348be0bf04bSFlorian Hahnloop.latch:
349be0bf04bSFlorian Hahn  %t.1 = icmp ule i32 %x, 10
350be0bf04bSFlorian Hahn  call void @use(i1 %t.1)
351be0bf04bSFlorian Hahn  %f.1 = icmp ugt i32 %x, 10
352be0bf04bSFlorian Hahn  call void @use(i1 %f.1)
353be0bf04bSFlorian Hahn  %c.1 = icmp ule i32 %x, 9
354be0bf04bSFlorian Hahn  call void @use(i1 %c.1)
355be0bf04bSFlorian Hahn  %c.2 = icmp ugt i32 %x, 9
356be0bf04bSFlorian Hahn  call void @use(i1 %c.2)
357be0bf04bSFlorian Hahn
358be0bf04bSFlorian Hahn
359be0bf04bSFlorian Hahn  %t.2 = icmp ugt i32 %y, 99
360be0bf04bSFlorian Hahn  call void @use(i1 %t.2)
361be0bf04bSFlorian Hahn  %f.2 = icmp ule i32 %y, 99
362be0bf04bSFlorian Hahn  call void @use(i1 %f.2)
363be0bf04bSFlorian Hahn
364be0bf04bSFlorian Hahn  %c.3 = icmp ugt i32 %y, 100
365be0bf04bSFlorian Hahn  call void @use(i1 %c.3)
366be0bf04bSFlorian Hahn  %c.4 = icmp ugt i32 %y, 100
367be0bf04bSFlorian Hahn  call void @use(i1 %c.4)
368be0bf04bSFlorian Hahn
369be0bf04bSFlorian Hahn  %x.next = add i32 %x, 1
370be0bf04bSFlorian Hahn  br label %loop.header
371be0bf04bSFlorian Hahn
372be0bf04bSFlorian Hahnexit.1:
373be0bf04bSFlorian Hahn  %c.6 = icmp ugt i32 %y, 10
374be0bf04bSFlorian Hahn  call void @use(i1 %c.6)
375be0bf04bSFlorian Hahn  ret void
376be0bf04bSFlorian Hahn}
377be0bf04bSFlorian Hahn
378be0bf04bSFlorian Hahndefine void @loop_header_dom_and_successors_flipped(i32 %y, i1 %c) {
379be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_and_successors_flipped(
380be0bf04bSFlorian Hahn; CHECK-NEXT:  entry:
381be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
382be0bf04bSFlorian Hahn; CHECK:       exit:
383be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_9:%.*]] = icmp ugt i32 [[Y:%.*]], 10
384be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_9]])
385be0bf04bSFlorian Hahn; CHECK-NEXT:    ret void
386be0bf04bSFlorian Hahn; CHECK:       loop.header:
387be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
388be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X]], 10
389be0bf04bSFlorian Hahn; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99
390be0bf04bSFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
391be0bf04bSFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[EXIT_1:%.*]], label [[LOOP_LATCH]]
392be0bf04bSFlorian Hahn; CHECK:       loop.latch:
393be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 10
394be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
395be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 10
396be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
397be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[X]], 9
398be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
399be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[X]], 9
400be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
401be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y]], 99
402be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
403be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i32 [[Y]], 99
404be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_6]])
405be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i32 [[Y]], 100
406be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_7]])
407be0bf04bSFlorian Hahn; CHECK-NEXT:    [[C_8:%.*]] = icmp ugt i32 [[Y]], 100
408be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_8]])
409be0bf04bSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
410be0bf04bSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
411be0bf04bSFlorian Hahn; CHECK:       exit.1:
412be0bf04bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
413be0bf04bSFlorian Hahn; CHECK-NEXT:    ret void
414be0bf04bSFlorian Hahn;
415be0bf04bSFlorian Hahnentry:
416be0bf04bSFlorian Hahn  br i1 %c, label %loop.header, label %exit
417be0bf04bSFlorian Hahn
418be0bf04bSFlorian Hahnexit:
419be0bf04bSFlorian Hahn  %c.9 = icmp ugt i32 %y, 10
420be0bf04bSFlorian Hahn  call void @use(i1 %c.9)
421be0bf04bSFlorian Hahn  ret void
422be0bf04bSFlorian Hahn
423be0bf04bSFlorian Hahnloop.header:
424be0bf04bSFlorian Hahn  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
425be0bf04bSFlorian Hahn  %x.1 = icmp ule i32 %x, 10
426be0bf04bSFlorian Hahn  %y.1 = icmp ugt i32 %y, 99
427be0bf04bSFlorian Hahn  %and = and i1 %x.1, %y.1
428be0bf04bSFlorian Hahn  br i1 %and, label %exit.1, label %loop.latch
429be0bf04bSFlorian Hahn
430be0bf04bSFlorian Hahnloop.latch:
431be0bf04bSFlorian Hahn  %c.1 = icmp ule i32 %x, 10
432be0bf04bSFlorian Hahn  call void @use(i1 %c.1)
433be0bf04bSFlorian Hahn  %c.2 = icmp ugt i32 %x, 10
434be0bf04bSFlorian Hahn  call void @use(i1 %c.2)
435be0bf04bSFlorian Hahn  %c.3 = icmp ule i32 %x, 9
436be0bf04bSFlorian Hahn  call void @use(i1 %c.3)
437be0bf04bSFlorian Hahn  %c.4 = icmp ugt i32 %x, 9
438be0bf04bSFlorian Hahn  call void @use(i1 %c.4)
439be0bf04bSFlorian Hahn
440be0bf04bSFlorian Hahn
441be0bf04bSFlorian Hahn  %c.5 = icmp ugt i32 %y, 99
442be0bf04bSFlorian Hahn  call void @use(i1 %c.5)
443be0bf04bSFlorian Hahn  %c.6 = icmp ule i32 %y, 99
444be0bf04bSFlorian Hahn  call void @use(i1 %c.6)
445be0bf04bSFlorian Hahn
446be0bf04bSFlorian Hahn  %c.7 = icmp ugt i32 %y, 100
447be0bf04bSFlorian Hahn  call void @use(i1 %c.7)
448be0bf04bSFlorian Hahn  %c.8 = icmp ugt i32 %y, 100
449be0bf04bSFlorian Hahn  call void @use(i1 %c.8)
450be0bf04bSFlorian Hahn
451be0bf04bSFlorian Hahn  %x.next = add i32 %x, 1
452be0bf04bSFlorian Hahn  br label %loop.header
453be0bf04bSFlorian Hahn
454be0bf04bSFlorian Hahnexit.1:
455be0bf04bSFlorian Hahn  %t.1 = icmp ugt i32 %y, 10
456be0bf04bSFlorian Hahn  call void @use(i1 %t.1)
457be0bf04bSFlorian Hahn  ret void
458be0bf04bSFlorian Hahn}
459