Skip to content

Commit

Permalink
[CodeGen] Avoid some pointer element type accesses
Browse files Browse the repository at this point in the history
  • Loading branch information
nikic committed Dec 15, 2021
1 parent 3deb82c commit b4f4655
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 15 deletions.
4 changes: 2 additions & 2 deletions clang/lib/CodeGen/CGAtomic.cpp
Expand Up @@ -1079,8 +1079,8 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
if (AS == LangAS::opencl_generic)
return V;
auto DestAS = getContext().getTargetAddressSpace(LangAS::opencl_generic);
auto T = V->getType();
auto *DestType = T->getPointerElementType()->getPointerTo(DestAS);
auto T = llvm::cast<llvm::PointerType>(V->getType());
auto *DestType = llvm::PointerType::getWithSamePointeeType(T, DestAS);

return getTargetHooks().performAddrSpaceCast(
*this, V, AS, LangAS::opencl_generic, DestType, false);
Expand Down
3 changes: 1 addition & 2 deletions clang/lib/CodeGen/CGBlocks.cpp
Expand Up @@ -2721,8 +2721,7 @@ void CodeGenFunction::emitByrefStructureInit(const AutoVarEmission &emission) {
Address addr = emission.Addr;

// That's an alloca of the byref structure type.
llvm::StructType *byrefType = cast<llvm::StructType>(
cast<llvm::PointerType>(addr.getPointer()->getType())->getElementType());
llvm::StructType *byrefType = cast<llvm::StructType>(addr.getElementType());

unsigned nextHeaderIndex = 0;
CharUnits nextHeaderOffset;
Expand Down
9 changes: 6 additions & 3 deletions clang/lib/CodeGen/CGBuilder.h
Expand Up @@ -86,7 +86,8 @@ class CGBuilderTy : public CGBuilderBaseTy {
llvm::LoadInst *CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr,
CharUnits Align,
const llvm::Twine &Name = "") {
assert(Addr->getType()->getPointerElementType() == Ty);
assert(llvm::cast<llvm::PointerType>(Addr->getType())
->isOpaqueOrPointeeTypeMatches(Ty));
return CreateAlignedLoad(Ty, Addr, Align.getAsAlign(), Name);
}

Expand Down Expand Up @@ -115,13 +116,15 @@ class CGBuilderTy : public CGBuilderBaseTy {
/// Emit a load from an i1 flag variable.
llvm::LoadInst *CreateFlagLoad(llvm::Value *Addr,
const llvm::Twine &Name = "") {
assert(Addr->getType()->getPointerElementType() == getInt1Ty());
assert(llvm::cast<llvm::PointerType>(Addr->getType())
->isOpaqueOrPointeeTypeMatches(getInt1Ty()));
return CreateAlignedLoad(getInt1Ty(), Addr, CharUnits::One(), Name);
}

/// Emit a store to an i1 flag variable.
llvm::StoreInst *CreateFlagStore(bool Value, llvm::Value *Addr) {
assert(Addr->getType()->getPointerElementType() == getInt1Ty());
assert(llvm::cast<llvm::PointerType>(Addr->getType())
->isOpaqueOrPointeeTypeMatches(getInt1Ty()));
return CreateAlignedStore(getInt1(Value), Addr, CharUnits::One());
}

Expand Down
6 changes: 2 additions & 4 deletions clang/lib/CodeGen/CGBuiltin.cpp
Expand Up @@ -1502,8 +1502,7 @@ Value *CodeGenFunction::EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID,
Value *ArgValue = EmitScalarExpr(E->getArg(1));

llvm::Type *ArgType = ArgValue->getType();
llvm::Type *IndexType =
IndexAddress.getPointer()->getType()->getPointerElementType();
llvm::Type *IndexType = IndexAddress.getElementType();
llvm::Type *ResultType = ConvertType(E->getType());

Value *ArgZero = llvm::Constant::getNullValue(ArgType);
Expand Down Expand Up @@ -16389,8 +16388,7 @@ Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID,
llvm::Value *Result = Builder.CreateExtractValue(Tmp, 0);
llvm::Value *Flag = Builder.CreateExtractValue(Tmp, 1);

llvm::Type *RealFlagType
= FlagOutPtr.getPointer()->getType()->getPointerElementType();
llvm::Type *RealFlagType = FlagOutPtr.getElementType();

llvm::Value *FlagExt = Builder.CreateZExt(Flag, RealFlagType);
Builder.CreateStore(FlagExt, FlagOutPtr);
Expand Down
6 changes: 2 additions & 4 deletions clang/lib/CodeGen/CGExpr.cpp
Expand Up @@ -1777,16 +1777,14 @@ llvm::Value *CodeGenFunction::EmitFromMemory(llvm::Value *Value, QualType Ty) {
// MatrixType), if it points to a array (the memory type of MatrixType).
static Address MaybeConvertMatrixAddress(Address Addr, CodeGenFunction &CGF,
bool IsVector = true) {
auto *ArrayTy = dyn_cast<llvm::ArrayType>(
cast<llvm::PointerType>(Addr.getPointer()->getType())->getElementType());
auto *ArrayTy = dyn_cast<llvm::ArrayType>(Addr.getElementType());
if (ArrayTy && IsVector) {
auto *VectorTy = llvm::FixedVectorType::get(ArrayTy->getElementType(),
ArrayTy->getNumElements());

return Address(CGF.Builder.CreateElementBitCast(Addr, VectorTy));
}
auto *VectorTy = dyn_cast<llvm::VectorType>(
cast<llvm::PointerType>(Addr.getPointer()->getType())->getElementType());
auto *VectorTy = dyn_cast<llvm::VectorType>(Addr.getElementType());
if (VectorTy && !IsVector) {
auto *ArrayTy = llvm::ArrayType::get(
VectorTy->getElementType(),
Expand Down

0 comments on commit b4f4655

Please sign in to comment.