Skip to content

Commit 658b260

Browse files
committed
[Attributor] Don't construct pretty GEPs
Bring this in line with other transforms like ArgPromotion/SROA/ SCEVExpander and always produce canonical i8 GEPs.
1 parent 5f254eb commit 658b260

File tree

9 files changed

+197
-222
lines changed

9 files changed

+197
-222
lines changed

llvm/lib/Transforms/IPO/AttributorAttributes.cpp

Lines changed: 12 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -291,42 +291,15 @@ static const Value *getPointerOperand(const Instruction *I,
291291
}
292292

293293
/// Helper function to create a pointer based on \p Ptr, and advanced by \p
294-
/// Offset bytes. To aid later analysis the method tries to build
295-
/// getelement pointer instructions that traverse the natural type of \p Ptr if
296-
/// possible. If that fails, the remaining offset is adjusted byte-wise, hence
297-
/// through a cast to i8*.
298-
///
299-
/// TODO: This could probably live somewhere more prominantly if it doesn't
300-
/// already exist.
301-
static Value *constructPointer(Type *PtrElemTy, Value *Ptr, int64_t Offset,
302-
IRBuilder<NoFolder> &IRB, const DataLayout &DL) {
303-
assert(Offset >= 0 && "Negative offset not supported yet!");
294+
/// Offset bytes.
295+
static Value *constructPointer(Value *Ptr, int64_t Offset,
296+
IRBuilder<NoFolder> &IRB) {
304297
LLVM_DEBUG(dbgs() << "Construct pointer: " << *Ptr << " + " << Offset
305298
<< "-bytes\n");
306299

307-
if (Offset) {
308-
Type *Ty = PtrElemTy;
309-
APInt IntOffset(DL.getIndexTypeSizeInBits(Ptr->getType()), Offset);
310-
SmallVector<APInt> IntIndices = DL.getGEPIndicesForOffset(Ty, IntOffset);
311-
312-
SmallVector<Value *, 4> ValIndices;
313-
std::string GEPName = Ptr->getName().str();
314-
for (const APInt &Index : IntIndices) {
315-
ValIndices.push_back(IRB.getInt(Index));
316-
GEPName += "." + std::to_string(Index.getZExtValue());
317-
}
318-
319-
// Create a GEP for the indices collected above.
320-
Ptr = IRB.CreateGEP(PtrElemTy, Ptr, ValIndices, GEPName);
321-
322-
// If an offset is left we use byte-wise adjustment.
323-
if (IntOffset != 0) {
324-
Ptr = IRB.CreateGEP(IRB.getInt8Ty(), Ptr, IRB.getInt(IntOffset),
325-
GEPName + ".b" + Twine(IntOffset.getZExtValue()));
326-
}
327-
}
328-
329-
LLVM_DEBUG(dbgs() << "Constructed pointer: " << *Ptr << "\n");
300+
if (Offset)
301+
Ptr = IRB.CreateGEP(IRB.getInt8Ty(), Ptr, IRB.getInt64(Offset),
302+
Ptr->getName() + ".b" + Twine(Offset));
330303
return Ptr;
331304
}
332305

@@ -7487,16 +7460,15 @@ struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {
74877460
if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) {
74887461
const StructLayout *PrivStructLayout = DL.getStructLayout(PrivStructType);
74897462
for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++) {
7490-
Value *Ptr = constructPointer(
7491-
PrivType, &Base, PrivStructLayout->getElementOffset(u), IRB, DL);
7463+
Value *Ptr =
7464+
constructPointer(&Base, PrivStructLayout->getElementOffset(u), IRB);
74927465
new StoreInst(F.getArg(ArgNo + u), Ptr, &IP);
74937466
}
74947467
} else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) {
74957468
Type *PointeeTy = PrivArrayType->getElementType();
74967469
uint64_t PointeeTySize = DL.getTypeStoreSize(PointeeTy);
74977470
for (unsigned u = 0, e = PrivArrayType->getNumElements(); u < e; u++) {
7498-
Value *Ptr =
7499-
constructPointer(PrivType, &Base, u * PointeeTySize, IRB, DL);
7471+
Value *Ptr = constructPointer(&Base, u * PointeeTySize, IRB);
75007472
new StoreInst(F.getArg(ArgNo + u), Ptr, &IP);
75017473
}
75027474
} else {
@@ -7521,8 +7493,8 @@ struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {
75217493
const StructLayout *PrivStructLayout = DL.getStructLayout(PrivStructType);
75227494
for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++) {
75237495
Type *PointeeTy = PrivStructType->getElementType(u);
7524-
Value *Ptr = constructPointer(
7525-
PrivType, Base, PrivStructLayout->getElementOffset(u), IRB, DL);
7496+
Value *Ptr =
7497+
constructPointer(Base, PrivStructLayout->getElementOffset(u), IRB);
75267498
LoadInst *L = new LoadInst(PointeeTy, Ptr, "", IP);
75277499
L->setAlignment(Alignment);
75287500
ReplacementValues.push_back(L);
@@ -7531,8 +7503,7 @@ struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {
75317503
Type *PointeeTy = PrivArrayType->getElementType();
75327504
uint64_t PointeeTySize = DL.getTypeStoreSize(PointeeTy);
75337505
for (unsigned u = 0, e = PrivArrayType->getNumElements(); u < e; u++) {
7534-
Value *Ptr =
7535-
constructPointer(PrivType, Base, u * PointeeTySize, IRB, DL);
7506+
Value *Ptr = constructPointer(Base, u * PointeeTySize, IRB);
75367507
LoadInst *L = new LoadInst(PointeeTy, Ptr, "", IP);
75377508
L->setAlignment(Alignment);
75387509
ReplacementValues.push_back(L);

llvm/test/Transforms/Attributor/ArgumentPromotion/array.ll

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ define void @caller() {
1111
; TUNIT-NEXT: entry:
1212
; TUNIT-NEXT: [[LEFT:%.*]] = alloca [3 x i32], align 4
1313
; TUNIT-NEXT: [[TMP0:%.*]] = load i32, ptr [[LEFT]], align 4
14-
; TUNIT-NEXT: [[LEFT_0_1:%.*]] = getelementptr [3 x i32], ptr [[LEFT]], i64 0, i64 1
15-
; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[LEFT_0_1]], align 4
16-
; TUNIT-NEXT: [[LEFT_0_2:%.*]] = getelementptr [3 x i32], ptr [[LEFT]], i64 0, i64 2
17-
; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[LEFT_0_2]], align 4
14+
; TUNIT-NEXT: [[LEFT_B4:%.*]] = getelementptr i8, ptr [[LEFT]], i64 4
15+
; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[LEFT_B4]], align 4
16+
; TUNIT-NEXT: [[LEFT_B8:%.*]] = getelementptr i8, ptr [[LEFT]], i64 8
17+
; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[LEFT_B8]], align 4
1818
; TUNIT-NEXT: call void @callee(i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
1919
; TUNIT-NEXT: ret void
2020
;
@@ -36,10 +36,10 @@ define internal void @callee(ptr noalias %arg) {
3636
; CHECK-NEXT: entry:
3737
; CHECK-NEXT: [[ARG_PRIV:%.*]] = alloca [3 x i32], align 4
3838
; CHECK-NEXT: store i32 [[TMP0]], ptr [[ARG_PRIV]], align 4
39-
; CHECK-NEXT: [[ARG_PRIV_0_1:%.*]] = getelementptr [3 x i32], ptr [[ARG_PRIV]], i64 0, i64 1
40-
; CHECK-NEXT: store i32 [[TMP1]], ptr [[ARG_PRIV_0_1]], align 4
41-
; CHECK-NEXT: [[ARG_PRIV_0_2:%.*]] = getelementptr [3 x i32], ptr [[ARG_PRIV]], i64 0, i64 2
42-
; CHECK-NEXT: store i32 [[TMP2]], ptr [[ARG_PRIV_0_2]], align 4
39+
; CHECK-NEXT: [[ARG_PRIV_B4:%.*]] = getelementptr i8, ptr [[ARG_PRIV]], i64 4
40+
; CHECK-NEXT: store i32 [[TMP1]], ptr [[ARG_PRIV_B4]], align 4
41+
; CHECK-NEXT: [[ARG_PRIV_B8:%.*]] = getelementptr i8, ptr [[ARG_PRIV]], i64 8
42+
; CHECK-NEXT: store i32 [[TMP2]], ptr [[ARG_PRIV_B8]], align 4
4343
; CHECK-NEXT: call void @use(ptr noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(12) [[ARG_PRIV]])
4444
; CHECK-NEXT: ret void
4545
;
@@ -48,5 +48,7 @@ entry:
4848
ret void
4949
}
5050
;.
51-
; CHECK: attributes #[[ATTR0]] = { memory(readwrite, argmem: none) }
51+
; TUNIT: attributes #[[ATTR0]] = { memory(readwrite, argmem: none) }
52+
;.
53+
; CGSCC: attributes #[[ATTR0]] = { memory(readwrite, argmem: none) }
5254
;.

llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ define internal i32 @f(ptr byval(%struct.ss) %b, ptr byval(i32) %X, i32 %i) noun
1515
; CHECK-NEXT: store i32 [[TMP2]], ptr [[X_PRIV]], align 4
1616
; CHECK-NEXT: [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
1717
; CHECK-NEXT: store i32 [[TMP0]], ptr [[B_PRIV]], align 4
18-
; CHECK-NEXT: [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], ptr [[B_PRIV]], i64 0, i32 1
19-
; CHECK-NEXT: store i64 [[TMP1]], ptr [[B_PRIV_0_1]], align 4
20-
; CHECK-NEXT: [[TRUETMP1:%.*]] = load i32, ptr [[B_PRIV]], align 8
21-
; CHECK-NEXT: [[TRUETMP2:%.*]] = add i32 [[TRUETMP1]], 1
22-
; CHECK-NEXT: store i32 [[TRUETMP2]], ptr [[B_PRIV]], align 8
18+
; CHECK-NEXT: [[B_PRIV_B4:%.*]] = getelementptr i8, ptr [[B_PRIV]], i64 4
19+
; CHECK-NEXT: store i64 [[TMP1]], ptr [[B_PRIV_B4]], align 4
20+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_PRIV]], align 8
21+
; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], 1
22+
; CHECK-NEXT: store i32 [[TMP2]], ptr [[B_PRIV]], align 8
2323
; CHECK-NEXT: store i32 0, ptr [[X_PRIV]], align 4
2424
; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[X_PRIV]], align 4
25-
; CHECK-NEXT: [[A:%.*]] = add i32 [[L]], [[TRUETMP2]]
25+
; CHECK-NEXT: [[A:%.*]] = add i32 [[L]], [[TMP2]]
2626
; CHECK-NEXT: ret i32 [[A]]
2727
;
2828
entry:
@@ -46,10 +46,10 @@ define i32 @test(ptr %X) {
4646
; TUNIT-NEXT: entry:
4747
; TUNIT-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
4848
; TUNIT-NEXT: store i32 1, ptr [[S]], align 8
49-
; TUNIT-NEXT: [[TRUETMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
49+
; TUNIT-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
5050
; TUNIT-NEXT: [[TMP0:%.*]] = load i32, ptr [[S]], align 8
51-
; TUNIT-NEXT: [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i64 0, i32 1
52-
; TUNIT-NEXT: [[TMP1:%.*]] = load i64, ptr [[S_0_1]], align 8
51+
; TUNIT-NEXT: [[S_B4:%.*]] = getelementptr i8, ptr [[S]], i64 4
52+
; TUNIT-NEXT: [[TMP1:%.*]] = load i64, ptr [[S_B4]], align 8
5353
; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[X]], align 4
5454
; TUNIT-NEXT: [[C:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]], i32 [[TMP2]]) #[[ATTR2:[0-9]+]]
5555
; TUNIT-NEXT: ret i32 [[C]]
@@ -59,7 +59,7 @@ define i32 @test(ptr %X) {
5959
; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[X:%.*]]) #[[ATTR1:[0-9]+]] {
6060
; CGSCC-NEXT: entry:
6161
; CGSCC-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
62-
; CGSCC-NEXT: [[TRUETMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
62+
; CGSCC-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
6363
; CGSCC-NEXT: [[TMP0:%.*]] = load i32, ptr [[X]], align 4
6464
; CGSCC-NEXT: [[C:%.*]] = call i32 @f(i32 noundef 1, i64 noundef 2, i32 [[TMP0]]) #[[ATTR2:[0-9]+]]
6565
; CGSCC-NEXT: ret i32 [[C]]

llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ define internal void @f(ptr byval(%struct.ss) %b, ptr byval(i32) %X) nounwind
1313
; CHECK-NEXT: store i32 [[TMP2]], ptr [[X_PRIV]], align 4
1414
; CHECK-NEXT: [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
1515
; CHECK-NEXT: store i32 [[TMP0]], ptr [[B_PRIV]], align 4
16-
; CHECK-NEXT: [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], ptr [[B_PRIV]], i64 0, i32 1
17-
; CHECK-NEXT: store i64 [[TMP1]], ptr [[B_PRIV_0_1]], align 4
18-
; CHECK-NEXT: [[TRUETMP1:%.*]] = load i32, ptr [[B_PRIV]], align 8
19-
; CHECK-NEXT: [[TRUETMP2:%.*]] = add i32 [[TRUETMP1]], 1
20-
; CHECK-NEXT: store i32 [[TRUETMP2]], ptr [[B_PRIV]], align 8
16+
; CHECK-NEXT: [[B_PRIV_B4:%.*]] = getelementptr i8, ptr [[B_PRIV]], i64 4
17+
; CHECK-NEXT: store i64 [[TMP1]], ptr [[B_PRIV_B4]], align 4
18+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_PRIV]], align 8
19+
; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], 1
20+
; CHECK-NEXT: store i32 [[TMP2]], ptr [[B_PRIV]], align 8
2121
; CHECK-NEXT: store i32 0, ptr [[X_PRIV]], align 4
2222
; CHECK-NEXT: ret void
2323
;
@@ -38,10 +38,10 @@ define i32 @test(ptr %X) {
3838
; TUNIT-NEXT: entry:
3939
; TUNIT-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
4040
; TUNIT-NEXT: store i32 1, ptr [[S]], align 8
41-
; TUNIT-NEXT: [[TRUETMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
41+
; TUNIT-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
4242
; TUNIT-NEXT: [[TMP0:%.*]] = load i32, ptr [[S]], align 8
43-
; TUNIT-NEXT: [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i64 0, i32 1
44-
; TUNIT-NEXT: [[TMP1:%.*]] = load i64, ptr [[S_0_1]], align 8
43+
; TUNIT-NEXT: [[S_B4:%.*]] = getelementptr i8, ptr [[S]], i64 4
44+
; TUNIT-NEXT: [[TMP1:%.*]] = load i64, ptr [[S_B4]], align 8
4545
; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[X]], align 4
4646
; TUNIT-NEXT: call void @f(i32 [[TMP0]], i64 [[TMP1]], i32 [[TMP2]]) #[[ATTR2:[0-9]+]]
4747
; TUNIT-NEXT: ret i32 0
@@ -51,7 +51,7 @@ define i32 @test(ptr %X) {
5151
; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[X:%.*]]) #[[ATTR1:[0-9]+]] {
5252
; CGSCC-NEXT: entry:
5353
; CGSCC-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
54-
; CGSCC-NEXT: [[TRUETMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
54+
; CGSCC-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
5555
; CGSCC-NEXT: ret i32 0
5656
;
5757
entry:

llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ define internal i32 @f(ptr byval(%struct.ss) %b) nounwind {
1313
; CHECK-NEXT: entry:
1414
; CHECK-NEXT: [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
1515
; CHECK-NEXT: store i32 [[TMP0]], ptr [[B_PRIV]], align 4
16-
; CHECK-NEXT: [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], ptr [[B_PRIV]], i64 0, i32 1
17-
; CHECK-NEXT: store i64 [[TMP1]], ptr [[B_PRIV_0_1]], align 4
18-
; CHECK-NEXT: [[TRUETMP1:%.*]] = load i32, ptr [[B_PRIV]], align 8
19-
; CHECK-NEXT: [[TRUETMP2:%.*]] = add i32 [[TRUETMP1]], 1
20-
; CHECK-NEXT: store i32 [[TRUETMP2]], ptr [[B_PRIV]], align 8
21-
; CHECK-NEXT: ret i32 [[TRUETMP1]]
16+
; CHECK-NEXT: [[B_PRIV_B4:%.*]] = getelementptr i8, ptr [[B_PRIV]], i64 4
17+
; CHECK-NEXT: store i64 [[TMP1]], ptr [[B_PRIV_B4]], align 4
18+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_PRIV]], align 8
19+
; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], 1
20+
; CHECK-NEXT: store i32 [[TMP2]], ptr [[B_PRIV]], align 8
21+
; CHECK-NEXT: ret i32 [[TMP1]]
2222
;
2323
entry:
2424
%tmp1 = load i32, ptr %b, align 4
@@ -35,12 +35,12 @@ define internal i32 @g(ptr byval(%struct.ss) align 32 %b) nounwind {
3535
; CHECK-NEXT: entry:
3636
; CHECK-NEXT: [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
3737
; CHECK-NEXT: store i32 [[TMP0]], ptr [[B_PRIV]], align 4
38-
; CHECK-NEXT: [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], ptr [[B_PRIV]], i64 0, i32 1
39-
; CHECK-NEXT: store i64 [[TMP1]], ptr [[B_PRIV_0_1]], align 4
40-
; CHECK-NEXT: [[TRUETMP1:%.*]] = load i32, ptr [[B_PRIV]], align 32
41-
; CHECK-NEXT: [[TRUETMP2:%.*]] = add i32 [[TRUETMP1]], 1
42-
; CHECK-NEXT: store i32 [[TRUETMP2]], ptr [[B_PRIV]], align 32
43-
; CHECK-NEXT: ret i32 [[TRUETMP2]]
38+
; CHECK-NEXT: [[B_PRIV_B4:%.*]] = getelementptr i8, ptr [[B_PRIV]], i64 4
39+
; CHECK-NEXT: store i64 [[TMP1]], ptr [[B_PRIV_B4]], align 4
40+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_PRIV]], align 32
41+
; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], 1
42+
; CHECK-NEXT: store i32 [[TMP2]], ptr [[B_PRIV]], align 32
43+
; CHECK-NEXT: ret i32 [[TMP2]]
4444
;
4545
entry:
4646
%tmp1 = load i32, ptr %b, align 4
@@ -57,14 +57,14 @@ define i32 @main() nounwind {
5757
; TUNIT-NEXT: entry:
5858
; TUNIT-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
5959
; TUNIT-NEXT: store i32 1, ptr [[S]], align 32
60-
; TUNIT-NEXT: [[TRUETMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
60+
; TUNIT-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
6161
; TUNIT-NEXT: [[TMP0:%.*]] = load i32, ptr [[S]], align 8
62-
; TUNIT-NEXT: [[S_0_11:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i64 0, i32 1
63-
; TUNIT-NEXT: [[TMP1:%.*]] = load i64, ptr [[S_0_11]], align 8
62+
; TUNIT-NEXT: [[S_B4:%.*]] = getelementptr i8, ptr [[S]], i64 4
63+
; TUNIT-NEXT: [[TMP1:%.*]] = load i64, ptr [[S_B4]], align 8
6464
; TUNIT-NEXT: [[C0:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]]) #[[ATTR1:[0-9]+]]
6565
; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[S]], align 32
66-
; TUNIT-NEXT: [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i64 0, i32 1
67-
; TUNIT-NEXT: [[TMP3:%.*]] = load i64, ptr [[S_0_1]], align 32
66+
; TUNIT-NEXT: [[S_B41:%.*]] = getelementptr i8, ptr [[S]], i64 4
67+
; TUNIT-NEXT: [[TMP3:%.*]] = load i64, ptr [[S_B41]], align 32
6868
; TUNIT-NEXT: [[C1:%.*]] = call i32 @g(i32 [[TMP2]], i64 [[TMP3]]) #[[ATTR1]]
6969
; TUNIT-NEXT: [[A:%.*]] = add i32 [[C0]], [[C1]]
7070
; TUNIT-NEXT: ret i32 [[A]]
@@ -74,7 +74,7 @@ define i32 @main() nounwind {
7474
; CGSCC-SAME: () #[[ATTR1:[0-9]+]] {
7575
; CGSCC-NEXT: entry:
7676
; CGSCC-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
77-
; CGSCC-NEXT: [[TRUETMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
77+
; CGSCC-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
7878
; CGSCC-NEXT: [[C0:%.*]] = call i32 @f(i32 noundef 1, i64 noundef 2) #[[ATTR2:[0-9]+]]
7979
; CGSCC-NEXT: [[C1:%.*]] = call i32 @g(i32 noundef 1, i64 noundef 2) #[[ATTR2]]
8080
; CGSCC-NEXT: [[A:%.*]] = add i32 [[C0]], [[C1]]

llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ target triple = "x86_64-unknown-linux-gnu"
1414
@a = internal global %struct.Foo { i32 1, i64 2 }, align 8
1515

1616
;.
17-
; CHECK: @[[B:[a-zA-Z0-9_$"\\.-]+]] = internal global [[STRUCT_S:%.*]] { double 3.140000e+00, i16 9439, i8 25, [5 x i8] undef }, align 16
18-
; CHECK: @[[A:[a-zA-Z0-9_$"\\.-]+]] = internal global [[STRUCT_FOO:%.*]] { i32 1, i64 2 }, align 8
17+
; CHECK: @b = internal global %struct.s { double 3.140000e+00, i16 9439, i8 25, [5 x i8] undef }, align 16
18+
; CHECK: @a = internal global %struct.Foo { i32 1, i64 2 }, align 8
1919
;.
2020
define void @run() {
2121
;
@@ -82,8 +82,8 @@ define internal i64 @CaptureAStruct(ptr byval(%struct.Foo) %a) {
8282
; CGSCC-NEXT: entry:
8383
; CGSCC-NEXT: [[A_PRIV:%.*]] = alloca [[STRUCT_FOO:%.*]], align 8
8484
; CGSCC-NEXT: store i32 [[TMP0]], ptr [[A_PRIV]], align 4
85-
; CGSCC-NEXT: [[A_PRIV_0_1:%.*]] = getelementptr [[STRUCT_FOO]], ptr [[A_PRIV]], i64 0, i32 1
86-
; CGSCC-NEXT: store i64 [[TMP1]], ptr [[A_PRIV_0_1]], align 8
85+
; CGSCC-NEXT: [[A_PRIV_B8:%.*]] = getelementptr i8, ptr [[A_PRIV]], i64 8
86+
; CGSCC-NEXT: store i64 [[TMP1]], ptr [[A_PRIV_B8]], align 8
8787
; CGSCC-NEXT: [[A_PTR:%.*]] = alloca ptr, align 8
8888
; CGSCC-NEXT: br label [[LOOP:%.*]]
8989
; CGSCC: loop:

llvm/test/Transforms/Attributor/ArgumentPromotion/tail.ll

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ define internal void @bar(ptr byval(%pair) %Data) {
1515
; TUNIT-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] {
1616
; TUNIT-NEXT: [[DATA_PRIV:%.*]] = alloca [[PAIR:%.*]], align 8
1717
; TUNIT-NEXT: store i32 [[TMP0]], ptr [[DATA_PRIV]], align 4
18-
; TUNIT-NEXT: [[DATA_PRIV_0_1:%.*]] = getelementptr [[PAIR]], ptr [[DATA_PRIV]], i64 0, i32 1
19-
; TUNIT-NEXT: store i32 [[TMP1]], ptr [[DATA_PRIV_0_1]], align 4
18+
; TUNIT-NEXT: [[DATA_PRIV_B4:%.*]] = getelementptr i8, ptr [[DATA_PRIV]], i64 4
19+
; TUNIT-NEXT: store i32 [[TMP1]], ptr [[DATA_PRIV_B4]], align 4
2020
; TUNIT-NEXT: [[TMP3:%.*]] = call ptr @foo(ptr nonnull dereferenceable(8) [[DATA_PRIV]])
2121
; TUNIT-NEXT: ret void
2222
;
@@ -25,8 +25,8 @@ define internal void @bar(ptr byval(%pair) %Data) {
2525
; CGSCC-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] {
2626
; CGSCC-NEXT: [[DATA_PRIV:%.*]] = alloca [[PAIR:%.*]], align 8
2727
; CGSCC-NEXT: store i32 [[TMP0]], ptr [[DATA_PRIV]], align 4
28-
; CGSCC-NEXT: [[DATA_PRIV_0_1:%.*]] = getelementptr [[PAIR]], ptr [[DATA_PRIV]], i64 0, i32 1
29-
; CGSCC-NEXT: store i32 [[TMP1]], ptr [[DATA_PRIV_0_1]], align 4
28+
; CGSCC-NEXT: [[DATA_PRIV_B4:%.*]] = getelementptr i8, ptr [[DATA_PRIV]], i64 4
29+
; CGSCC-NEXT: store i32 [[TMP1]], ptr [[DATA_PRIV_B4]], align 4
3030
; CGSCC-NEXT: [[TMP3:%.*]] = call ptr @foo(ptr noundef nonnull dereferenceable(8) [[DATA_PRIV]])
3131
; CGSCC-NEXT: ret void
3232
;
@@ -38,24 +38,26 @@ define void @zed(ptr byval(%pair) %Data) {
3838
; TUNIT-LABEL: define {{[^@]+}}@zed
3939
; TUNIT-SAME: (ptr noalias nocapture nonnull readonly byval([[PAIR:%.*]]) dereferenceable(8) [[DATA:%.*]]) {
4040
; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[DATA]], align 1
41-
; TUNIT-NEXT: [[DATA_0_1:%.*]] = getelementptr [[PAIR]], ptr [[DATA]], i64 0, i32 1
42-
; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DATA_0_1]], align 1
41+
; TUNIT-NEXT: [[DATA_B4:%.*]] = getelementptr i8, ptr [[DATA]], i64 4
42+
; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DATA_B4]], align 1
4343
; TUNIT-NEXT: call void @bar(i32 [[TMP1]], i32 [[TMP2]])
4444
; TUNIT-NEXT: ret void
4545
;
4646
; CGSCC-LABEL: define {{[^@]+}}@zed
4747
; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull readonly byval([[PAIR:%.*]]) dereferenceable(8) [[DATA:%.*]]) {
4848
; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr [[DATA]], align 1
49-
; CGSCC-NEXT: [[DATA_0_1:%.*]] = getelementptr [[PAIR]], ptr [[DATA]], i64 0, i32 1
50-
; CGSCC-NEXT: [[TMP2:%.*]] = load i32, ptr [[DATA_0_1]], align 1
49+
; CGSCC-NEXT: [[DATA_B4:%.*]] = getelementptr i8, ptr [[DATA]], i64 4
50+
; CGSCC-NEXT: [[TMP2:%.*]] = load i32, ptr [[DATA_B4]], align 1
5151
; CGSCC-NEXT: call void @bar(i32 [[TMP1]], i32 [[TMP2]])
5252
; CGSCC-NEXT: ret void
5353
;
5454
call void @bar(ptr byval(%pair) %Data)
5555
ret void
5656
}
5757
;.
58-
; CHECK: attributes #[[ATTR0:[0-9]+]] = { memory(readwrite, argmem: none) }
58+
; TUNIT: attributes #[[ATTR0]] = { memory(readwrite, argmem: none) }
59+
;.
60+
; CGSCC: attributes #[[ATTR0]] = { memory(readwrite, argmem: none) }
5961
;.
6062
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
6163
; CHECK: {{.*}}

0 commit comments

Comments
 (0)