@@ -176,12 +176,12 @@ declare void @large_p2(ptr nocapture noundef initializes((0, 200)), ptr nocaptur
176176; Function Attrs: mustprogress nounwind uwtable
177177define i16 @large_p1_caller () {
178178; CHECK-LABEL: @large_p1_caller(
179- ; CHECK-NEXT: [[PTR:%.*]] = alloca i16 , align 2
179+ ; CHECK-NEXT: [[PTR:%.*]] = alloca [200 x i8] , align 1
180180; CHECK-NEXT: call void @large_p1(ptr [[PTR]])
181181; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
182182; CHECK-NEXT: ret i16 [[L]]
183183;
184- %ptr = alloca i16
184+ %ptr = alloca [ 200 x i8 ]
185185 call void @llvm.memset.p0.i64 (ptr %ptr , i8 42 , i64 100 , i1 false )
186186 call void @large_p1 (ptr %ptr )
187187 %l = load i16 , ptr %ptr
@@ -191,14 +191,14 @@ define i16 @large_p1_caller() {
191191; Function Attrs: mustprogress nounwind uwtable
192192define i16 @large_p2_nonalias_caller () {
193193; CHECK-LABEL: @large_p2_nonalias_caller(
194- ; CHECK-NEXT: [[PTR1:%.*]] = alloca i16 , align 2
195- ; CHECK-NEXT: [[PTR2:%.*]] = alloca i16 , align 2
194+ ; CHECK-NEXT: [[PTR1:%.*]] = alloca [200 x i8] , align 1
195+ ; CHECK-NEXT: [[PTR2:%.*]] = alloca [100 x i8] , align 1
196196; CHECK-NEXT: call void @large_p2(ptr [[PTR1]], ptr [[PTR2]])
197197; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR1]], align 2
198198; CHECK-NEXT: ret i16 [[L]]
199199;
200- %ptr1 = alloca i16
201- %ptr2 = alloca i16
200+ %ptr1 = alloca [ 200 x i8 ]
201+ %ptr2 = alloca [ 100 x i8 ]
202202 call void @llvm.memset.p0.i64 (ptr %ptr1 , i8 42 , i64 200 , i1 false )
203203 call void @llvm.memset.p0.i64 (ptr %ptr2 , i8 42 , i64 100 , i1 false )
204204 call void @large_p2 (ptr %ptr1 , ptr %ptr2 )
@@ -210,17 +210,47 @@ define i16 @large_p2_nonalias_caller() {
210210; Function Attrs: mustprogress nounwind uwtable
211211define i16 @large_p2_must_alias_caller () {
212212; CHECK-LABEL: @large_p2_must_alias_caller(
213- ; CHECK-NEXT: [[PTR:%.*]] = alloca i16 , align 2
213+ ; CHECK-NEXT: [[PTR:%.*]] = alloca [300 x i8] , align 1
214214; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 100
215215; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP1]], i8 42, i64 200, i1 false)
216216; CHECK-NEXT: call void @large_p2(ptr [[PTR]], ptr [[PTR]])
217217; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[PTR]], align 2
218218; CHECK-NEXT: ret i16 [[L]]
219219;
220- %ptr = alloca i16
220+ %ptr = alloca [ 300 x i8 ]
221221 call void @llvm.memset.p0.i64 (ptr %ptr , i8 42 , i64 300 , i1 false )
222222 call void @large_p2 (ptr %ptr , ptr %ptr )
223223 %l = load i16 , ptr %ptr
224224 ret i16 %l
225225}
226226
227+ ; Function Attrs: mustprogress nounwind uwtable
228+ define i16 @large_p2_may_or_partial_alias_caller1 (ptr %base ) {
229+ ; CHECK-LABEL: @large_p2_may_or_partial_alias_caller1(
230+ ; CHECK-NEXT: [[BASEPLUS:%.*]] = getelementptr i8, ptr [[BASE:%.*]], i64 100
231+ ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[BASE]], i8 42, i64 300, i1 false)
232+ ; CHECK-NEXT: call void @large_p2(ptr [[BASE]], ptr [[BASEPLUS]])
233+ ; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[BASE]], align 2
234+ ; CHECK-NEXT: ret i16 [[L]]
235+ ;
236+ %baseplus = getelementptr i8 , ptr %base , i64 100
237+ call void @llvm.memset.p0.i64 (ptr %base , i8 42 , i64 300 , i1 false )
238+ call void @large_p2 (ptr %base , ptr %baseplus )
239+ %l = load i16 , ptr %base
240+ ret i16 %l
241+ }
242+
243+ ; Function Attrs: mustprogress nounwind uwtable
244+ define i16 @large_p2_may_or_partial_alias_caller2 (ptr %base1 , ptr %base2 ) {
245+ ; CHECK-LABEL: @large_p2_may_or_partial_alias_caller2(
246+ ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[BASE1:%.*]], i8 42, i64 300, i1 false)
247+ ; CHECK-NEXT: call void @large_p2(ptr [[BASE1]], ptr [[BASE2:%.*]])
248+ ; CHECK-NEXT: [[L:%.*]] = load i16, ptr [[BASE1]], align 2
249+ ; CHECK-NEXT: ret i16 [[L]]
250+ ;
251+ call void @llvm.memset.p0.i64 (ptr %base1 , i8 42 , i64 300 , i1 false )
252+ call void @large_p2 (ptr %base1 , ptr %base2 )
253+ %l = load i16 , ptr %base1
254+ ret i16 %l
255+ }
256+
0 commit comments