Skip to content

Commit e058013

Browse files
committed
fixup! [clang][CodeGen] add addr space cast if needed when storing ptrs
1 parent d82e5d4 commit e058013

File tree

8 files changed

+33
-33
lines changed

8 files changed

+33
-33
lines changed

clang/lib/CodeGen/CGDecl.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,11 +1563,10 @@ CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D) {
15631563
// The named return value optimization: allocate this variable in the
15641564
// return slot, so that we can elide the copy when returning this
15651565
// variable (C++0x [class.copy]p34).
1566-
address = ReturnValue;
15671566
AllocaAddr =
15681567
RawAddress(ReturnValue.emitRawPointer(*this),
15691568
ReturnValue.getElementType(), ReturnValue.getAlignment());
1570-
;
1569+
address = MaybeCastAllocaAddressSpace(AllocaAddr, Ty.getAddressSpace());
15711570

15721571
if (const RecordType *RecordTy = Ty->getAs<RecordType>()) {
15731572
const auto *RD = RecordTy->getOriginalDecl()->getDefinitionOrSelf();

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,9 @@ CodeGenFunction::CreateTempAllocaWithoutCast(llvm::Type *Ty, CharUnits Align,
108108
return RawAddress(Alloca, Ty, Align, KnownNonNull);
109109
}
110110

111-
RawAddress CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, LangAS DestLangAS,
112-
CharUnits Align, const Twine &Name,
113-
llvm::Value *ArraySize,
114-
RawAddress *AllocaAddr) {
115-
RawAddress Alloca = CreateTempAllocaWithoutCast(Ty, Align, Name, ArraySize);
116-
if (AllocaAddr)
117-
*AllocaAddr = Alloca;
111+
RawAddress CodeGenFunction::MaybeCastAllocaAddressSpace(
112+
RawAddress Alloca, LangAS DestLangAS, llvm::Value *ArraySize) {
113+
118114
llvm::Value *V = Alloca.getPointer();
119115
// Alloca always returns a pointer in alloca address space, which may
120116
// be different from the type defined by the language. For example,
@@ -134,7 +130,18 @@ RawAddress CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, LangAS DestLangAS,
134130
/*IsNonNull=*/true);
135131
}
136132

137-
return RawAddress(V, Ty, Align, KnownNonNull);
133+
return RawAddress(V, Alloca.getElementType(), Alloca.getAlignment(),
134+
KnownNonNull);
135+
}
136+
137+
RawAddress CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, LangAS DestLangAS,
138+
CharUnits Align, const Twine &Name,
139+
llvm::Value *ArraySize,
140+
RawAddress *AllocaAddr) {
141+
RawAddress Alloca = CreateTempAllocaWithoutCast(Ty, Align, Name, ArraySize);
142+
if (AllocaAddr)
143+
*AllocaAddr = Alloca;
144+
return MaybeCastAllocaAddressSpace(Alloca, DestLangAS, ArraySize);
138145
}
139146

140147
/// CreateTempAlloca - This creates an alloca and inserts it into the entry
@@ -2209,18 +2216,6 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, Address Addr,
22092216
}
22102217
}
22112218

2212-
// When storing a pointer, perform address space cast if needed.
2213-
if (auto *ValueTy = dyn_cast<llvm::PointerType>(Value->getType())) {
2214-
if (auto *MemTy = dyn_cast<llvm::PointerType>(Addr.getElementType())) {
2215-
LangAS ValueAS = getLangASFromTargetAS(ValueTy->getAddressSpace());
2216-
LangAS MemAS = getLangASFromTargetAS(MemTy->getAddressSpace());
2217-
if (ValueAS != MemAS) {
2218-
Value =
2219-
getTargetHooks().performAddrSpaceCast(*this, Value, ValueAS, MemTy);
2220-
}
2221-
}
2222-
}
2223-
22242219
Value = EmitToMemory(Value, Ty);
22252220

22262221
LValue AtomicLValue =

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2804,6 +2804,13 @@ class CodeGenFunction : public CodeGenTypeCache {
28042804
AllocaTracker Tracker;
28052805
};
28062806

