[llvm] 0b1ae89 - [AutoUpgrade] Avoid unnecessary pointer bitcasts (NFCI)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 20 00:55:44 PST 2025
Author: Nikita Popov
Date: 2025-01-20T09:55:35+01:00
New Revision: 0b1ae8963eb4accf8e85b73b834c84c1a73346ba
URL: https://github.com/llvm/llvm-project/commit/0b1ae8963eb4accf8e85b73b834c84c1a73346ba
DIFF: https://github.com/llvm/llvm-project/commit/0b1ae8963eb4accf8e85b73b834c84c1a73346ba.diff
LOG: [AutoUpgrade] Avoid unnecessary pointer bitcasts (NFCI)
Not needed with opaque pointers.
Added:
Modified:
llvm/lib/IR/AutoUpgrade.cpp
Removed:
################################################################################
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 06e62bf7f9f757..a1bae1b50764d4 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -1875,9 +1875,6 @@ static Value *upgradeX86ConcatShift(IRBuilder<> &Builder, CallBase &CI,
static Value *upgradeMaskedStore(IRBuilder<> &Builder, Value *Ptr, Value *Data,
Value *Mask, bool Aligned) {
- // Cast the pointer to the right type.
- Ptr = Builder.CreateBitCast(Ptr,
- llvm::PointerType::getUnqual(Data->getType()));
const Align Alignment =
Aligned
? Align(Data->getType()->getPrimitiveSizeInBits().getFixedValue() / 8)
@@ -1897,8 +1894,6 @@ static Value *upgradeMaskedStore(IRBuilder<> &Builder, Value *Ptr, Value *Data,
static Value *upgradeMaskedLoad(IRBuilder<> &Builder, Value *Ptr,
Value *Passthru, Value *Mask, bool Aligned) {
Type *ValTy = Passthru->getType();
- // Cast the pointer to the right type.
- Ptr = Builder.CreateBitCast(Ptr, llvm::PointerType::getUnqual(ValTy));
const Align Alignment =
Aligned
? Align(
@@ -2421,13 +2416,10 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
// Nontemporal (unaligned) store of the 0'th element of the float/double
// vector.
- Type *SrcEltTy = cast<VectorType>(Arg1->getType())->getElementType();
- PointerType *EltPtrTy = PointerType::getUnqual(SrcEltTy);
- Value *Addr = Builder.CreateBitCast(Arg0, EltPtrTy, "cast");
Value *Extract =
Builder.CreateExtractElement(Arg1, (uint64_t)0, "extractelement");
- StoreInst *SI = Builder.CreateAlignedStore(Extract, Addr, Align(1));
+ StoreInst *SI = Builder.CreateAlignedStore(Extract, Arg0, Align(1));
SI->setMetadata(LLVMContext::MD_nontemporal, Node);
} else if (Name.starts_with("avx.movnt.") ||
Name.starts_with("avx512.storent.")) {
@@ -2439,11 +2431,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
Value *Arg0 = CI->getArgOperand(0);
Value *Arg1 = CI->getArgOperand(1);
- // Convert the type of the pointer to a pointer to the stored type.
- Value *BC = Builder.CreateBitCast(
- Arg0, PointerType::getUnqual(Arg1->getType()), "cast");
StoreInst *SI = Builder.CreateAlignedStore(
- Arg1, BC,
+ Arg1, Arg0,
Align(Arg1->getType()->getPrimitiveSizeInBits().getFixedValue() / 8));
SI->setMetadata(LLVMContext::MD_nontemporal, Node);
} else if (Name == "sse2.storel.dq") {
@@ -2453,17 +2442,12 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
auto *NewVecTy = FixedVectorType::get(Type::getInt64Ty(C), 2);
Value *BC0 = Builder.CreateBitCast(Arg1, NewVecTy, "cast");
Value *Elt = Builder.CreateExtractElement(BC0, (uint64_t)0);
- Value *BC = Builder.CreateBitCast(
- Arg0, PointerType::getUnqual(Elt->getType()), "cast");
- Builder.CreateAlignedStore(Elt, BC, Align(1));
+ Builder.CreateAlignedStore(Elt, Arg0, Align(1));
} else if (Name.starts_with("sse.storeu.") ||
Name.starts_with("sse2.storeu.") ||
Name.starts_with("avx.storeu.")) {
Value *Arg0 = CI->getArgOperand(0);
Value *Arg1 = CI->getArgOperand(1);
-
- Arg0 = Builder.CreateBitCast(Arg0, PointerType::getUnqual(Arg1->getType()),
- "cast");
Builder.CreateAlignedStore(Arg1, Arg0, Align(1));
} else if (Name == "avx512.mask.store.ss") {
Value *Mask = Builder.CreateAnd(CI->getArgOperand(2), Builder.getInt8(1));
@@ -2813,31 +2797,21 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
CI->getArgOperand(2), Aligned);
} else if (Name.starts_with("avx512.mask.expand.load.")) {
auto *ResultTy = cast<FixedVectorType>(CI->getType());
- Type *PtrTy = ResultTy->getElementType();
-
- // Cast the pointer to element type.
- Value *Ptr = Builder.CreateBitCast(CI->getOperand(0),
- llvm::PointerType::getUnqual(PtrTy));
-
Value *MaskVec = getX86MaskVec(Builder, CI->getArgOperand(2),
ResultTy->getNumElements());
- Rep = Builder.CreateIntrinsic(Intrinsic::masked_expandload, ResultTy,
- {Ptr, MaskVec, CI->getOperand(1)});
+ Rep = Builder.CreateIntrinsic(
+ Intrinsic::masked_expandload, ResultTy,
+ {CI->getOperand(0), MaskVec, CI->getOperand(1)});
} else if (Name.starts_with("avx512.mask.compress.store.")) {
auto *ResultTy = cast<VectorType>(CI->getArgOperand(1)->getType());
- Type *PtrTy = ResultTy->getElementType();
-
- // Cast the pointer to element type.
- Value *Ptr = Builder.CreateBitCast(CI->getOperand(0),
- llvm::PointerType::getUnqual(PtrTy));
-
Value *MaskVec =
getX86MaskVec(Builder, CI->getArgOperand(2),
cast<FixedVectorType>(ResultTy)->getNumElements());
- Rep = Builder.CreateIntrinsic(Intrinsic::masked_compressstore, ResultTy,
- {CI->getArgOperand(1), Ptr, MaskVec});
+ Rep = Builder.CreateIntrinsic(
+ Intrinsic::masked_compressstore, ResultTy,
+ {CI->getArgOperand(1), CI->getArgOperand(0), MaskVec});
} else if (Name.starts_with("avx512.mask.compress.") ||
Name.starts_with("avx512.mask.expand.")) {
auto *ResultTy = cast<FixedVectorType>(CI->getType());
@@ -2963,9 +2937,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
Type *EltTy = cast<VectorType>(CI->getType())->getElementType();
unsigned NumSrcElts = 128 / EltTy->getPrimitiveSizeInBits();
auto *VT = FixedVectorType::get(EltTy, NumSrcElts);
- Value *Op = Builder.CreatePointerCast(CI->getArgOperand(0),
- PointerType::getUnqual(VT));
- Value *Load = Builder.CreateAlignedLoad(VT, Op, Align(1));
+ Value *Load = Builder.CreateAlignedLoad(VT, CI->getArgOperand(0), Align(1));
if (NumSrcElts == 2)
Rep = Builder.CreateShuffleVector(Load, ArrayRef<int>{0, 1, 0, 1});
else
@@ -3687,13 +3659,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
MDNode *Node = MDNode::get(
C, ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(C), 1)));
- Value *Ptr = CI->getArgOperand(0);
-
- // Convert the type of the pointer to a pointer to the stored type.
- Value *BC = Builder.CreateBitCast(
- Ptr, PointerType::getUnqual(CI->getType()), "cast");
LoadInst *LI = Builder.CreateAlignedLoad(
- CI->getType(), BC,
+ CI->getType(), CI->getArgOperand(0),
Align(CI->getType()->getPrimitiveSizeInBits().getFixedValue() / 8));
LI->setMetadata(LLVMContext::MD_nontemporal, Node);
Rep = LI;
@@ -4045,10 +4012,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
// Extract the second result and store it.
Value *Data = Builder.CreateExtractValue(NewCall, 1);
- // Cast the pointer to the right type.
- Value *Ptr = Builder.CreateBitCast(
- CI->getArgOperand(3), llvm::PointerType::getUnqual(Data->getType()));
- Builder.CreateAlignedStore(Data, Ptr, Align(1));
+ Builder.CreateAlignedStore(Data, CI->getArgOperand(3), Align(1));
// Replace the original call result with the first result of the new call.
Value *CF = Builder.CreateExtractValue(NewCall, 0);
@@ -4756,10 +4720,7 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
NewCall = Builder.CreateCall(NewFn);
// Extract the second result and store it.
Value *Data = Builder.CreateExtractValue(NewCall, 1);
- // Cast the pointer to the right type.
- Value *Ptr = Builder.CreateBitCast(CI->getArgOperand(0),
- llvm::PointerType::getUnqual(Data->getType()));
- Builder.CreateAlignedStore(Data, Ptr, Align(1));
+ Builder.CreateAlignedStore(Data, CI->getArgOperand(0), Align(1));
// Replace the original call result with the first result of the new call.
Value *TSC = Builder.CreateExtractValue(NewCall, 0);
More information about the llvm-commits
mailing list