mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[NFC] Use SelectionDAG::getMemBasePlusOffset() instead of getNode(ISD::ADD)
Summary: To find potential opportunities to use getMemBasePlusOffset() I looked at all ISD::ADD uses found with the regex getNode\(ISD::ADD,.+,.+Ptr in lib/CodeGen/SelectionDAG. If this patch is accepted I will convert the files in the individual backends too. The motivation for this change is our out-of-tree CHERI backend (https://github.com/CTSRD-CHERI/llvm-project). We use a separate register type to store pointers (128-bit capabilities, which are effectively unforgeable and monotonic fat pointers). These capabilities permit a reduced set of operations and therefore use a separate ValueType (iFATPTR). to represent pointers implemented as capabilities. Therefore, we need to avoid using ISD::ADD for our patterns that operate on pointers and need to use a function that chooses ISD::ADD or a new ISD::PTRADD opcode depending on the value type. We originally added a new DAG.getPointerAdd() function, but after this patch series we can modify the implementation of getMemBasePlusOffset() instead. Avoiding direct uses of ISD::ADD for pointer types will significantly reduce the amount of assertion/instruction selection failures for us in future upstream merges. Reviewers: spatel Reviewed By: spatel Subscribers: merge_guards_bot, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D71207
This commit is contained in:
parent
047493f270
commit
b2129c438f
@ -9295,8 +9295,7 @@ SDValue DAGCombiner::CombineExtLoad(SDNode *N) {
|
||||
LN0->getPointerInfo().getWithOffset(Offset), SplitSrcVT, Align,
|
||||
LN0->getMemOperand()->getFlags(), LN0->getAAInfo());
|
||||
|
||||
BasePtr = DAG.getNode(ISD::ADD, DL, BasePtr.getValueType(), BasePtr,
|
||||
DAG.getConstant(Stride, DL, BasePtr.getValueType()));
|
||||
BasePtr = DAG.getMemBasePlusOffset(BasePtr, Stride, DL);
|
||||
|
||||
Loads.push_back(SplitLoad.getValue(0));
|
||||
Chains.push_back(SplitLoad.getValue(1));
|
||||
@ -10476,17 +10475,14 @@ SDValue DAGCombiner::ReduceLoadWidth(SDNode *N) {
|
||||
if (DAG.getDataLayout().isBigEndian())
|
||||
ShAmt = AdjustBigEndianShift(ShAmt);
|
||||
|
||||
EVT PtrType = N0.getOperand(1).getValueType();
|
||||
uint64_t PtrOff = ShAmt / 8;
|
||||
unsigned NewAlign = MinAlign(LN0->getAlignment(), PtrOff);
|
||||
SDLoc DL(LN0);
|
||||
// The original load itself didn't wrap, so an offset within it doesn't.
|
||||
SDNodeFlags Flags;
|
||||
Flags.setNoUnsignedWrap(true);
|
||||
SDValue NewPtr = DAG.getNode(ISD::ADD, DL,
|
||||
PtrType, LN0->getBasePtr(),
|
||||
DAG.getConstant(PtrOff, DL, PtrType),
|
||||
Flags);
|
||||
SDValue NewPtr =
|
||||
DAG.getMemBasePlusOffset(LN0->getBasePtr(), PtrOff, DL, Flags);
|
||||
AddToWorklist(NewPtr.getNode());
|
||||
|
||||
SDValue Load;
|
||||
@ -15036,8 +15032,7 @@ ShrinkLoadReplaceStoreWithStore(const std::pair<unsigned, unsigned> &MaskInfo,
|
||||
SDValue Ptr = St->getBasePtr();
|
||||
if (StOffset) {
|
||||
SDLoc DL(IVal);
|
||||
Ptr = DAG.getNode(ISD::ADD, DL, Ptr.getValueType(),
|
||||
Ptr, DAG.getConstant(StOffset, DL, Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, StOffset, DL);
|
||||
NewAlign = MinAlign(NewAlign, StOffset);
|
||||
}
|
||||
|
||||
@ -15148,10 +15143,7 @@ SDValue DAGCombiner::ReduceLoadOpStoreWidth(SDNode *N) {
|
||||
if (NewAlign < DAG.getDataLayout().getABITypeAlignment(NewVTTy))
|
||||
return SDValue();
|
||||
|
||||
SDValue NewPtr = DAG.getNode(ISD::ADD, SDLoc(LD),
|
||||
Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(PtrOff, SDLoc(LD),
|
||||
Ptr.getValueType()));
|
||||
SDValue NewPtr = DAG.getMemBasePlusOffset(Ptr, PtrOff, SDLoc(LD));
|
||||
SDValue NewLD =
|
||||
DAG.getLoad(NewVT, SDLoc(N0), LD->getChain(), NewPtr,
|
||||
LD->getPointerInfo().getWithOffset(PtrOff), NewAlign,
|
||||
@ -16328,8 +16320,7 @@ SDValue DAGCombiner::replaceStoreOfFPConstant(StoreSDNode *ST) {
|
||||
|
||||
SDValue St0 = DAG.getStore(Chain, DL, Lo, Ptr, ST->getPointerInfo(),
|
||||
ST->getAlignment(), MMOFlags, AAInfo);
|
||||
Ptr = DAG.getNode(ISD::ADD, DL, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(4, DL, Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, 4, DL);
|
||||
Alignment = MinAlign(Alignment, 4U);
|
||||
SDValue St1 = DAG.getStore(Chain, DL, Hi, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(4),
|
||||
@ -16703,9 +16694,7 @@ SDValue DAGCombiner::splitMergedValStore(StoreSDNode *ST) {
|
||||
// Lower value store.
|
||||
SDValue St0 = DAG.getStore(Chain, DL, Lo, Ptr, ST->getPointerInfo(),
|
||||
ST->getAlignment(), MMOFlags, AAInfo);
|
||||
Ptr =
|
||||
DAG.getNode(ISD::ADD, DL, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(HalfValBitSize / 8, DL, Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, HalfValBitSize / 8, DL);
|
||||
// Higher value store.
|
||||
SDValue St1 =
|
||||
DAG.getStore(St0, DL, Hi, Ptr,
|
||||
@ -16969,7 +16958,7 @@ SDValue DAGCombiner::scalarizeExtractedVectorLoad(SDNode *EVE, EVT InVecVT,
|
||||
// operand can't represent this new access since the offset is variable.
|
||||
MPI = MachinePointerInfo(OriginalLoad->getPointerInfo().getAddrSpace());
|
||||
}
|
||||
NewPtr = DAG.getNode(ISD::ADD, DL, PtrType, NewPtr, Offset);
|
||||
NewPtr = DAG.getMemBasePlusOffset(NewPtr, Offset, DL);
|
||||
|
||||
// The replacement we need to do here is a little tricky: we need to
|
||||
// replace an extractelement of a load with a load.
|
||||
|
@ -470,8 +470,7 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
|
||||
Lo = DAG.getStore(Chain, dl, Lo, Ptr, ST->getPointerInfo(), Alignment,
|
||||
MMOFlags, AAInfo);
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(4, dl, Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, 4, dl);
|
||||
Hi = DAG.getStore(Chain, dl, Hi, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(4),
|
||||
MinAlign(Alignment, 4U), MMOFlags, AAInfo);
|
||||
@ -581,9 +580,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
|
||||
// Store the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl,
|
||||
Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, IncrementSize, dl);
|
||||
Hi = DAG.getNode(
|
||||
ISD::SRL, dl, Value.getValueType(), Value,
|
||||
DAG.getConstant(RoundWidth, dl,
|
||||
@ -797,9 +794,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl,
|
||||
Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, IncrementSize, dl);
|
||||
Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, MinAlign(Alignment, IncrementSize), MMOFlags,
|
||||
@ -828,9 +823,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl,
|
||||
Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, IncrementSize, dl);
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, Node->getValueType(0), Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, MinAlign(Alignment, IncrementSize), MMOFlags,
|
||||
@ -1418,7 +1411,7 @@ SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
|
||||
unsigned Offset = TypeByteSize*i;
|
||||
|
||||
SDValue Idx = DAG.getConstant(Offset, dl, FIPtr.getValueType());
|
||||
Idx = DAG.getNode(ISD::ADD, dl, FIPtr.getValueType(), FIPtr, Idx);
|
||||
Idx = DAG.getMemBasePlusOffset(FIPtr, Idx, dl);
|
||||
|
||||
// If the destination vector element type is narrower than the source
|
||||
// element type, only store the bits necessary.
|
||||
@ -1481,8 +1474,7 @@ void SelectionDAGLegalize::getSignAsIntValue(FloatSignAsInt &State,
|
||||
} else {
|
||||
// Advance the pointer so that the loaded byte will contain the sign bit.
|
||||
unsigned ByteOffset = (FloatVT.getSizeInBits() / 8) - 1;
|
||||
IntPtr = DAG.getNode(ISD::ADD, DL, StackPtr.getValueType(), StackPtr,
|
||||
DAG.getConstant(ByteOffset, DL, StackPtr.getValueType()));
|
||||
IntPtr = DAG.getMemBasePlusOffset(StackPtr, ByteOffset, DL);
|
||||
State.IntPointerInfo = MachinePointerInfo::getFixedStack(MF, FI,
|
||||
ByteOffset);
|
||||
}
|
||||
|
@ -2757,8 +2757,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
unsigned IncrementSize = NVT.getSizeInBits()/8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl, Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, IncrementSize, dl);
|
||||
Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize), NEVT,
|
||||
MinAlign(Alignment, IncrementSize), MMOFlags, AAInfo);
|
||||
@ -2782,8 +2781,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
Alignment, MMOFlags, AAInfo);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl, Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, IncrementSize, dl);
|
||||
// Load the rest of the low bits.
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, NVT, Ch, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
@ -4103,8 +4101,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
|
||||
SDValue Offset = DAG.getSelect(dl, Zero.getValueType(), SignSet,
|
||||
Zero, Four);
|
||||
unsigned Alignment = cast<ConstantPoolSDNode>(FudgePtr)->getAlignment();
|
||||
FudgePtr = DAG.getNode(ISD::ADD, dl, FudgePtr.getValueType(),
|
||||
FudgePtr, Offset);
|
||||
FudgePtr = DAG.getMemBasePlusOffset(FudgePtr, Offset, dl);
|
||||
Alignment = std::min(Alignment, 4u);
|
||||
|
||||
// Load the value out, extending it from f32 to the destination float type.
|
||||
|
@ -169,9 +169,7 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
unsigned IncrementSize = NOutVT.getSizeInBits() / 8;
|
||||
StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr,
|
||||
DAG.getConstant(IncrementSize, dl,
|
||||
StackPtr.getValueType()));
|
||||
StackPtr = DAG.getMemBasePlusOffset(StackPtr, IncrementSize, dl);
|
||||
|
||||
// Load the second half from the stack slot.
|
||||
Hi = DAG.getLoad(NOutVT, dl, Store, StackPtr,
|
||||
@ -263,8 +261,7 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
unsigned IncrementSize = NVT.getSizeInBits() / 8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl, Ptr.getValueType()));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, IncrementSize, dl);
|
||||
Hi = DAG.getLoad(NVT, dl, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
MinAlign(Alignment, IncrementSize),
|
||||
|
@ -1164,9 +1164,7 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo,
|
||||
|
||||
// Increment the pointer to the other part.
|
||||
unsigned IncrementSize = Lo.getValueSizeInBits() / 8;
|
||||
StackPtr =
|
||||
DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr,
|
||||
DAG.getConstant(IncrementSize, dl, StackPtr.getValueType()));
|
||||
StackPtr = DAG.getMemBasePlusOffset(StackPtr, IncrementSize, dl);
|
||||
|
||||
// Load the Hi part from the stack slot.
|
||||
Hi = DAG.getLoad(Hi.getValueType(), dl, Store, StackPtr, MachinePointerInfo(),
|
||||
|
@ -4224,7 +4224,6 @@ void SelectionDAGBuilder::visitStore(const StoreInst &I) {
|
||||
SDValue Root = getRoot();
|
||||
SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
|
||||
SDLoc dl = getCurSDLoc();
|
||||
EVT PtrVT = Ptr.getValueType();
|
||||
unsigned Alignment = I.getAlignment();
|
||||
AAMDNodes AAInfo;
|
||||
I.getAAMetadata(AAInfo);
|
||||
@ -4250,8 +4249,7 @@ void SelectionDAGBuilder::visitStore(const StoreInst &I) {
|
||||
Root = Chain;
|
||||
ChainI = 0;
|
||||
}
|
||||
SDValue Add = DAG.getNode(ISD::ADD, dl, PtrVT, Ptr,
|
||||
DAG.getConstant(Offsets[i], dl, PtrVT), Flags);
|
||||
SDValue Add = DAG.getMemBasePlusOffset(Ptr, Offsets[i], dl, Flags);
|
||||
SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
|
||||
if (MemVTs[i] != ValueVTs[i])
|
||||
Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
|
||||
@ -6695,7 +6693,7 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
|
||||
// Add the offset to the FP.
|
||||
Value *FP = I.getArgOperand(1);
|
||||
SDValue FPVal = getValue(FP);
|
||||
SDValue Add = DAG.getNode(ISD::ADD, sdl, PtrVT, FPVal, OffsetVal);
|
||||
SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
|
||||
setValue(&I, Add);
|
||||
|
||||
return;
|
||||
|
@ -3282,11 +3282,9 @@ SDValue TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
EVT newVT = EVT::getIntegerVT(*DAG.getContext(), bestWidth);
|
||||
if (newVT.isRound() &&
|
||||
shouldReduceLoadWidth(Lod, ISD::NON_EXTLOAD, newVT)) {
|
||||
EVT PtrType = Lod->getOperand(1).getValueType();
|
||||
SDValue Ptr = Lod->getBasePtr();
|
||||
if (bestOffset != 0)
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, PtrType, Lod->getBasePtr(),
|
||||
DAG.getConstant(bestOffset, dl, PtrType));
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, bestOffset, dl);
|
||||
unsigned NewAlign = MinAlign(Lod->getAlignment(), bestOffset);
|
||||
SDValue NewLoad = DAG.getLoad(
|
||||
newVT, dl, Lod->getChain(), Ptr,
|
||||
@ -6906,7 +6904,7 @@ SDValue TargetLowering::getVectorElementPointer(SelectionDAG &DAG,
|
||||
|
||||
Index = DAG.getNode(ISD::MUL, dl, IdxVT, Index,
|
||||
DAG.getConstant(EltSize, dl, IdxVT));
|
||||
return DAG.getNode(ISD::ADD, dl, IdxVT, VecPtr, Index);
|
||||
return DAG.getMemBasePlusOffset(VecPtr, Index, dl);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
Loading…
Reference in New Issue
Block a user