@@ -131,3 +131,44 @@ for.i.latch:
131131exit:
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