mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 23:18:58 +00:00
AMDGPU/R600: Remove MergeVectorStores from legalization
This is handled by DAGCombiner in a more generic way Differential Revision: https://reviews.llvm.org/D23970 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280019 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
55a983f6cd
commit
79944cc240
@ -980,65 +980,6 @@ SDValue AMDGPUTargetLowering::SplitVectorLoad(const SDValue Op,
|
||||
return DAG.getMergeValues(Ops, SL);
|
||||
}
|
||||
|
||||
// FIXME: This isn't doing anything for SI. This should be used in a target
|
||||
// combine during type legalization.
|
||||
SDValue AMDGPUTargetLowering::MergeVectorStore(const SDValue &Op,
|
||||
SelectionDAG &DAG) const {
|
||||
StoreSDNode *Store = cast<StoreSDNode>(Op);
|
||||
EVT MemVT = Store->getMemoryVT();
|
||||
unsigned MemBits = MemVT.getSizeInBits();
|
||||
|
||||
// Byte stores are really expensive, so if possible, try to pack 32-bit vector
|
||||
// truncating store into an i32 store.
|
||||
// XXX: We could also handle optimize other vector bitwidths.
|
||||
if (!MemVT.isVector() || MemBits > 32) {
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDLoc DL(Op);
|
||||
SDValue Value = Store->getValue();
|
||||
EVT VT = Value.getValueType();
|
||||
EVT ElemVT = VT.getVectorElementType();
|
||||
SDValue Ptr = Store->getBasePtr();
|
||||
EVT MemEltVT = MemVT.getVectorElementType();
|
||||
unsigned MemEltBits = MemEltVT.getSizeInBits();
|
||||
unsigned MemNumElements = MemVT.getVectorNumElements();
|
||||
unsigned PackedSize = MemVT.getStoreSizeInBits();
|
||||
SDValue Mask = DAG.getConstant((1 << MemEltBits) - 1, DL, MVT::i32);
|
||||
|
||||
assert(Value.getValueType().getScalarSizeInBits() >= 32);
|
||||
|
||||
SDValue PackedValue;
|
||||
for (unsigned i = 0; i < MemNumElements; ++i) {
|
||||
SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, ElemVT, Value,
|
||||
DAG.getConstant(i, DL, MVT::i32));
|
||||
Elt = DAG.getZExtOrTrunc(Elt, DL, MVT::i32);
|
||||
Elt = DAG.getNode(ISD::AND, DL, MVT::i32, Elt, Mask); // getZeroExtendInReg
|
||||
|
||||
SDValue Shift = DAG.getConstant(MemEltBits * i, DL, MVT::i32);
|
||||
Elt = DAG.getNode(ISD::SHL, DL, MVT::i32, Elt, Shift);
|
||||
|
||||
if (i == 0) {
|
||||
PackedValue = Elt;
|
||||
} else {
|
||||
PackedValue = DAG.getNode(ISD::OR, DL, MVT::i32, PackedValue, Elt);
|
||||
}
|
||||
}
|
||||
|
||||
if (PackedSize < 32) {
|
||||
EVT PackedVT = EVT::getIntegerVT(*DAG.getContext(), PackedSize);
|
||||
return DAG.getTruncStore(Store->getChain(), DL, PackedValue, Ptr,
|
||||
Store->getMemOperand()->getPointerInfo(), PackedVT,
|
||||
Store->getAlignment(),
|
||||
Store->getMemOperand()->getFlags());
|
||||
}
|
||||
|
||||
return DAG.getStore(Store->getChain(), DL, PackedValue, Ptr,
|
||||
Store->getMemOperand()->getPointerInfo(),
|
||||
Store->getAlignment(),
|
||||
Store->getMemOperand()->getFlags());
|
||||
}
|
||||
|
||||
SDValue AMDGPUTargetLowering::SplitVectorStore(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
StoreSDNode *Store = cast<StoreSDNode>(Op);
|
||||
|
@ -31,9 +31,6 @@ protected:
|
||||
SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
||||
/// \brief Lower vector stores by merging the vector elements into an integer
|
||||
/// of the same bitwidth.
|
||||
SDValue MergeVectorStore(const SDValue &Op, SelectionDAG &DAG) const;
|
||||
/// \brief Split a vector store into multiple scalar stores.
|
||||
/// \returns The resulting chain.
|
||||
|
||||
|
@ -1116,9 +1116,6 @@ SDValue R600TargetLowering::lowerPrivateTruncStore(StoreSDNode *Store,
|
||||
}
|
||||
|
||||
SDValue R600TargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
|
||||
if (SDValue Result = AMDGPUTargetLowering::MergeVectorStore(Op, DAG))
|
||||
return Result;
|
||||
|
||||
StoreSDNode *StoreNode = cast<StoreSDNode>(Op);
|
||||
unsigned AS = StoreNode->getAddressSpace();
|
||||
SDValue Value = StoreNode->getValue();
|
||||
|
Loading…
Reference in New Issue
Block a user