2807+
private:
2808+
/// If \p Alloca is not in the same address space as \p DestLangAS, insert an
2809+
/// address space cast and return a new RawAddress based on this value.
2810+
RawAddress MaybeCastAllocaAddressSpace(RawAddress Alloca, LangAS DestLangAS,
2811+
llvm::Value *ArraySize = nullptr);
2812+
2813+
public:
28072814
/// CreateTempAlloca - This creates an alloca and inserts it into the entry
28082815
/// block if \p ArraySize is nullptr, otherwise inserts it at the current
28092816
/// insertion point of the builder. The caller is responsible for setting an

clang/test/CodeGenCXX/amdgcn-func-arg.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,9 @@ void func_with_ref_arg(B &b);
2424
// CHECK-NEXT: [[P:%.*]] = alloca ptr, align 8, addrspace(5)
2525
// CHECK-NEXT: [[A_INDIRECT_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_INDIRECT_ADDR]] to ptr
2626
// CHECK-NEXT: [[P_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[P]] to ptr
27-
// CHECK-NEXT: [[A_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A:%.*]] to ptr
28-
// CHECK-NEXT: store ptr [[A_ASCAST]], ptr [[A_INDIRECT_ADDR_ASCAST]], align 8
29-
// CHECK-NEXT: [[A_ASCAST1:%.*]] = addrspacecast ptr addrspace(5) [[A]] to ptr
30-
// CHECK-NEXT: store ptr [[A_ASCAST1]], ptr [[P_ASCAST]], align 8
27+
// CHECK-NEXT: store ptr addrspace(5) [[A:%.*]], ptr [[A_INDIRECT_ADDR_ASCAST]], align 8
28+
// CHECK-NEXT: [[A_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A]] to ptr
29+
// CHECK-NEXT: store ptr [[A_ASCAST]], ptr [[P_ASCAST]], align 8
3130
// CHECK-NEXT: ret void
3231
//
3332
void func_with_indirect_arg(A a) {

clang/test/CodeGenCXX/sret_cast_with_nonzero_alloca_as.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,15 @@ struct X { int z[17]; };
1010
// CHECK-NEXT: [[Y_ADDR:%.*]] = alloca i8, align 1, addrspace(5)
1111
// CHECK-NEXT: [[X_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[X_ADDR]] to ptr
1212
// CHECK-NEXT: [[Y_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[Y_ADDR]] to ptr
13+
// CHECK-NEXT: [[AGG_RESULT_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[AGG_RESULT]] to ptr
1314
// CHECK-NEXT: store i8 [[X]], ptr [[X_ADDR_ASCAST]], align 1
1415
// CHECK-NEXT: store i8 [[Y]], ptr [[Y_ADDR_ASCAST]], align 1
1516
// CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[X_ADDR_ASCAST]], align 1
16-
// CHECK-NEXT: [[AGG_RESULT_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[AGG_RESULT]] to ptr
1717
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[AGG_RESULT_ASCAST]], i64 1
1818
// CHECK-NEXT: store i8 [[TMP0]], ptr [[ADD_PTR]], align 1
1919
// CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[Y_ADDR_ASCAST]], align 1
20-
// CHECK-NEXT: [[AGG_RESULT_ASCAST1:%.*]] = addrspacecast ptr addrspace(5) [[AGG_RESULT]] to ptr
21-
// CHECK-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[AGG_RESULT_ASCAST1]], i64 2
22-
// CHECK-NEXT: store i8 [[TMP1]], ptr [[ADD_PTR2]], align 1
20+
// CHECK-NEXT: [[ADD_PTR1:%.*]] = getelementptr inbounds i8, ptr [[AGG_RESULT_ASCAST]], i64 2
21+
// CHECK-NEXT: store i8 [[TMP1]], ptr [[ADD_PTR1]], align 1
2322
// CHECK-NEXT: ret void
2423
//
2524
X foo(char x, char y) {

clang/test/CodeGenHIP/store-addr-space.hip

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ struct Foo {
1919
// AMDGCN-NEXT: [[DST:%.*]] = alloca [[UNION_ANON:%.*]], align 8, addrspace(5)
2020
// AMDGCN-NEXT: [[RESULT_PTR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RESULT_PTR]] to ptr
2121
// AMDGCN-NEXT: [[SRC_PTR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[SRC_PTR_ADDR]] to ptr
22+
// AMDGCN-NEXT: [[AGG_RESULT_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[AGG_RESULT]] to ptr
2223
// AMDGCN-NEXT: [[DST_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DST]] to ptr
2324
// AMDGCN-NEXT: store ptr addrspace(5) [[AGG_RESULT]], ptr [[RESULT_PTR_ASCAST]], align 4
2425
// AMDGCN-NEXT: store ptr [[SRC_PTR]], ptr [[SRC_PTR_ADDR_ASCAST]], align 8
25-
// AMDGCN-NEXT: [[AGG_RESULT_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[AGG_RESULT]] to ptr
2626
// AMDGCN-NEXT: call void @_ZN3FooC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[AGG_RESULT_ASCAST]]) #[[ATTR1:[0-9]+]]
27-
// AMDGCN-NEXT: [[AGG_RESULT_ASCAST1:%.*]] = addrspacecast ptr addrspace(5) [[AGG_RESULT]] to ptr
28-
// AMDGCN-NEXT: store ptr [[AGG_RESULT_ASCAST1]], ptr [[DST_ASCAST]], align 8
27+
// AMDGCN-NEXT: store ptr [[AGG_RESULT_ASCAST]], ptr [[DST_ASCAST]], align 8
2928
// AMDGCN-NEXT: [[TMP0:%.*]] = load ptr, ptr [[SRC_PTR_ADDR_ASCAST]], align 8
3029
// AMDGCN-NEXT: [[VAL:%.*]] = getelementptr inbounds nuw [[STRUCT_FOO]], ptr [[TMP0]], i32 0, i32 0
3130
// AMDGCN-NEXT: [[TMP1:%.*]] = load i64, ptr [[VAL]], align 8

clang/test/CodeGenOpenCL/addr-space-struct-arg.cl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,7 @@ kernel void KernelLargeTwoMember(struct LargeStructTwoMember u) {
647647
// AMDGCN20-NEXT: [[IN:%.*]] = alloca [[STRUCT_MAT3X3:%.*]], align 4, addrspace(5)
648648
// AMDGCN20-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr
649649
// AMDGCN20-NEXT: [[IN1:%.*]] = addrspacecast ptr addrspace(5) [[IN]] to ptr
650+
// AMDGCN20-NEXT: [[RETVAL_ASCAST_ASCAST:%.*]] = addrspacecast ptr [[RETVAL_ASCAST]] to ptr addrspace(5)
650651
// AMDGCN20-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_MAT3X3]], ptr [[IN1]], i32 0, i32 0
651652
// AMDGCN20-NEXT: store [9 x i32] [[IN_COERCE]], ptr [[COERCE_DIVE]], align 4
652653
// AMDGCN20-NEXT: [[TMP0:%.*]] = load [[STRUCT_MAT4X4]], ptr [[RETVAL_ASCAST]], align 4

clang/test/CodeGenOpenCL/amdgpu-abi-struct-arg-byref.cl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ kernel void KernelLargeTwoMember(struct LargeStructTwoMember u) {
121121
// AMDGCN-NEXT: [[IN:%.*]] = alloca [[STRUCT_MAT3X3:%.*]], align 4, addrspace(5)
122122
// AMDGCN-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr
123123
// AMDGCN-NEXT: [[IN1:%.*]] = addrspacecast ptr addrspace(5) [[IN]] to ptr
124+
// AMDGCN-NEXT: [[RETVAL_ASCAST_ASCAST:%.*]] = addrspacecast ptr [[RETVAL_ASCAST]] to ptr addrspace(5)
124125
// AMDGCN-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_MAT3X3]], ptr [[IN1]], i32 0, i32 0
125126
// AMDGCN-NEXT: store [9 x i32] [[IN_COERCE]], ptr [[COERCE_DIVE]], align 4
126127
// AMDGCN-NEXT: [[TMP0:%.*]] = load [[STRUCT_MAT4X4]], ptr [[RETVAL_ASCAST]], align 4

0 commit comments

Comments
 (0)