Skip to content

Commit d65e5f6

Browse files
committed
[IndVarSimplify] Add additional tests using isImpliedViaMerge.
1 parent 369cd2a commit d65e5f6

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

llvm/test/Transforms/IndVarSimplify/eliminate-exit.ll

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,3 +436,58 @@ exit:
436436
}
437437

438438
declare void @side_effect()
439+
440+
; The exit condition %outer.cond.1 depends on a phi in %inner. Make sure we do
441+
; not incorrectly determine %x.lcssa <= -1.
442+
define i32 @exit_cond_depends_on_inner_loop() {
443+
; CHECK-LABEL: @exit_cond_depends_on_inner_loop(
444+
; CHECK-NEXT: entry:
445+
; CHECK-NEXT: br label [[OUTER_HEADER:%.*]]
446+
; CHECK: outer.header:
447+
; CHECK-NEXT: [[IV_OUTER:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_OUTER_NEXT:%.*]], [[OUTER_LATCH:%.*]] ]
448+
; CHECK-NEXT: br label [[INNER:%.*]]
449+
; CHECK: inner:
450+
; CHECK-NEXT: [[X:%.*]] = phi i32 [ -1, [[OUTER_HEADER]] ], [ [[CALL:%.*]], [[INNER]] ]
451+
; CHECK-NEXT: [[CALL]] = call i32 @match()
452+
; CHECK-NEXT: [[INNER_COND:%.*]] = icmp sgt i32 [[CALL]], -1
453+
; CHECK-NEXT: br i1 [[INNER_COND]], label [[INNER]], label [[OUTER_EXITING_1:%.*]]
454+
; CHECK: outer.exiting.1:
455+
; CHECK-NEXT: [[X_LCSSA:%.*]] = phi i32 [ [[X]], [[INNER]] ]
456+
; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[OUTER_LATCH]]
457+
; CHECK: outer.latch:
458+
; CHECK-NEXT: [[IV_OUTER_NEXT]] = add nuw nsw i32 [[IV_OUTER]], 1
459+
; CHECK-NEXT: [[OUTER_COND_2:%.*]] = icmp ult i32 [[IV_OUTER]], 100
460+
; CHECK-NEXT: br i1 [[OUTER_COND_2]], label [[OUTER_HEADER]], label [[EXIT]]
461+
; CHECK: exit:
462+
; CHECK-NEXT: [[X_RES:%.*]] = phi i32 [ [[X_LCSSA]], [[OUTER_EXITING_1]] ], [ -1, [[OUTER_LATCH]] ]
463+
; CHECK-NEXT: ret i32 [[X_RES]]
464+
;
465+
entry:
466+
br label %outer.header
467+
468+
outer.header:
469+
%iv.outer = phi i32 [ 0, %entry ], [ %iv.outer.next , %outer.latch ]
470+
br label %inner
471+
472+
inner:
473+
%x = phi i32 [ -1, %outer.header ], [ %call, %inner ]
474+
%call = call i32 @match()
475+
%inner.cond = icmp sgt i32 %call, -1
476+
br i1 %inner.cond, label %inner, label %outer.exiting.1
477+
478+
outer.exiting.1:
479+
%x.lcssa = phi i32 [ %x, %inner ]
480+
%outer.cond.1 = icmp sgt i32 %x.lcssa, -1
481+
br i1 %outer.cond.1, label %exit, label %outer.latch
482+
483+
outer.latch:
484+
%iv.outer.next = add nuw nsw i32 %iv.outer, 1
485+
%outer.cond.2 = icmp ult i32 %iv.outer, 100
486+
br i1 %outer.cond.2, label %outer.header, label %exit
487+
488+
exit:
489+
%x.res = phi i32 [ %x.lcssa, %outer.exiting.1 ], [ -1, %outer.latch ]
490+
ret i32 %x.res
491+
}
492+
493+
declare i32 @match()

llvm/test/Transforms/IndVarSimplify/promote-iv-to-eliminate-casts.ll

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,4 +373,66 @@ loop:
373373
br i1 %loopcond, label %loopexit, label %loop
374374
}
375375

376+
define void @promote_latch_condition_decrementing_loop_05(i32* %p, i32* %a, i1 %cond) {
377+
; CHECK-LABEL: @promote_latch_condition_decrementing_loop_05(
378+
; CHECK-NEXT: entry:
379+
; CHECK-NEXT: [[LEN:%.*]] = load i32, i32* [[P:%.*]], align 4, [[RNG0]]
380+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
381+
; CHECK: if.true:
382+
; CHECK-NEXT: br label [[MERGE:%.*]]
383+
; CHECK: if.false:
384+
; CHECK-NEXT: [[LEN_MINUS_1:%.*]] = add nsw i32 [[LEN]], -1
385+
; CHECK-NEXT: br label [[MERGE]]
386+
; CHECK: merge:
387+
; CHECK-NEXT: [[IV_START:%.*]] = phi i32 [ [[LEN]], [[IF_TRUE]] ], [ [[LEN_MINUS_1]], [[IF_FALSE]] ]
388+
; CHECK-NEXT: [[ZERO_CHECK:%.*]] = icmp eq i32 [[LEN]], 0
389+
; CHECK-NEXT: br i1 [[ZERO_CHECK]], label [[LOOPEXIT:%.*]], label [[PREHEADER:%.*]]
390+
; CHECK: preheader:
391+
; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[IV_START]] to i64
392+
; CHECK-NEXT: br label [[LOOP:%.*]]
393+
; CHECK: loopexit.loopexit:
394+
; CHECK-NEXT: br label [[LOOPEXIT]]
395+
; CHECK: loopexit:
396+
; CHECK-NEXT: ret void
397+
; CHECK: loop:
398+
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ], [ [[TMP0]], [[PREHEADER]] ]
399+
; CHECK-NEXT: [[EL:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
400+
; CHECK-NEXT: store atomic i32 0, i32* [[EL]] unordered, align 4
401+
; CHECK-NEXT: [[LOOPCOND:%.*]] = icmp slt i64 [[INDVARS_IV]], 1
402+
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], -1
403+
; CHECK-NEXT: br i1 [[LOOPCOND]], label [[LOOPEXIT_LOOPEXIT:%.*]], label [[LOOP]]
404+
;
405+
406+
entry:
407+
%len = load i32, i32* %p, align 4, !range !0
408+
br i1 %cond, label %if.true, label %if.false
409+
410+
if.true:
411+
br label %merge
412+
413+
if.false:
414+
%len.minus.1 = add nsw i32 %len, -1
415+
br label %merge
416+
417+
merge:
418+
%iv_start = phi i32 [ %len, %if.true ], [%len.minus.1, %if.false ]
419+
%zero_check = icmp eq i32 %len, 0
420+
br i1 %zero_check, label %loopexit, label %preheader
421+
422+
preheader:
423+
br label %loop
424+
425+
loopexit:
426+
ret void
427+
428+
loop:
429+
%iv = phi i32 [ %iv.next, %loop ], [ %iv_start, %preheader ]
430+
%iv.wide = zext i32 %iv to i64
431+
%el = getelementptr inbounds i32, i32* %a, i64 %iv.wide
432+
store atomic i32 0, i32* %el unordered, align 4
433+
%iv.next = add nsw i32 %iv, -1
434+
%loopcond = icmp slt i32 %iv, 1
435+
br i1 %loopcond, label %loopexit, label %loop
436+
}
437+
376438
!0 = !{i32 0, i32 2147483647}

0 commit comments

Comments
 (0)