@@ -81,6 +81,236 @@ exit:
81
81
ret i64 %res
82
82
}
83
83
84
+ define i64 @test_udiv (i1 %c ) {
85
+ ; CHECK-LABEL: @test_udiv(
86
+ ; CHECK-NEXT: entry:
87
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
88
+ ; CHECK: loop:
89
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 9, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
90
+ ; CHECK-NEXT: [[IV_NEXT]] = udiv i64 [[IV]], 3
91
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
92
+ ; CHECK: exit:
93
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], 16
94
+ ; CHECK-NEXT: ret i64 [[RES]]
95
+ ;
96
+ entry:
97
+ br label %loop
98
+ loop:
99
+ %iv = phi i64 [9 , %entry ], [%iv.next , %loop ]
100
+ %iv.next = udiv i64 %iv , 3
101
+ br i1 %c , label %exit , label %loop
102
+ exit:
103
+ %res = and i64 %iv , 16
104
+ ret i64 %res
105
+ }
106
+
107
+ define i64 @test_sdiv (i1 %c ) {
108
+ ; CHECK-LABEL: @test_sdiv(
109
+ ; CHECK-NEXT: entry:
110
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
111
+ ; CHECK: loop:
112
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ -9, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
113
+ ; CHECK-NEXT: [[IV_NEXT]] = sdiv i64 [[IV]], -3
114
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
115
+ ; CHECK: exit:
116
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], 16
117
+ ; CHECK-NEXT: ret i64 [[RES]]
118
+ ;
119
+ entry:
120
+ br label %loop
121
+ loop:
122
+ %iv = phi i64 [-9 , %entry ], [%iv.next , %loop ]
123
+ %iv.next = sdiv i64 %iv , -3
124
+ br i1 %c , label %exit , label %loop
125
+ exit:
126
+ %res = and i64 %iv , 16
127
+ ret i64 %res
128
+ }
129
+
130
+ define i64 @test_sdiv2 (i1 %c ) {
131
+ ; CHECK-LABEL: @test_sdiv2(
132
+ ; CHECK-NEXT: entry:
133
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
134
+ ; CHECK: loop:
135
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ -9, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
136
+ ; CHECK-NEXT: [[IV_NEXT]] = sdiv i64 [[IV]], 3
137
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
138
+ ; CHECK: exit:
139
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], 16
140
+ ; CHECK-NEXT: ret i64 [[RES]]
141
+ ;
142
+ entry:
143
+ br label %loop
144
+ loop:
145
+ %iv = phi i64 [-9 , %entry ], [%iv.next , %loop ]
146
+ %iv.next = sdiv i64 %iv , 3
147
+ br i1 %c , label %exit , label %loop
148
+ exit:
149
+ %res = and i64 %iv , 16
150
+ ret i64 %res
151
+ }
152
+
153
+ define i64 @test_sdiv3 (i1 %c ) {
154
+ ; CHECK-LABEL: @test_sdiv3(
155
+ ; CHECK-NEXT: entry:
156
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
157
+ ; CHECK: loop:
158
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 9, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
159
+ ; CHECK-NEXT: [[IV_NEXT]] = sdiv i64 [[IV]], -3
160
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
161
+ ; CHECK: exit:
162
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], -16
163
+ ; CHECK-NEXT: ret i64 [[RES]]
164
+ ;
165
+ entry:
166
+ br label %loop
167
+ loop:
168
+ %iv = phi i64 [9 , %entry ], [%iv.next , %loop ]
169
+ %iv.next = sdiv i64 %iv , -3
170
+ br i1 %c , label %exit , label %loop
171
+ exit:
172
+ %res = and i64 %iv , -16
173
+ ret i64 %res
174
+ }
175
+
176
+ define i64 @test_urem (i1 %c ) {
177
+ ; CHECK-LABEL: @test_urem(
178
+ ; CHECK-NEXT: entry:
179
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
180
+ ; CHECK: loop:
181
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 3, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
182
+ ; CHECK-NEXT: [[IV_NEXT]] = urem i64 9, [[IV]]
183
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
184
+ ; CHECK: exit:
185
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], 4
186
+ ; CHECK-NEXT: ret i64 [[RES]]
187
+ ;
188
+ entry:
189
+ br label %loop
190
+ loop:
191
+ %iv = phi i64 [3 , %entry ], [%iv.next , %loop ]
192
+ %iv.next = urem i64 9 , %iv
193
+ br i1 %c , label %exit , label %loop
194
+ exit:
195
+ %res = and i64 %iv , 4
196
+ ret i64 %res
197
+ }
198
+
199
+ define i64 @test_srem (i1 %c ) {
200
+ ; CHECK-LABEL: @test_srem(
201
+ ; CHECK-NEXT: entry:
202
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
203
+ ; CHECK: loop:
204
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ -9, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
205
+ ; CHECK-NEXT: [[IV_NEXT]] = srem i64 [[IV]], 3
206
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
207
+ ; CHECK: exit:
208
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], 16
209
+ ; CHECK-NEXT: ret i64 [[RES]]
210
+ ;
211
+ entry:
212
+ br label %loop
213
+ loop:
214
+ %iv = phi i64 [-9 , %entry ], [%iv.next , %loop ]
215
+ %iv.next = srem i64 %iv , -3
216
+ br i1 %c , label %exit , label %loop
217
+ exit:
218
+ %res = and i64 %iv , 16
219
+ ret i64 %res
220
+ }
221
+
222
+ define i64 @test_srem2 (i1 %c ) {
223
+ ; CHECK-LABEL: @test_srem2(
224
+ ; CHECK-NEXT: entry:
225
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
226
+ ; CHECK: loop:
227
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ -9, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
228
+ ; CHECK-NEXT: [[IV_NEXT]] = srem i64 [[IV]], 3
229
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
230
+ ; CHECK: exit:
231
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], 16
232
+ ; CHECK-NEXT: ret i64 [[RES]]
233
+ ;
234
+ entry:
235
+ br label %loop
236
+ loop:
237
+ %iv = phi i64 [-9 , %entry ], [%iv.next , %loop ]
238
+ %iv.next = srem i64 %iv , 3
239
+ br i1 %c , label %exit , label %loop
240
+ exit:
241
+ %res = and i64 %iv , 16
242
+ ret i64 %res
243
+ }
244
+
245
+ define i64 @test_srem2_flipped (i1 %c ) {
246
+ ; CHECK-LABEL: @test_srem2_flipped(
247
+ ; CHECK-NEXT: entry:
248
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
249
+ ; CHECK: loop:
250
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 3, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
251
+ ; CHECK-NEXT: [[IV_NEXT]] = srem i64 -9, [[IV]]
252
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
253
+ ; CHECK: exit:
254
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], 4
255
+ ; CHECK-NEXT: ret i64 [[RES]]
256
+ ;
257
+ entry:
258
+ br label %loop
259
+ loop:
260
+ %iv = phi i64 [3 , %entry ], [%iv.next , %loop ]
261
+ %iv.next = srem i64 -9 , %iv
262
+ br i1 %c , label %exit , label %loop
263
+ exit:
264
+ %res = and i64 %iv , 4
265
+ ret i64 %res
266
+ }
267
+
268
+ define i64 @test_srem3 (i1 %c ) {
269
+ ; CHECK-LABEL: @test_srem3(
270
+ ; CHECK-NEXT: entry:
271
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
272
+ ; CHECK: loop:
273
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 9, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
274
+ ; CHECK-NEXT: [[IV_NEXT]] = srem i64 [[IV]], 3
275
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
276
+ ; CHECK: exit:
277
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], -16
278
+ ; CHECK-NEXT: ret i64 [[RES]]
279
+ ;
280
+ entry:
281
+ br label %loop
282
+ loop:
283
+ %iv = phi i64 [9 , %entry ], [%iv.next , %loop ]
284
+ %iv.next = srem i64 %iv , -3
285
+ br i1 %c , label %exit , label %loop
286
+ exit:
287
+ %res = and i64 %iv , -16
288
+ ret i64 %res
289
+ }
290
+
291
+ define i64 @test_srem3_flipped (i1 %c ) {
292
+ ; CHECK-LABEL: @test_srem3_flipped(
293
+ ; CHECK-NEXT: entry:
294
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
295
+ ; CHECK: loop:
296
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ -3, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
297
+ ; CHECK-NEXT: [[IV_NEXT]] = srem i64 9, [[IV]]
298
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
299
+ ; CHECK: exit:
300
+ ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], -4
301
+ ; CHECK-NEXT: ret i64 [[RES]]
302
+ ;
303
+ entry:
304
+ br label %loop
305
+ loop:
306
+ %iv = phi i64 [-3 , %entry ], [%iv.next , %loop ]
307
+ %iv.next = srem i64 9 , %iv
308
+ br i1 %c , label %exit , label %loop
309
+ exit:
310
+ %res = and i64 %iv , -4
311
+ ret i64 %res
312
+ }
313
+
84
314
define i64 @test_and (i1 %c ) {
85
315
; CHECK-LABEL: @test_and(
86
316
; CHECK-NEXT: entry:
0 commit comments