Skip to content

Commit 6b0f5e7

Browse files
committed
!fixup add early-exit test with deref assumption and non-const size.
1 parent 9fbc139 commit 6b0f5e7

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

llvm/test/Transforms/LoopVectorize/single-early-exit-deref-assumptions.ll

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,50 @@ loop.end:
9494
%retval = phi i64 [ %index, %loop ], [ -1, %loop.inc ]
9595
ret i64 %retval
9696
}
97+
98+
define i64 @early_exit_alignment_and_deref_known_via_assumption(ptr noalias %p1, ptr noalias %p2, i64 %n) nofree nosync {
99+
; CHECK-LABEL: define i64 @early_exit_alignment_and_deref_known_via_assumption(
100+
; CHECK-SAME: ptr noalias [[P1:%.*]], ptr noalias [[P2:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
101+
; CHECK-NEXT: entry:
102+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P1]], i64 4), "dereferenceable"(ptr [[P1]], i64 [[N]]) ]
103+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 4), "dereferenceable"(ptr [[P2]], i64 [[N]]) ]
104+
; CHECK-NEXT: br label [[LOOP:%.*]]
105+
; CHECK: loop:
106+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 0, [[ENTRY:%.*]] ]
107+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
108+
; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
109+
; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
110+
; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
111+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
112+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
113+
; CHECK: loop.inc:
114+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
115+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], [[N]]
116+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
117+
; CHECK: loop.end:
118+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ -1, [[LOOP_INC]] ]
119+
; CHECK-NEXT: ret i64 [[RETVAL]]
120+
;
121+
entry:
122+
call void @llvm.assume(i1 true) [ "align"(ptr %p1, i64 4), "dereferenceable"(ptr %p1, i64 %n) ]
123+
call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 4), "dereferenceable"(ptr %p2, i64 %n) ]
124+
br label %loop
125+
126+
loop:
127+
%index = phi i64 [ %index.next, %loop.inc ], [ 0, %entry ]
128+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
129+
%ld1 = load i8, ptr %arrayidx, align 1
130+
%arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
131+
%ld2 = load i8, ptr %arrayidx1, align 1
132+
%cmp3 = icmp eq i8 %ld1, %ld2
133+
br i1 %cmp3, label %loop.inc, label %loop.end
134+
135+
loop.inc:
136+
%index.next = add i64 %index, 1
137+
%exitcond = icmp ne i64 %index.next, %n
138+
br i1 %exitcond, label %loop, label %loop.end
139+
140+
loop.end:
141+
%retval = phi i64 [ %index, %loop ], [ -1, %loop.inc ]
142+
ret i64 %retval
143+
}

0 commit comments

Comments
 (0)