Skip to content

Commit fe3407a

Browse files
committed
[CGBuilder] Assert that CreateAddrSpaceCast does not change element type
Address space casts in general may change the element type, but don't allow it in the method working on Address, so we can preserve the element type. CreatePointerBitCastOrAddrSpaceCast() still needs to be addressed.
1 parent 483ae09 commit fe3407a

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

clang/lib/CodeGen/CGBuilder.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,10 @@ class CGBuilderTy : public CGBuilderBaseTy {
154154
using CGBuilderBaseTy::CreateAddrSpaceCast;
155155
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty,
156156
const llvm::Twine &Name = "") {
157-
return Address(CreateAddrSpaceCast(Addr.getPointer(), Ty, Name),
158-
Addr.getAlignment());
157+
assert(cast<llvm::PointerType>(Ty)->isOpaqueOrPointeeTypeMatches(
158+
Addr.getElementType()) &&
159+
"Should not change the element type");
160+
return Addr.withPointer(CreateAddrSpaceCast(Addr.getPointer(), Ty, Name));
159161
}
160162

161163
/// Cast the element type of the given address to a different type,

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,11 +1114,11 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
11141114
CE->getBeginLoc());
11151115
}
11161116

1117-
if (CE->getCastKind() == CK_AddressSpaceConversion)
1118-
return Builder.CreateAddrSpaceCast(Addr, ConvertType(E->getType()));
1119-
11201117
llvm::Type *ElemTy = ConvertTypeForMem(E->getType()->getPointeeType());
1121-
return Builder.CreateElementBitCast(Addr, ElemTy);
1118+
Addr = Builder.CreateElementBitCast(Addr, ElemTy);
1119+
if (CE->getCastKind() == CK_AddressSpaceConversion)
1120+
Addr = Builder.CreateAddrSpaceCast(Addr, ConvertType(E->getType()));
1121+
return Addr;
11221122
}
11231123
break;
11241124

0 commit comments

Comments
 (0)