Skip to content

Commit 0b1ae89

Browse files
committed
[AutoUpgrade] Avoid unnecessary pointer bitcasts (NFCI)
Not needed with opaque pointers.
1 parent 754ed95 commit 0b1ae89

File tree

1 file changed

+13
-52
lines changed

1 file changed

+13
-52
lines changed

llvm/lib/IR/AutoUpgrade.cpp

+13-52
Original file line numberDiff line numberDiff line change
@@ -1875,9 +1875,6 @@ static Value *upgradeX86ConcatShift(IRBuilder<> &Builder, CallBase &CI,
18751875

18761876
static Value *upgradeMaskedStore(IRBuilder<> &Builder, Value *Ptr, Value *Data,
18771877
Value *Mask, bool Aligned) {
1878-
// Cast the pointer to the right type.
1879-
Ptr = Builder.CreateBitCast(Ptr,
1880-
llvm::PointerType::getUnqual(Data->getType()));
18811878
const Align Alignment =
18821879
Aligned
18831880
? Align(Data->getType()->getPrimitiveSizeInBits().getFixedValue() / 8)
@@ -1897,8 +1894,6 @@ static Value *upgradeMaskedStore(IRBuilder<> &Builder, Value *Ptr, Value *Data,
18971894
static Value *upgradeMaskedLoad(IRBuilder<> &Builder, Value *Ptr,
18981895
Value *Passthru, Value *Mask, bool Aligned) {
18991896
Type *ValTy = Passthru->getType();
1900-
// Cast the pointer to the right type.
1901-
Ptr = Builder.CreateBitCast(Ptr, llvm::PointerType::getUnqual(ValTy));
19021897
const Align Alignment =
19031898
Aligned
19041899
? Align(
@@ -2421,13 +2416,10 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
24212416

24222417
// Nontemporal (unaligned) store of the 0'th element of the float/double
24232418
// vector.
2424-
Type *SrcEltTy = cast<VectorType>(Arg1->getType())->getElementType();
2425-
PointerType *EltPtrTy = PointerType::getUnqual(SrcEltTy);
2426-
Value *Addr = Builder.CreateBitCast(Arg0, EltPtrTy, "cast");
24272419
Value *Extract =
24282420
Builder.CreateExtractElement(Arg1, (uint64_t)0, "extractelement");
24292421

2430-
StoreInst *SI = Builder.CreateAlignedStore(Extract, Addr, Align(1));
2422+
StoreInst *SI = Builder.CreateAlignedStore(Extract, Arg0, Align(1));
24312423
SI->setMetadata(LLVMContext::MD_nontemporal, Node);
24322424
} else if (Name.starts_with("avx.movnt.") ||
24332425
Name.starts_with("avx512.storent.")) {
@@ -2439,11 +2431,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
24392431
Value *Arg0 = CI->getArgOperand(0);
24402432
Value *Arg1 = CI->getArgOperand(1);
24412433

2442-
// Convert the type of the pointer to a pointer to the stored type.
2443-
Value *BC = Builder.CreateBitCast(
2444-
Arg0, PointerType::getUnqual(Arg1->getType()), "cast");
24452434
StoreInst *SI = Builder.CreateAlignedStore(
2446-
Arg1, BC,
2435+
Arg1, Arg0,
24472436
Align(Arg1->getType()->getPrimitiveSizeInBits().getFixedValue() / 8));
24482437
SI->setMetadata(LLVMContext::MD_nontemporal, Node);
24492438
} else if (Name == "sse2.storel.dq") {
@@ -2453,17 +2442,12 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
24532442
auto *NewVecTy = FixedVectorType::get(Type::getInt64Ty(C), 2);
24542443
Value *BC0 = Builder.CreateBitCast(Arg1, NewVecTy, "cast");
24552444
Value *Elt = Builder.CreateExtractElement(BC0, (uint64_t)0);
2456-
Value *BC = Builder.CreateBitCast(
2457-
Arg0, PointerType::getUnqual(Elt->getType()), "cast");
2458-
Builder.CreateAlignedStore(Elt, BC, Align(1));
2445+
Builder.CreateAlignedStore(Elt, Arg0, Align(1));
24592446
} else if (Name.starts_with("sse.storeu.") ||
24602447
Name.starts_with("sse2.storeu.") ||
24612448
Name.starts_with("avx.storeu.")) {
24622449
Value *Arg0 = CI->getArgOperand(0);
24632450
Value *Arg1 = CI->getArgOperand(1);
2464-
2465-
Arg0 = Builder.CreateBitCast(Arg0, PointerType::getUnqual(Arg1->getType()),
2466-
"cast");
24672451
Builder.CreateAlignedStore(Arg1, Arg0, Align(1));
24682452
} else if (Name == "avx512.mask.store.ss") {
24692453
Value *Mask = Builder.CreateAnd(CI->getArgOperand(2), Builder.getInt8(1));
@@ -2813,31 +2797,21 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
28132797
CI->getArgOperand(2), Aligned);
28142798
} else if (Name.starts_with("avx512.mask.expand.load.")) {
28152799
auto *ResultTy = cast<FixedVectorType>(CI->getType());
2816-
Type *PtrTy = ResultTy->getElementType();
2817-
2818-
// Cast the pointer to element type.
2819-
Value *Ptr = Builder.CreateBitCast(CI->getOperand(0),
2820-
llvm::PointerType::getUnqual(PtrTy));
2821-
28222800
Value *MaskVec = getX86MaskVec(Builder, CI->getArgOperand(2),
28232801
ResultTy->getNumElements());
28242802

2825-
Rep = Builder.CreateIntrinsic(Intrinsic::masked_expandload, ResultTy,
2826-
{Ptr, MaskVec, CI->getOperand(1)});
2803+
Rep = Builder.CreateIntrinsic(
2804+
Intrinsic::masked_expandload, ResultTy,
2805+
{CI->getOperand(0), MaskVec, CI->getOperand(1)});
28272806
} else if (Name.starts_with("avx512.mask.compress.store.")) {
28282807
auto *ResultTy = cast<VectorType>(CI->getArgOperand(1)->getType());
2829-
Type *PtrTy = ResultTy->getElementType();
2830-
2831-
// Cast the pointer to element type.
2832-
Value *Ptr = Builder.CreateBitCast(CI->getOperand(0),
2833-
llvm::PointerType::getUnqual(PtrTy));
2834-
28352808
Value *MaskVec =
28362809
getX86MaskVec(Builder, CI->getArgOperand(2),
28372810
cast<FixedVectorType>(ResultTy)->getNumElements());
28382811

2839-
Rep = Builder.CreateIntrinsic(Intrinsic::masked_compressstore, ResultTy,
2840-
{CI->getArgOperand(1), Ptr, MaskVec});
2812+
Rep = Builder.CreateIntrinsic(
2813+
Intrinsic::masked_compressstore, ResultTy,
2814+
{CI->getArgOperand(1), CI->getArgOperand(0), MaskVec});
28412815
} else if (Name.starts_with("avx512.mask.compress.") ||
28422816
Name.starts_with("avx512.mask.expand.")) {
28432817
auto *ResultTy = cast<FixedVectorType>(CI->getType());
@@ -2963,9 +2937,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
29632937
Type *EltTy = cast<VectorType>(CI->getType())->getElementType();
29642938
unsigned NumSrcElts = 128 / EltTy->getPrimitiveSizeInBits();
29652939
auto *VT = FixedVectorType::get(EltTy, NumSrcElts);
2966-
Value *Op = Builder.CreatePointerCast(CI->getArgOperand(0),
2967-
PointerType::getUnqual(VT));
2968-
Value *Load = Builder.CreateAlignedLoad(VT, Op, Align(1));
2940+
Value *Load = Builder.CreateAlignedLoad(VT, CI->getArgOperand(0), Align(1));
29692941
if (NumSrcElts == 2)
29702942
Rep = Builder.CreateShuffleVector(Load, ArrayRef<int>{0, 1, 0, 1});
29712943
else
@@ -3687,13 +3659,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
36873659
MDNode *Node = MDNode::get(
36883660
C, ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(C), 1)));
36893661

3690-
Value *Ptr = CI->getArgOperand(0);
3691-
3692-
// Convert the type of the pointer to a pointer to the stored type.
3693-
Value *BC = Builder.CreateBitCast(
3694-
Ptr, PointerType::getUnqual(CI->getType()), "cast");
36953662
LoadInst *LI = Builder.CreateAlignedLoad(
3696-
CI->getType(), BC,
3663+
CI->getType(), CI->getArgOperand(0),
36973664
Align(CI->getType()->getPrimitiveSizeInBits().getFixedValue() / 8));
36983665
LI->setMetadata(LLVMContext::MD_nontemporal, Node);
36993666
Rep = LI;
@@ -4045,10 +4012,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F,
40454012

40464013
// Extract the second result and store it.
40474014
Value *Data = Builder.CreateExtractValue(NewCall, 1);
4048-
// Cast the pointer to the right type.
4049-
Value *Ptr = Builder.CreateBitCast(
4050-
CI->getArgOperand(3), llvm::PointerType::getUnqual(Data->getType()));
4051-
Builder.CreateAlignedStore(Data, Ptr, Align(1));
4015+
Builder.CreateAlignedStore(Data, CI->getArgOperand(3), Align(1));
40524016
// Replace the original call result with the first result of the new call.
40534017
Value *CF = Builder.CreateExtractValue(NewCall, 0);
40544018

@@ -4756,10 +4720,7 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
47564720
NewCall = Builder.CreateCall(NewFn);
47574721
// Extract the second result and store it.
47584722
Value *Data = Builder.CreateExtractValue(NewCall, 1);
4759-
// Cast the pointer to the right type.
4760-
Value *Ptr = Builder.CreateBitCast(CI->getArgOperand(0),
4761-
llvm::PointerType::getUnqual(Data->getType()));
4762-
Builder.CreateAlignedStore(Data, Ptr, Align(1));
4723+
Builder.CreateAlignedStore(Data, CI->getArgOperand(0), Align(1));
47634724
// Replace the original call result with the first result of the new call.
47644725
Value *TSC = Builder.CreateExtractValue(NewCall, 0);
47654726

0 commit comments

Comments
 (0)