Skip to content

Commit 14064d5

Browse files
committed
[LV] Add test showing missed optimization due to missing info from guard
Add test for SCEVUMaxExpr handling in llvm#160012. (cherry picked from commit 129c683)
1 parent 2e0796d commit 14064d5

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
@@ -578,6 +578,73 @@ exit:
578578
ret ptr %res
579579
}
580580

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

0 commit comments

Comments
 (0)