Skip to content

Commit 2edac9d

Browse files
committed
[CodeGen] Avoid some pointer element type accesses
1 parent 1af5fbd commit 2edac9d

File tree

3 files changed

+32
-27
lines changed

3 files changed

+32
-27
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17464,18 +17464,19 @@ Value *
1746417464
CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
1746517465
auto MakeLdg = [&](unsigned IntrinsicID) {
1746617466
Value *Ptr = EmitScalarExpr(E->getArg(0));
17467-
clang::CharUnits Align =
17468-
CGM.getNaturalPointeeTypeAlignment(E->getArg(0)->getType());
17467+
QualType ArgType = E->getArg(0)->getType();
17468+
clang::CharUnits Align = CGM.getNaturalPointeeTypeAlignment(ArgType);
17469+
llvm::Type *ElemTy = ConvertTypeForMem(ArgType->getPointeeType());
1746917470
return Builder.CreateCall(
17470-
CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(),
17471-
Ptr->getType()}),
17471+
CGM.getIntrinsic(IntrinsicID, {ElemTy, Ptr->getType()}),
1747217472
{Ptr, ConstantInt::get(Builder.getInt32Ty(), Align.getQuantity())});
1747317473
};
1747417474
auto MakeScopedAtomic = [&](unsigned IntrinsicID) {
1747517475
Value *Ptr = EmitScalarExpr(E->getArg(0));
17476+
llvm::Type *ElemTy =
17477+
ConvertTypeForMem(E->getArg(0)->getType()->getPointeeType());
1747617478
return Builder.CreateCall(
17477-
CGM.getIntrinsic(IntrinsicID, {Ptr->getType()->getPointerElementType(),
17478-
Ptr->getType()}),
17479+
CGM.getIntrinsic(IntrinsicID, {ElemTy, Ptr->getType()}),
1747917480
{Ptr, EmitScalarExpr(E->getArg(1))});
1748017481
};
1748117482
switch (BuiltinID) {
@@ -17681,20 +17682,22 @@ CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
1768117682
case NVPTX::BI__nvvm_atom_cta_cas_gen_l:
1768217683
case NVPTX::BI__nvvm_atom_cta_cas_gen_ll: {
1768317684
Value *Ptr = EmitScalarExpr(E->getArg(0));
17685+
llvm::Type *ElemTy =
17686+
ConvertTypeForMem(E->getArg(0)->getType()->getPointeeType());
1768417687
return Builder.CreateCall(
1768517688
CGM.getIntrinsic(
17686-
Intrinsic::nvvm_atomic_cas_gen_i_cta,
17687-
{Ptr->getType()->getPointerElementType(), Ptr->getType()}),
17689+
Intrinsic::nvvm_atomic_cas_gen_i_cta, {ElemTy, Ptr->getType()}),
1768817690
{Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))});
1768917691
}
1769017692
case NVPTX::BI__nvvm_atom_sys_cas_gen_i:
1769117693
case NVPTX::BI__nvvm_atom_sys_cas_gen_l:
1769217694
case NVPTX::BI__nvvm_atom_sys_cas_gen_ll: {
1769317695
Value *Ptr = EmitScalarExpr(E->getArg(0));
17696+
llvm::Type *ElemTy =
17697+
ConvertTypeForMem(E->getArg(0)->getType()->getPointeeType());
1769417698
return Builder.CreateCall(
1769517699
CGM.getIntrinsic(
17696-
Intrinsic::nvvm_atomic_cas_gen_i_sys,
17697-
{Ptr->getType()->getPointerElementType(), Ptr->getType()}),
17700+
Intrinsic::nvvm_atomic_cas_gen_i_sys, {ElemTy, Ptr->getType()}),
1769817701
{Ptr, EmitScalarExpr(E->getArg(1)), EmitScalarExpr(E->getArg(2))});
1769917702
}
1770017703
case NVPTX::BI__nvvm_match_all_sync_i32p:

clang/lib/CodeGen/CGCall.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3936,7 +3936,9 @@ static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args,
39363936
// because of the crazy ObjC compatibility rules.
39373937

