Skip to content

Commit 74992f4

Browse files
committed
[CodeGen] Store element type in DominatingValue<RValue>
For aggregate rvalues, we need to store the element type in the dominating value, so we can recover the element type for the address.
1 parent 4d20964 commit 74992f4

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

clang/lib/CodeGen/CGCleanup.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ DominatingValue<RValue>::saved_type::save(CodeGenFunction &CGF, RValue rv) {
3838

3939
// These automatically dominate and don't need to be saved.
4040
if (!DominatingLLVMValue::needsSaving(V))
41-
return saved_type(V, ScalarLiteral);
41+
return saved_type(V, nullptr, ScalarLiteral);
4242

4343
// Everything else needs an alloca.
4444
Address addr =
4545
CGF.CreateDefaultAlignTempAlloca(V->getType(), "saved-rvalue");
4646
CGF.Builder.CreateStore(V, addr);
47-
return saved_type(addr.getPointer(), ScalarAddress);
47+
return saved_type(addr.getPointer(), nullptr, ScalarAddress);
4848
}
4949

5050
if (rv.isComplex()) {
@@ -54,19 +54,19 @@ DominatingValue<RValue>::saved_type::save(CodeGenFunction &CGF, RValue rv) {
5454
Address addr = CGF.CreateDefaultAlignTempAlloca(ComplexTy, "saved-complex");
5555
CGF.Builder.CreateStore(V.first, CGF.Builder.CreateStructGEP(addr, 0));
5656
CGF.Builder.CreateStore(V.second, CGF.Builder.CreateStructGEP(addr, 1));
57-
return saved_type(addr.getPointer(), ComplexAddress);
57+
return saved_type(addr.getPointer(), nullptr, ComplexAddress);
5858
}
5959

6060
assert(rv.isAggregate());
6161
Address V = rv.getAggregateAddress(); // TODO: volatile?
6262
if (!DominatingLLVMValue::needsSaving(V.getPointer()))
63-
return saved_type(V.getPointer(), AggregateLiteral,
63+
return saved_type(V.getPointer(), V.getElementType(), AggregateLiteral,
6464
V.getAlignment().getQuantity());
6565

6666
Address addr =
6767
CGF.CreateTempAlloca(V.getType(), CGF.getPointerAlign(), "saved-rvalue");
6868
CGF.Builder.CreateStore(V.getPointer(), addr);
69-
return saved_type(addr.getPointer(), AggregateAddress,
69+
return saved_type(addr.getPointer(), V.getElementType(), AggregateAddress,
7070
V.getAlignment().getQuantity());
7171
}
7272

@@ -86,11 +86,11 @@ RValue DominatingValue<RValue>::saved_type::restore(CodeGenFunction &CGF) {
8686
return RValue::get(CGF.Builder.CreateLoad(getSavingAddress(Value)));
8787
case AggregateLiteral:
8888
return RValue::getAggregate(
89-
Address::deprecated(Value, CharUnits::fromQuantity(Align)));
89+
Address(Value, ElementType, CharUnits::fromQuantity(Align)));
9090
case AggregateAddress: {
9191
auto addr = CGF.Builder.CreateLoad(getSavingAddress(Value));
9292
return RValue::getAggregate(
93-
Address::deprecated(addr, CharUnits::fromQuantity(Align)));
93+
Address(addr, ElementType, CharUnits::fromQuantity(Align)));
9494
}
9595
case ComplexAddress: {
9696
Address address = getSavingAddress(Value);

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,11 @@ template <> struct DominatingValue<RValue> {
201201
AggregateAddress, ComplexAddress };
202202

203203
llvm::Value *Value;
204+
llvm::Type *ElementType;
204205
unsigned K : 3;
205206
unsigned Align : 29;
206-
saved_type(llvm::Value *v, Kind k, unsigned a = 0)
207-
: Value(v), K(k), Align(a) {}
207+
saved_type(llvm::Value *v, llvm::Type *e, Kind k, unsigned a = 0)
208+
: Value(v), ElementType(e), K(k), Align(a) {}
208209

209210
public:
210211
static bool needsSaving(RValue value);

0 commit comments

Comments
 (0)