Skip to content

Commit 129c683

Browse files
committed
[LV] Add test showing missed optimization due to missing info from guard
Add test for SCEVUMaxExpr handling in #160012.
1 parent eb6b7be commit 129c683

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

llvm/test/Transforms/LoopVectorize/single_early_exit.ll

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,73 @@ exit:
567567
ret ptr %res
568568
}
569569

570+
define i64 @loop_guards_needed_to_prove_deref_multiple(i32 %x, i1 %c, ptr dereferenceable(1024) %src) {
571+
; CHECK-LABEL: define i64 @loop_guards_needed_to_prove_deref_multiple(
572+
; CHECK-SAME: i32 [[X:%.*]], i1 [[C:%.*]], ptr dereferenceable(1024) [[SRC:%.*]]) {
573+
; CHECK-NEXT: entry:
574+
; CHECK-NEXT: [[X_AND:%.*]] = and i32 [[X]], -2
575+
; CHECK-NEXT: [[PRE_0:%.*]] = icmp eq i32 [[X]], 0
576+
; CHECK-NEXT: br i1 [[PRE_0]], label [[THEN:%.*]], label [[EXIT:%.*]]
577+
; CHECK: then:
578+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i32 [[X_AND]], i32 0
579+
; CHECK-NEXT: [[PRE_1:%.*]] = icmp ugt i32 [[SEL]], 1024
580+
; CHECK-NEXT: br i1 [[PRE_1]], label [[EXIT]], label [[PH:%.*]]
581+
; CHECK: ph:
582+
; CHECK-NEXT: [[PRE_2:%.*]] = icmp ne i32 [[SEL]], 0
583+
; CHECK-NEXT: call void @llvm.assume(i1 [[PRE_2]])
584+
; CHECK-NEXT: [[N:%.*]] = add i32 [[SEL]], -1
585+
; CHECK-NEXT: [[N_EXT:%.*]] = zext i32 [[N]] to i64
586+
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
587+
; CHECK: loop.header:
588+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[PH]] ]
589+
; CHECK-NEXT: [[GEP_SRC_I:%.*]] = getelementptr i8, ptr [[SRC]], i64 [[IV]]
590+
; CHECK-NEXT: [[L:%.*]] = load i8, ptr [[GEP_SRC_I]], align 1
591+
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[L]], 0
592+
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_LOOPEXIT:%.*]], label [[LOOP_LATCH]]
593+
; CHECK: loop.latch:
594+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
595+
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV]], [[N_EXT]]
596+
; CHECK-NEXT: br i1 [[EC]], label [[EXIT_LOOPEXIT]], label [[LOOP_HEADER]]
597+
; CHECK: exit.loopexit:
598+
; CHECK-NEXT: [[RES_PH:%.*]] = phi i64 [ [[IV]], [[LOOP_HEADER]] ], [ 0, [[LOOP_LATCH]] ]
599+
; CHECK-NEXT: br label [[EXIT]]
600+
; CHECK: exit:
601+
; CHECK-NEXT: [[RES:%.*]] = phi i64 [ -1, [[ENTRY:%.*]] ], [ -2, [[THEN]] ], [ [[RES_PH]], [[EXIT_LOOPEXIT]] ]
602+
; CHECK-NEXT: ret i64 [[RES]]
603+
;
604+
entry:
605+
%x.and = and i32 %x, -2
606+
%pre.0 = icmp eq i32 %x, 0
607+
br i1 %pre.0, label %then, label %exit
608+
609+
then:
610+
%sel = select i1 %c, i32 %x.and, i32 0
611+
%pre.1 = icmp ugt i32 %sel, 1024
612+
br i1 %pre.1, label %exit, label %ph
613+
614+
ph:
615+
%pre.2 = icmp ne i32 %sel, 0
616+
call void @llvm.assume(i1 %pre.2)
617+
%n = add i32 %sel, -1
618+
%n.ext = zext i32 %n to i64
619+
br label %loop.header
620+
621+
loop.header:
622+
%iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %ph ]
623+
%gep.src.i = getelementptr i8, ptr %src, i64 %iv
624+
%l = load i8, ptr %gep.src.i, align 1
625+
%c.1 = icmp eq i8 %l, 0
626+
br i1 %c.1, label %exit, label %loop.latch
627+
628+
loop.latch:
629+
%iv.next = add i64 %iv, 1
630+
%ec = icmp eq i64 %iv, %n.ext
631+
br i1 %ec, label %exit, label %loop.header
632+
633+
exit:
634+
%res = phi i64 [ -1, %entry ], [ -2, %then ], [ 0, %loop.latch ], [ %iv, %loop.header ]
635+
ret i64 %res
636+
}
570637
;.
571638
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
572639
; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}

0 commit comments

Comments
 (0)