Skip to content

Commit a2a6988

Browse files
committed
also consider element size
1 parent 6960ece commit a2a6988

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

llvm/lib/Analysis/Delinearization.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ bool llvm::validateDelinearizationResult(ScalarEvolution &SE,
792792
// (S_2 * ... * S_n) - 1 (can be proven by induction)
793793
//
794794
const SCEV *Prod = SE.getOne(Sizes[0]->getType());
795-
for (const SCEV *Size : drop_end(Sizes)) {
795+
for (const SCEV *Size : Sizes) {
796796
Prod = MulOverflow(Prod, Size);
797797
if (!Prod)
798798
return false;

llvm/test/Analysis/Delinearization/validation_large_size.ll

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,44 @@ for.i.latch:
131131
exit:
132132
ret void
133133
}
134+
135+
; for (i = 0; i < (1 << 54); i++)
136+
; for (j = 0; j < 256; j++)
137+
; A[i*256 + j] = 0;
138+
;
139+
; We also need to consider the element size when validation.
140+
;
141+
define void @elementsize_cause_ovfl(ptr %A) {
142+
; CHECK-LABEL: 'elementsize_cause_ovfl'
143+
; CHECK-NEXT: Inst: store i64 0, ptr %gep, align 4
144+
; CHECK-NEXT: AccessFunction: {{\{\{}}0,+,2048}<%for.i.header>,+,8}<%for.j>
145+
; CHECK-NEXT: Base offset: %A
146+
; CHECK-NEXT: ArrayDecl[UnknownSize][256] with elements of 8 bytes.
147+
; CHECK-NEXT: ArrayRef[{0,+,1}<nuw><nsw><%for.i.header>][{0,+,1}<nuw><nsw><%for.j>]
148+
; CHECK-NEXT: Delinearization validation: Failed
149+
;
150+
entry:
151+
br label %for.i.header
152+
153+
for.i.header:
154+
%i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.latch ]
155+
%i.mul = mul i64 %i, 256
156+
br label %for.j
157+
158+
for.j:
159+
%j = phi i64 [ 0, %for.i.header ], [ %j.inc, %for.j ]
160+
%offset = add i64 %i.mul, %j
161+
%gep = getelementptr i64, ptr %A, i64 %offset
162+
store i64 0, ptr %gep
163+
%j.inc = add i64 %j, 1
164+
%ec.j = icmp eq i64 %j.inc, 256
165+
br i1 %ec.j, label %for.i.latch, label %for.j
166+
167+
for.i.latch:
168+
%i.inc = add i64 %i, 1
169+
%ec.i = icmp eq i64 %i.inc, 18014398509481984
170+
br i1 %ec.i, label %exit, label %for.i.header
171+
172+
exit:
173+
ret void
174+
}

0 commit comments

Comments
 (0)