@@ -195,6 +195,38 @@ exit:
195195 ret void
196196}
197197
198+ define void @int_iv_vector_poison_invalid (<2 x i64 > %base ) {
199+ ; CHECK-LABEL: define void @int_iv_vector_poison_invalid(
200+ ; CHECK-SAME: <2 x i64> [[BASE:%.*]]) {
201+ ; CHECK-NEXT: entry:
202+ ; CHECK-NEXT: br label [[LOOP:%.*]]
203+ ; CHECK: loop:
204+ ; CHECK-NEXT: [[IV2:%.*]] = phi <2 x i64> [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
205+ ; CHECK-NEXT: [[IV:%.*]] = phi <2 x i64> [ [[IV_NEXT:%.*]], [[LOOP]] ], [ <i64 0, i64 poison>, [[ENTRY]] ]
206+ ; CHECK-NEXT: call void @use.v2i64(<2 x i64> [[IV2]])
207+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw <2 x i64> [[IV]], <i64 4, i64 4>
208+ ; CHECK-NEXT: [[IV2_NEXT]] = add <2 x i64> [[IV_NEXT]], [[BASE]]
209+ ; CHECK-NEXT: [[CMP:%.*]] = call i1 @get.i1()
210+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
211+ ; CHECK: exit:
212+ ; CHECK-NEXT: ret void
213+ ;
214+ entry:
215+ br label %loop
216+
217+ loop:
218+ %iv2 = phi <2 x i64 > [ %iv2.next , %loop ], [ %base , %entry ]
219+ %iv = phi <2 x i64 > [ %iv.next , %loop ], [ <i64 0 , i64 poison>, %entry ]
220+ call void @use.v2i64 (<2 x i64 > %iv2 )
221+ %iv.next = add nuw nsw <2 x i64 > %iv , <i64 4 , i64 4 >
222+ %iv2.next = add <2 x i64 > %iv.next , %base
223+ %cmp = call i1 @get.i1 ()
224+ br i1 %cmp , label %exit , label %loop
225+
226+ exit:
227+ ret void
228+ }
229+
198230define void @int_iv_loop_variant_step (i64 %base , i64 %end ) {
199231; CHECK-LABEL: define void @int_iv_loop_variant_step(
200232; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
@@ -229,6 +261,262 @@ exit:
229261 ret void
230262}
231263
264+ define void @int_iv_xor (i64 %base , i64 %end ) {
265+ ; CHECK-LABEL: define void @int_iv_xor(
266+ ; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
267+ ; CHECK-NEXT: entry:
268+ ; CHECK-NEXT: br label [[LOOP:%.*]]
269+ ; CHECK: loop:
270+ ; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
271+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
272+ ; CHECK-NEXT: call void @use.i64(i64 [[IV2]])
273+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
274+ ; CHECK-NEXT: [[IV2_NEXT]] = xor i64 [[IV_NEXT]], [[BASE]]
275+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
276+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
277+ ; CHECK: exit:
278+ ; CHECK-NEXT: ret void
279+ ;
280+ entry:
281+ br label %loop
282+
283+ loop:
284+ %iv2 = phi i64 [ %iv2.next , %loop ], [ %base , %entry ]
285+ %iv = phi i64 [ %iv.next , %loop ], [ 0 , %entry ]
286+ call void @use.i64 (i64 %iv2 )
287+ %iv.next = add nuw nsw i64 %iv , 4
288+ %iv2.next = xor i64 %iv.next , %base
289+ %cmp = icmp eq i64 %iv.next , %end
290+ br i1 %cmp , label %exit , label %loop
291+
292+ exit:
293+ ret void
294+ }
295+
296+ define void @int_iv_or (i64 %base , i64 %end ) {
297+ ; CHECK-LABEL: define void @int_iv_or(
298+ ; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
299+ ; CHECK-NEXT: entry:
300+ ; CHECK-NEXT: br label [[LOOP:%.*]]
301+ ; CHECK: loop:
302+ ; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
303+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
304+ ; CHECK-NEXT: call void @use.i64(i64 [[IV2]])
305+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
306+ ; CHECK-NEXT: [[IV2_NEXT]] = or i64 [[IV_NEXT]], [[BASE]]
307+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
308+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
309+ ; CHECK: exit:
310+ ; CHECK-NEXT: ret void
311+ ;
312+ entry:
313+ br label %loop
314+
315+ loop:
316+ %iv2 = phi i64 [ %iv2.next , %loop ], [ %base , %entry ]
317+ %iv = phi i64 [ %iv.next , %loop ], [ 0 , %entry ]
318+ call void @use.i64 (i64 %iv2 )
319+ %iv.next = add nuw nsw i64 %iv , 4
320+ %iv2.next = or i64 %iv.next , %base
321+ %cmp = icmp eq i64 %iv.next , %end
322+ br i1 %cmp , label %exit , label %loop
323+
324+ exit:
325+ ret void
326+ }
327+
328+ define void @int_iv_or_disjoint (i64 %base , i64 %end ) {
329+ ; CHECK-LABEL: define void @int_iv_or_disjoint(
330+ ; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
331+ ; CHECK-NEXT: entry:
332+ ; CHECK-NEXT: br label [[LOOP:%.*]]
333+ ; CHECK: loop:
334+ ; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
335+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
336+ ; CHECK-NEXT: call void @use.i64(i64 [[IV2]])
337+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
338+ ; CHECK-NEXT: [[IV2_NEXT]] = or disjoint i64 [[IV_NEXT]], [[BASE]]
339+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
340+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
341+ ; CHECK: exit:
342+ ; CHECK-NEXT: ret void
343+ ;
344+ entry:
345+ br label %loop
346+
347+ loop:
348+ %iv2 = phi i64 [ %iv2.next , %loop ], [ %base , %entry ]
349+ %iv = phi i64 [ %iv.next , %loop ], [ 0 , %entry ]
350+ call void @use.i64 (i64 %iv2 )
351+ %iv.next = add nuw nsw i64 %iv , 4
352+ %iv2.next = or disjoint i64 %iv.next , %base
353+ %cmp = icmp eq i64 %iv.next , %end
354+ br i1 %cmp , label %exit , label %loop
355+
356+ exit:
357+ ret void
358+ }
359+
360+ define void @int_iv_and (i64 %base , i64 %end ) {
361+ ; CHECK-LABEL: define void @int_iv_and(
362+ ; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
363+ ; CHECK-NEXT: entry:
364+ ; CHECK-NEXT: br label [[LOOP:%.*]]
365+ ; CHECK: loop:
366+ ; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
367+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ -1, [[ENTRY]] ]
368+ ; CHECK-NEXT: call void @use.i64(i64 [[IV2]])
369+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
370+ ; CHECK-NEXT: [[IV2_NEXT]] = and i64 [[IV_NEXT]], [[BASE]]
371+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
372+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
373+ ; CHECK: exit:
374+ ; CHECK-NEXT: ret void
375+ ;
376+ entry:
377+ br label %loop
378+
379+ loop:
380+ %iv2 = phi i64 [ %iv2.next , %loop ], [ %base , %entry ]
381+ %iv = phi i64 [ %iv.next , %loop ], [ -1 , %entry ]
382+ call void @use.i64 (i64 %iv2 )
383+ %iv.next = add nuw nsw i64 %iv , 4
384+ %iv2.next = and i64 %iv.next , %base
385+ %cmp = icmp eq i64 %iv.next , %end
386+ br i1 %cmp , label %exit , label %loop
387+
388+ exit:
389+ ret void
390+ }
391+
392+ define void @int_iv_sub (i64 %base , i64 %end ) {
393+ ; CHECK-LABEL: define void @int_iv_sub(
394+ ; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
395+ ; CHECK-NEXT: entry:
396+ ; CHECK-NEXT: br label [[LOOP:%.*]]
397+ ; CHECK: loop:
398+ ; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
399+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
400+ ; CHECK-NEXT: call void @use.i64(i64 [[IV2]])
401+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
402+ ; CHECK-NEXT: [[IV2_NEXT]] = sub i64 [[BASE]], [[IV_NEXT]]
403+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
404+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
405+ ; CHECK: exit:
406+ ; CHECK-NEXT: ret void
407+ ;
408+ entry:
409+ br label %loop
410+
411+ loop:
412+ %iv2 = phi i64 [ %iv2.next , %loop ], [ %base , %entry ]
413+ %iv = phi i64 [ %iv.next , %loop ], [ 0 , %entry ]
414+ call void @use.i64 (i64 %iv2 )
415+ %iv.next = add nuw nsw i64 %iv , 4
416+ %iv2.next = sub i64 %base , %iv.next
417+ %cmp = icmp eq i64 %iv.next , %end
418+ br i1 %cmp , label %exit , label %loop
419+
420+ exit:
421+ ret void
422+ }
423+
424+ define void @int_iv_sub_invalid_order (i64 %base , i64 %end ) {
425+ ; CHECK-LABEL: define void @int_iv_sub_invalid_order(
426+ ; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
427+ ; CHECK-NEXT: entry:
428+ ; CHECK-NEXT: br label [[LOOP:%.*]]
429+ ; CHECK: loop:
430+ ; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
431+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
432+ ; CHECK-NEXT: call void @use.i64(i64 [[IV2]])
433+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
434+ ; CHECK-NEXT: [[IV2_NEXT]] = sub i64 [[IV_NEXT]], [[BASE]]
435+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
436+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
437+ ; CHECK: exit:
438+ ; CHECK-NEXT: ret void
439+ ;
440+ entry:
441+ br label %loop
442+
443+ loop:
444+ %iv2 = phi i64 [ %iv2.next , %loop ], [ %base , %entry ]
445+ %iv = phi i64 [ %iv.next , %loop ], [ 0 , %entry ]
446+ call void @use.i64 (i64 %iv2 )
447+ %iv.next = add nuw nsw i64 %iv , 4
448+ %iv2.next = sub i64 %iv.next , %base
449+ %cmp = icmp eq i64 %iv.next , %end
450+ br i1 %cmp , label %exit , label %loop
451+
452+ exit:
453+ ret void
454+ }
455+
456+ define void @int_iv_add_wrong_start (i64 %base , i64 %end ) {
457+ ; CHECK-LABEL: define void @int_iv_add_wrong_start(
458+ ; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
459+ ; CHECK-NEXT: entry:
460+ ; CHECK-NEXT: br label [[LOOP:%.*]]
461+ ; CHECK: loop:
462+ ; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
463+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 1, [[ENTRY]] ]
464+ ; CHECK-NEXT: call void @use.i64(i64 [[IV2]])
465+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
466+ ; CHECK-NEXT: [[IV2_NEXT]] = add i64 [[IV_NEXT]], [[BASE]]
467+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
468+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
469+ ; CHECK: exit:
470+ ; CHECK-NEXT: ret void
471+ ;
472+ entry:
473+ br label %loop
474+
475+ loop:
476+ %iv2 = phi i64 [ %iv2.next , %loop ], [ %base , %entry ]
477+ %iv = phi i64 [ %iv.next , %loop ], [ 1 , %entry ]
478+ call void @use.i64 (i64 %iv2 )
479+ %iv.next = add nuw nsw i64 %iv , 4
480+ %iv2.next = add i64 %base , %iv.next
481+ %cmp = icmp eq i64 %iv.next , %end
482+ br i1 %cmp , label %exit , label %loop
483+
484+ exit:
485+ ret void
486+ }
487+
488+ define void @int_iv_and_wrong_start (i64 %base , i64 %end ) {
489+ ; CHECK-LABEL: define void @int_iv_and_wrong_start(
490+ ; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
491+ ; CHECK-NEXT: entry:
492+ ; CHECK-NEXT: br label [[LOOP:%.*]]
493+ ; CHECK: loop:
494+ ; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
495+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
496+ ; CHECK-NEXT: call void @use.i64(i64 [[IV2]])
497+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
498+ ; CHECK-NEXT: [[IV2_NEXT]] = and i64 [[IV_NEXT]], [[BASE]]
499+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
500+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
501+ ; CHECK: exit:
502+ ; CHECK-NEXT: ret void
503+ ;
504+ entry:
505+ br label %loop
506+
507+ loop:
508+ %iv2 = phi i64 [ %iv2.next , %loop ], [ %base , %entry ]
509+ %iv = phi i64 [ %iv.next , %loop ], [ 0 , %entry ]
510+ call void @use.i64 (i64 %iv2 )
511+ %iv.next = add nuw nsw i64 %iv , 4
512+ %iv2.next = and i64 %iv.next , %base
513+ %cmp = icmp eq i64 %iv.next , %end
514+ br i1 %cmp , label %exit , label %loop
515+
516+ exit:
517+ ret void
518+ }
519+
232520define void @ptr_iv_inbounds (ptr %base , i64 %end ) {
233521; CHECK-LABEL: define void @ptr_iv_inbounds(
234522; CHECK-SAME: ptr [[BASE:%.*]], i64 [[END:%.*]]) {
@@ -389,38 +677,6 @@ exit:
389677 ret void
390678}
391679
392- define void @wrong_start_value (i64 %base , i64 %end ) {
393- ; CHECK-LABEL: define void @wrong_start_value(
394- ; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
395- ; CHECK-NEXT: entry:
396- ; CHECK-NEXT: br label [[LOOP:%.*]]
397- ; CHECK: loop:
398- ; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
399- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 1, [[ENTRY]] ]
400- ; CHECK-NEXT: call void @use.i64(i64 [[IV2]])
401- ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
402- ; CHECK-NEXT: [[IV2_NEXT]] = add i64 [[IV_NEXT]], [[BASE]]
403- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
404- ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
405- ; CHECK: exit:
406- ; CHECK-NEXT: ret void
407- ;
408- entry:
409- br label %loop
410-
411- loop:
412- %iv2 = phi i64 [ %iv2.next , %loop ], [ %base , %entry ]
413- %iv = phi i64 [ %iv.next , %loop ], [ 1 , %entry ]
414- call void @use.i64 (i64 %iv2 )
415- %iv.next = add nuw nsw i64 %iv , 4
416- %iv2.next = add i64 %base , %iv.next
417- %cmp = icmp eq i64 %iv.next , %end
418- br i1 %cmp , label %exit , label %loop
419-
420- exit:
421- ret void
422- }
423-
424680define void @different_loops (i64 %base ) {
425681; CHECK-LABEL: define void @different_loops(
426682; CHECK-SAME: i64 [[BASE:%.*]]) {
0 commit comments