[memprof] Move YAML support to MemProfYAML.h (NFC) (#119515)
[llvm-project.git] / llvm / test / Transforms / SimpleLoopUnswitch / trivial-unswitch-freeze-individual-conditions.ll
blob5e68c5ca32e87ac2e84c1ee56bb7182c0d8f8edc
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes='loop(simple-loop-unswitch)' -S %s | FileCheck %s
4 declare void @some_func()
6 define i32 @need_freeze_of_individual_or_conditions1(i1 %cond1, i1 %cond2, i1 %cond3, i1 %cond4) {
7 ; CHECK-LABEL: @need_freeze_of_individual_or_conditions1(
8 ; CHECK-NEXT:  entry:
9 ; CHECK-NEXT:    [[COND4_FR:%.*]] = freeze i1 [[COND4:%.*]]
10 ; CHECK-NEXT:    [[COND1_FR:%.*]] = freeze i1 [[COND1:%.*]]
11 ; CHECK-NEXT:    [[TMP0:%.*]] = and i1 [[COND4_FR]], [[COND1_FR]]
12 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ENTRY_SPLIT:%.*]], label [[EXIT_SPLIT:%.*]]
13 ; CHECK:       entry.split:
14 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
15 ; CHECK:       loop.header:
16 ; CHECK-NEXT:    [[OR:%.*]] = or i1 [[COND2:%.*]], [[COND3:%.*]]
17 ; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[OR]], true
18 ; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 false
19 ; CHECK-NEXT:    br i1 [[AND2]], label [[LOOP_LATCH:%.*]], label [[EXIT:%.*]]
20 ; CHECK:       loop.latch:
21 ; CHECK-NEXT:    call void @some_func()
22 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
23 ; CHECK:       exit:
24 ; CHECK-NEXT:    br label [[EXIT_SPLIT]]
25 ; CHECK:       exit.split:
26 ; CHECK-NEXT:    ret i32 0
28 entry:
29   br label %loop.header
31 loop.header:
32   %or = or i1 %cond2, %cond3
33   %and1 = and i1 %or, %cond1
34   %and2 = select i1 %and1, i1 %cond4, i1 false
35   br i1 %and2, label %loop.latch, label %exit
37 loop.latch:
38   call void @some_func()
39   br label %loop.header
41 exit:
42   ret i32 0
45 define i32 @need_freeze_of_individual_or_conditions2(i1 noundef %cond1, i1 %cond2, i1 %cond3, i1 %cond4) {
46 ; CHECK-LABEL: @need_freeze_of_individual_or_conditions2(
47 ; CHECK-NEXT:  entry:
48 ; CHECK-NEXT:    [[COND4_FR:%.*]] = freeze i1 [[COND4:%.*]]
49 ; CHECK-NEXT:    [[TMP0:%.*]] = and i1 [[COND4_FR]], [[COND1:%.*]]
50 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ENTRY_SPLIT:%.*]], label [[EXIT_SPLIT:%.*]]
51 ; CHECK:       entry.split:
52 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
53 ; CHECK:       loop.header:
54 ; CHECK-NEXT:    [[OR:%.*]] = or i1 [[COND2:%.*]], [[COND3:%.*]]
55 ; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[OR]], true
56 ; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 false
57 ; CHECK-NEXT:    br i1 [[AND2]], label [[LOOP_LATCH:%.*]], label [[EXIT:%.*]]
58 ; CHECK:       loop.latch:
59 ; CHECK-NEXT:    call void @some_func()
60 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
61 ; CHECK:       exit:
62 ; CHECK-NEXT:    br label [[EXIT_SPLIT]]
63 ; CHECK:       exit.split:
64 ; CHECK-NEXT:    ret i32 0
66 entry:
67   br label %loop.header
69 loop.header:
70   %or = or i1 %cond2, %cond3
71   %and1 = and i1 %or, %cond1
72   %and2 = select i1 %and1, i1 %cond4, i1 false
73   br i1 %and2, label %loop.latch, label %exit
75 loop.latch:
76   call void @some_func()
77   br label %loop.header
79 exit:
80   ret i32 0
83 define i32 @need_freeze_of_individual_or_conditions3(i1 %cond1, i1 %cond2, i1 %cond3, i1 noundef %cond4) {
84 ; CHECK-LABEL: @need_freeze_of_individual_or_conditions3(
85 ; CHECK-NEXT:  entry:
86 ; CHECK-NEXT:    [[COND1_FR:%.*]] = freeze i1 [[COND1:%.*]]
87 ; CHECK-NEXT:    [[TMP0:%.*]] = and i1 [[COND4:%.*]], [[COND1_FR]]
88 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ENTRY_SPLIT:%.*]], label [[EXIT_SPLIT:%.*]]
89 ; CHECK:       entry.split:
90 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
91 ; CHECK:       loop.header:
92 ; CHECK-NEXT:    [[OR:%.*]] = or i1 [[COND2:%.*]], [[COND3:%.*]]
93 ; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[OR]], true
94 ; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 false
95 ; CHECK-NEXT:    br i1 [[AND2]], label [[LOOP_LATCH:%.*]], label [[EXIT:%.*]]
96 ; CHECK:       loop.latch:
97 ; CHECK-NEXT:    call void @some_func()
98 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
99 ; CHECK:       exit:
100 ; CHECK-NEXT:    br label [[EXIT_SPLIT]]
101 ; CHECK:       exit.split:
102 ; CHECK-NEXT:    ret i32 0
104 entry:
105   br label %loop.header
107 loop.header:
108   %or = or i1 %cond2, %cond3
109   %and1 = and i1 %or, %cond1
110   %and2 = select i1 %and1, i1 %cond4, i1 false
111   br i1 %and2, label %loop.latch, label %exit
113 loop.latch:
114   call void @some_func()
115   br label %loop.header
117 exit:
118   ret i32 0
121 define i32 @need_freeze_of_individual_and_conditions1(i1 %cond1, i1 %cond4) {
122 ; CHECK-LABEL: @need_freeze_of_individual_and_conditions1(
123 ; CHECK-NEXT:  entry:
124 ; CHECK-NEXT:    [[COND4_FR:%.*]] = freeze i1 [[COND4:%.*]]
125 ; CHECK-NEXT:    [[COND1_FR:%.*]] = freeze i1 [[COND1:%.*]]
126 ; CHECK-NEXT:    [[TMP0:%.*]] = or i1 [[COND4_FR]], [[COND1_FR]]
127 ; CHECK-NEXT:    br i1 [[TMP0]], label [[EXIT_SPLIT:%.*]], label [[ENTRY_SPLIT:%.*]]
128 ; CHECK:       entry.split:
129 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
130 ; CHECK:       loop.header:
131 ; CHECK-NEXT:    [[COND_OR1:%.*]] = or i1 undef, false
132 ; CHECK-NEXT:    [[COND_OR6:%.*]] = select i1 [[COND_OR1]], i1 true, i1 false
133 ; CHECK-NEXT:    br i1 [[COND_OR6]], label [[EXIT:%.*]], label [[LOOP_LATCH:%.*]]
134 ; CHECK:       loop.latch:
135 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
136 ; CHECK:       exit:
137 ; CHECK-NEXT:    br label [[EXIT_SPLIT]]
138 ; CHECK:       exit.split:
139 ; CHECK-NEXT:    ret i32 0
141 entry:
142   br label %loop.header
144 loop.header:
145   %cond_or1 = or i1 undef, %cond1
146   %cond_or6 = select i1 %cond_or1, i1 true, i1 %cond4
147   br i1 %cond_or6, label %exit, label %loop.latch
149 loop.latch:
150   br label %loop.header
152 exit:
153   ret i32 0
156 define i32 @need_freeze_of_individual_and_conditions2(i1 noundef %cond1, i1 %cond4) {
157 ; CHECK-LABEL: @need_freeze_of_individual_and_conditions2(
158 ; CHECK-NEXT:  entry:
159 ; CHECK-NEXT:    [[COND4_FR:%.*]] = freeze i1 [[COND4:%.*]]
160 ; CHECK-NEXT:    [[TMP0:%.*]] = or i1 [[COND4_FR]], [[COND1:%.*]]
161 ; CHECK-NEXT:    br i1 [[TMP0]], label [[EXIT_SPLIT:%.*]], label [[ENTRY_SPLIT:%.*]]
162 ; CHECK:       entry.split:
163 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
164 ; CHECK:       loop.header:
165 ; CHECK-NEXT:    [[COND_OR1:%.*]] = or i1 undef, false
166 ; CHECK-NEXT:    [[COND_OR6:%.*]] = select i1 [[COND_OR1]], i1 true, i1 false
167 ; CHECK-NEXT:    br i1 [[COND_OR6]], label [[EXIT:%.*]], label [[LOOP_LATCH:%.*]]
168 ; CHECK:       loop.latch:
169 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
170 ; CHECK:       exit:
171 ; CHECK-NEXT:    br label [[EXIT_SPLIT]]
172 ; CHECK:       exit.split:
173 ; CHECK-NEXT:    ret i32 0
175 entry:
176   br label %loop.header
178 loop.header:
179   %cond_or1 = or i1 undef, %cond1
180   %cond_or6 = select i1 %cond_or1, i1 true, i1 %cond4
181   br i1 %cond_or6, label %exit, label %loop.latch
183 loop.latch:
184   br label %loop.header
186 exit:
187   ret i32 0
190 define i32 @need_freeze_of_individual_and_conditions3(i1 %cond1, i1 noundef %cond4) {
191 ; CHECK-LABEL: @need_freeze_of_individual_and_conditions3(
192 ; CHECK-NEXT:  entry:
193 ; CHECK-NEXT:    [[COND1_FR:%.*]] = freeze i1 [[COND1:%.*]]
194 ; CHECK-NEXT:    [[TMP0:%.*]] = or i1 [[COND4:%.*]], [[COND1_FR]]
195 ; CHECK-NEXT:    br i1 [[TMP0]], label [[EXIT_SPLIT:%.*]], label [[ENTRY_SPLIT:%.*]]
196 ; CHECK:       entry.split:
197 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
198 ; CHECK:       loop.header:
199 ; CHECK-NEXT:    [[COND_OR1:%.*]] = or i1 undef, false
200 ; CHECK-NEXT:    [[COND_OR6:%.*]] = select i1 [[COND_OR1]], i1 true, i1 false
201 ; CHECK-NEXT:    br i1 [[COND_OR6]], label [[EXIT:%.*]], label [[LOOP_LATCH:%.*]]
202 ; CHECK:       loop.latch:
203 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
204 ; CHECK:       exit:
205 ; CHECK-NEXT:    br label [[EXIT_SPLIT]]
206 ; CHECK:       exit.split:
207 ; CHECK-NEXT:    ret i32 0
209 entry:
210   br label %loop.header
212 loop.header:
213   %cond_or1 = or i1 undef, %cond1
214   %cond_or6 = select i1 %cond_or1, i1 true, i1 %cond4
215   br i1 %cond_or6, label %exit, label %loop.latch
217 loop.latch:
218   br label %loop.header
220 exit:
221   ret i32 0
224 define i32 @need_freeze_of_individual_and_conditions4(i1 noundef %cond1, i1 noundef %cond4) {
225 ; CHECK-LABEL: @need_freeze_of_individual_and_conditions4(
226 ; CHECK-NEXT:  entry:
227 ; CHECK-NEXT:    [[TMP0:%.*]] = or i1 [[COND4:%.*]], [[COND1:%.*]]
228 ; CHECK-NEXT:    br i1 [[TMP0]], label [[EXIT_SPLIT:%.*]], label [[ENTRY_SPLIT:%.*]]
229 ; CHECK:       entry.split:
230 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
231 ; CHECK:       loop.header:
232 ; CHECK-NEXT:    [[COND_OR1:%.*]] = or i1 undef, false
233 ; CHECK-NEXT:    [[COND_OR6:%.*]] = select i1 [[COND_OR1]], i1 true, i1 false
234 ; CHECK-NEXT:    br i1 [[COND_OR6]], label [[EXIT:%.*]], label [[LOOP_LATCH:%.*]]
235 ; CHECK:       loop.latch:
236 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
237 ; CHECK:       exit:
238 ; CHECK-NEXT:    br label [[EXIT_SPLIT]]
239 ; CHECK:       exit.split:
240 ; CHECK-NEXT:    ret i32 0
242 entry:
243   br label %loop.header
245 loop.header:
246   %cond_or1 = or i1 undef, %cond1
247   %cond_or6 = select i1 %cond_or1, i1 true, i1 %cond4
248   br i1 %cond_or6, label %exit, label %loop.latch
250 loop.latch:
251   br label %loop.header
253 exit:
254   ret i32 0