39383938
llvm::PointerType *destType =
3939-
cast<llvm::PointerType>(CGF.ConvertType(CRE->getType()));
3939+
cast<llvm::PointerType>(CGF.ConvertType(CRE->getType()));
3940+
llvm::Type *destElemType =
3941+
CGF.ConvertTypeForMem(CRE->getType()->getPointeeType());
39403942

39413943
// If the address is a constant null, just pass the appropriate null.
39423944
if (isProvablyNull(srcAddr.getPointer())) {
@@ -3946,8 +3948,8 @@ static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args,
39463948
}
39473949

39483950
// Create the temporary.
3949-
Address temp = CGF.CreateTempAlloca(destType->getPointerElementType(),
3950-
CGF.getPointerAlign(), "icr.temp");
3951+
Address temp =
3952+
CGF.CreateTempAlloca(destElemType, CGF.getPointerAlign(), "icr.temp");
39513953
// Loading an l-value can introduce a cleanup if the l-value is __weak,
39523954
// and that cleanup will be conditional if we can't prove that the l-value
39533955
// isn't null, so we need to register a dominating point so that the cleanups
@@ -3957,8 +3959,8 @@ static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args,
39573959
// Zero-initialize it if we're not doing a copy-initialization.
39583960
bool shouldCopy = CRE->shouldCopy();
39593961
if (!shouldCopy) {
3960-
llvm::Value *null = llvm::ConstantPointerNull::get(
3961-
cast<llvm::PointerType>(destType->getPointerElementType()));
3962+
llvm::Value *null =
3963+
llvm::ConstantPointerNull::get(cast<llvm::PointerType>(destElemType));
39623964
CGF.Builder.CreateStore(null, temp);
39633965
}
39643966

@@ -4000,8 +4002,7 @@ static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args,
40004002
assert(srcRV.isScalar());
40014003

40024004
llvm::Value *src = srcRV.getScalarVal();
4003-
src = CGF.Builder.CreateBitCast(src, destType->getPointerElementType(),
4004-
"icr.cast");
4005+
src = CGF.Builder.CreateBitCast(src, destElemType, "icr.cast");
40054006

40064007
// Use an ordinary store, not a store-to-lvalue.
40074008
CGF.Builder.CreateStore(src, temp);
@@ -5136,14 +5137,16 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
51365137
#ifndef NDEBUG
51375138
// Assert that these structs have equivalent element types.
51385139
llvm::StructType *FullTy = CallInfo.getArgStruct();
5139-
llvm::StructType *DeclaredTy =
5140-
cast<llvm::StructType>(LastParamTy->getPointerElementType());
5141-
assert(DeclaredTy->getNumElements() == FullTy->getNumElements());
5142-
for (llvm::StructType::element_iterator DI = DeclaredTy->element_begin(),
5143-
DE = DeclaredTy->element_end(),
5144-
FI = FullTy->element_begin();
5145-
DI != DE; ++DI, ++FI)
5146-
assert(*DI == *FI);
5140+
if (!LastParamTy->isOpaquePointerTy()) {
5141+
llvm::StructType *DeclaredTy = cast<llvm::StructType>(
5142+
LastParamTy->getNonOpaquePointerElementType());
5143+
assert(DeclaredTy->getNumElements() == FullTy->getNumElements());
5144+
for (auto DI = DeclaredTy->element_begin(),
5145+
DE = DeclaredTy->element_end(),
5146+
FI = FullTy->element_begin();
5147+
DI != DE; ++DI, ++FI)
5148+
assert(*DI == *FI);
5149+
}
51475150
#endif
51485151
Arg = Builder.CreateBitCast(Arg, LastParamTy);
51495152
}

clang/lib/CodeGen/CGObjC.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,8 +1911,7 @@ void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){
19111911

19121912
// Fetch the value at the current index from the buffer.
19131913
llvm::Value *CurrentItemPtr = Builder.CreateGEP(
1914-
EnumStateItems->getType()->getPointerElementType(), EnumStateItems, index,
1915-
"currentitem.ptr");
1914+
ObjCIdType, EnumStateItems, index, "currentitem.ptr");
19161915
llvm::Value *CurrentItem =
19171916
Builder.CreateAlignedLoad(ObjCIdType, CurrentItemPtr, getPointerAlign());
19181917

0 commit comments

Comments
 (0)