forked from OSchip/llvm-project
[CodeGen] Prefer CreateElementBitCast() where possible
CreateElementBitCast() can preserve the pointer element type in the presence of opaque pointers, so use it in place of CreateBitCast() in some places. This also sometimes simplifies the code a bit.
This commit is contained in:
parent
bd9e23943a
commit
481de0ed80
|
@ -1321,15 +1321,14 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
|
|||
ResVal = Builder.CreateNot(ResVal);
|
||||
|
||||
Builder.CreateStore(
|
||||
ResVal,
|
||||
Builder.CreateBitCast(Dest, ResVal->getType()->getPointerTo()));
|
||||
ResVal, Builder.CreateElementBitCast(Dest, ResVal->getType()));
|
||||
}
|
||||
|
||||
if (RValTy->isVoidType())
|
||||
return RValue::get(nullptr);
|
||||
|
||||
return convertTempToRValue(
|
||||
Builder.CreateBitCast(Dest, ConvertTypeForMem(RValTy)->getPointerTo()),
|
||||
Builder.CreateElementBitCast(Dest, ConvertTypeForMem(RValTy)),
|
||||
RValTy, E->getExprLoc());
|
||||
}
|
||||
|
||||
|
@ -1382,8 +1381,7 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
|
|||
return RValue::get(nullptr);
|
||||
|
||||
return convertTempToRValue(
|
||||
Builder.CreateBitCast(Dest, ConvertTypeForMem(RValTy)->getPointerTo(
|
||||
Dest.getAddressSpace())),
|
||||
Builder.CreateElementBitCast(Dest, ConvertTypeForMem(RValTy)),
|
||||
RValTy, E->getExprLoc());
|
||||
}
|
||||
|
||||
|
@ -1455,17 +1453,14 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
|
|||
|
||||
assert(Atomics.getValueSizeInBits() <= Atomics.getAtomicSizeInBits());
|
||||
return convertTempToRValue(
|
||||
Builder.CreateBitCast(Dest, ConvertTypeForMem(RValTy)->getPointerTo(
|
||||
Dest.getAddressSpace())),
|
||||
Builder.CreateElementBitCast(Dest, ConvertTypeForMem(RValTy)),
|
||||
RValTy, E->getExprLoc());
|
||||
}
|
||||
|
||||
Address AtomicInfo::emitCastToAtomicIntPointer(Address addr) const {
|
||||
unsigned addrspace =
|
||||
cast<llvm::PointerType>(addr.getPointer()->getType())->getAddressSpace();
|
||||
llvm::IntegerType *ty =
|
||||
llvm::IntegerType::get(CGF.getLLVMContext(), AtomicSizeInBits);
|
||||
return CGF.Builder.CreateBitCast(addr, ty->getPointerTo(addrspace));
|
||||
return CGF.Builder.CreateElementBitCast(addr, ty);
|
||||
}
|
||||
|
||||
Address AtomicInfo::convertToAtomicIntPointer(Address Addr) const {
|
||||
|
|
|
@ -168,8 +168,9 @@ public:
|
|||
/// preserving information like the alignment and address space.
|
||||
Address CreateElementBitCast(Address Addr, llvm::Type *Ty,
|
||||
const llvm::Twine &Name = "") {
|
||||
auto PtrTy = Ty->getPointerTo(Addr.getAddressSpace());
|
||||
return CreateBitCast(Addr, PtrTy, Name);
|
||||
auto *PtrTy = Ty->getPointerTo(Addr.getAddressSpace());
|
||||
return Address(CreateBitCast(Addr.getPointer(), PtrTy, Name),
|
||||
Ty, Addr.getAlignment());
|
||||
}
|
||||
|
||||
using CGBuilderBaseTy::CreatePointerBitCastOrAddrSpaceCast;
|
||||
|
|
|
@ -18711,8 +18711,8 @@ Value *CodeGenFunction::EmitHexagonBuiltinExpr(unsigned BuiltinID,
|
|||
case Hexagon::BI__builtin_HEXAGON_V6_vsubcarry_128B: {
|
||||
// Get the type from the 0-th argument.
|
||||
llvm::Type *VecType = ConvertType(E->getArg(0)->getType());
|
||||
Address PredAddr = Builder.CreateBitCast(
|
||||
EmitPointerWithAlignment(E->getArg(2)), VecType->getPointerTo(0));
|
||||
Address PredAddr = Builder.CreateElementBitCast(
|
||||
EmitPointerWithAlignment(E->getArg(2)), VecType);
|
||||
llvm::Value *PredIn = V2Q(Builder.CreateLoad(PredAddr));
|
||||
llvm::Value *Result = Builder.CreateCall(CGM.getIntrinsic(ID),
|
||||
{EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1)), PredIn});
|
||||
|
|
|
@ -1135,7 +1135,7 @@ void CodeGenFunction::EmitNewArrayInitializer(
|
|||
}
|
||||
|
||||
// Switch back to initializing one base element at a time.
|
||||
CurPtr = Builder.CreateBitCast(CurPtr, BeginPtr.getType());
|
||||
CurPtr = Builder.CreateElementBitCast(CurPtr, BeginPtr.getElementType());
|
||||
}
|
||||
|
||||
// If all elements have already been initialized, skip any further
|
||||
|
|
|
@ -366,11 +366,11 @@ template <class Derived> struct GenFuncBase {
|
|||
llvm::ConstantInt::get(NumElts->getType(), BaseEltSize);
|
||||
llvm::Value *SizeInBytes =
|
||||
CGF.Builder.CreateNUWMul(BaseEltSizeVal, NumElts);
|
||||
Address BC = CGF.Builder.CreateBitCast(DstAddr, CGF.CGM.Int8PtrTy);
|
||||
Address BC = CGF.Builder.CreateElementBitCast(DstAddr, CGF.CGM.Int8Ty);
|
||||
llvm::Value *DstArrayEnd =
|
||||
CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, BC.getPointer(), SizeInBytes);
|
||||
DstArrayEnd = CGF.Builder.CreateBitCast(DstArrayEnd, CGF.CGM.Int8PtrPtrTy,
|
||||
"dstarray.end");
|
||||
DstArrayEnd = CGF.Builder.CreateBitCast(
|
||||
DstArrayEnd, CGF.CGM.Int8PtrPtrTy, "dstarray.end");
|
||||
llvm::BasicBlock *PreheaderBB = CGF.Builder.GetInsertBlock();
|
||||
|
||||
// Create the header block and insert the phi instructions.
|
||||
|
@ -426,9 +426,9 @@ template <class Derived> struct GenFuncBase {
|
|||
assert(Addr.isValid() && "invalid address");
|
||||
if (Offset.getQuantity() == 0)
|
||||
return Addr;
|
||||
Addr = CGF->Builder.CreateBitCast(Addr, CGF->CGM.Int8PtrTy);
|
||||
Addr = CGF->Builder.CreateElementBitCast(Addr, CGF->CGM.Int8Ty);
|
||||
Addr = CGF->Builder.CreateConstInBoundsGEP(Addr, Offset.getQuantity());
|
||||
return CGF->Builder.CreateBitCast(Addr, CGF->CGM.Int8PtrPtrTy);
|
||||
return CGF->Builder.CreateElementBitCast(Addr, CGF->CGM.Int8PtrTy);
|
||||
}
|
||||
|
||||
Address getAddrWithOffset(Address Addr, CharUnits StructFieldOffset,
|
||||
|
@ -491,9 +491,8 @@ template <class Derived> struct GenFuncBase {
|
|||
|
||||
for (unsigned I = 0; I < N; ++I) {
|
||||
Alignments[I] = Addrs[I].getAlignment();
|
||||
Ptrs[I] =
|
||||
CallerCGF.Builder.CreateBitCast(Addrs[I], CallerCGF.CGM.Int8PtrPtrTy)
|
||||
.getPointer();
|
||||
Ptrs[I] = CallerCGF.Builder.CreateElementBitCast(
|
||||
Addrs[I], CallerCGF.CGM.Int8PtrTy).getPointer();
|
||||
}
|
||||
|
||||
if (llvm::Function *F =
|
||||
|
@ -554,19 +553,21 @@ struct GenBinaryFunc : CopyStructVisitor<Derived, IsMove>,
|
|||
return;
|
||||
|
||||
QualType RT = QualType(FD->getParent()->getTypeForDecl(), 0);
|
||||
llvm::PointerType *PtrTy = this->CGF->ConvertType(RT)->getPointerTo();
|
||||
llvm::Type *Ty = this->CGF->ConvertType(RT);
|
||||
Address DstAddr = this->getAddrWithOffset(Addrs[DstIdx], Offset);
|
||||
LValue DstBase = this->CGF->MakeAddrLValue(
|
||||
this->CGF->Builder.CreateBitCast(DstAddr, PtrTy), FT);
|
||||
this->CGF->Builder.CreateElementBitCast(DstAddr, Ty), FT);
|
||||
DstLV = this->CGF->EmitLValueForField(DstBase, FD);
|
||||
Address SrcAddr = this->getAddrWithOffset(Addrs[SrcIdx], Offset);
|
||||
LValue SrcBase = this->CGF->MakeAddrLValue(
|
||||
this->CGF->Builder.CreateBitCast(SrcAddr, PtrTy), FT);
|
||||
this->CGF->Builder.CreateElementBitCast(SrcAddr, Ty), FT);
|
||||
SrcLV = this->CGF->EmitLValueForField(SrcBase, FD);
|
||||
} else {
|
||||
llvm::PointerType *Ty = this->CGF->ConvertTypeForMem(FT)->getPointerTo();
|
||||
Address DstAddr = this->CGF->Builder.CreateBitCast(Addrs[DstIdx], Ty);
|
||||
Address SrcAddr = this->CGF->Builder.CreateBitCast(Addrs[SrcIdx], Ty);
|
||||
llvm::Type *Ty = this->CGF->ConvertTypeForMem(FT);
|
||||
Address DstAddr =
|
||||
this->CGF->Builder.CreateElementBitCast(Addrs[DstIdx], Ty);
|
||||
Address SrcAddr =
|
||||
this->CGF->Builder.CreateElementBitCast(Addrs[SrcIdx], Ty);
|
||||
DstLV = this->CGF->MakeAddrLValue(DstAddr, FT);
|
||||
SrcLV = this->CGF->MakeAddrLValue(SrcAddr, FT);
|
||||
}
|
||||
|
@ -817,7 +818,7 @@ void CodeGenFunction::destroyNonTrivialCStruct(CodeGenFunction &CGF,
|
|||
void CodeGenFunction::defaultInitNonTrivialCStructVar(LValue Dst) {
|
||||
GenDefaultInitialize Gen(getContext());
|
||||
Address DstPtr =
|
||||
Builder.CreateBitCast(Dst.getAddress(*this), CGM.Int8PtrPtrTy);
|
||||
Builder.CreateElementBitCast(Dst.getAddress(*this), CGM.Int8PtrTy);
|
||||
Gen.setCGF(this);
|
||||
QualType QT = Dst.getType();
|
||||
QT = Dst.isVolatile() ? QT.withVolatile() : QT;
|
||||
|
@ -830,7 +831,7 @@ static void callSpecialFunction(G &&Gen, StringRef FuncName, QualType QT,
|
|||
std::array<Address, N> Addrs) {
|
||||
auto SetArtificialLoc = ApplyDebugLocation::CreateArtificial(CGF);
|
||||
for (unsigned I = 0; I < N; ++I)
|
||||
Addrs[I] = CGF.Builder.CreateBitCast(Addrs[I], CGF.CGM.Int8PtrPtrTy);
|
||||
Addrs[I] = CGF.Builder.CreateElementBitCast(Addrs[I], CGF.CGM.Int8PtrTy);
|
||||
QT = IsVolatile ? QT.withVolatile() : QT;
|
||||
Gen.callFunc(FuncName, QT, Addrs, CGF);
|
||||
}
|
||||
|
|
|
@ -917,7 +917,7 @@ void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF,
|
|||
std::tuple<Address, llvm::Value *, const CXXRecordDecl *>
|
||||
MicrosoftCXXABI::performBaseAdjustment(CodeGenFunction &CGF, Address Value,
|
||||
QualType SrcRecordTy) {
|
||||
Value = CGF.Builder.CreateBitCast(Value, CGF.Int8PtrTy);
|
||||
Value = CGF.Builder.CreateElementBitCast(Value, CGF.Int8Ty);
|
||||
const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
|
||||
const ASTContext &Context = getContext();
|
||||
|
||||
|
|
Loading…
Reference in New Issue