mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[X86] Remove code that expands truncating stores from combineStore.
We shouldn't form trunc stores that need to be expanded now that we are using widening legalization. llvm-svn: 368400
This commit is contained in:
parent
8d9e260753
commit
d45a7192a6
@ -39922,82 +39922,7 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
|
||||
dl, Val, St->getBasePtr(),
|
||||
St->getMemoryVT(), St->getMemOperand(), DAG);
|
||||
|
||||
unsigned NumElems = VT.getVectorNumElements();
|
||||
assert(StVT != VT && "Cannot truncate to the same type");
|
||||
unsigned FromSz = VT.getScalarSizeInBits();
|
||||
unsigned ToSz = StVT.getScalarSizeInBits();
|
||||
|
||||
// The truncating store is legal in some cases. For example
|
||||
// vpmovqb, vpmovqw, vpmovqd, vpmovdb, vpmovdw
|
||||
// are designated for truncate store.
|
||||
// In this case we don't need any further transformations.
|
||||
if (TLI.isTruncStoreLegalOrCustom(VT, StVT))
|
||||
return SDValue();
|
||||
|
||||
// From, To sizes and ElemCount must be pow of two
|
||||
if (!isPowerOf2_32(NumElems * FromSz * ToSz)) return SDValue();
|
||||
// We are going to use the original vector elt for storing.
|
||||
// Accumulated smaller vector elements must be a multiple of the store size.
|
||||
if (0 != (NumElems * FromSz) % ToSz) return SDValue();
|
||||
|
||||
unsigned SizeRatio = FromSz / ToSz;
|
||||
|
||||
assert(SizeRatio * NumElems * ToSz == VT.getSizeInBits());
|
||||
|
||||
// Create a type on which we perform the shuffle
|
||||
EVT WideVecVT = EVT::getVectorVT(*DAG.getContext(),
|
||||
StVT.getScalarType(), NumElems*SizeRatio);
|
||||
|
||||
assert(WideVecVT.getSizeInBits() == VT.getSizeInBits());
|
||||
|
||||
SDValue WideVec = DAG.getBitcast(WideVecVT, St->getValue());
|
||||
SmallVector<int, 8> ShuffleVec(NumElems * SizeRatio, -1);
|
||||
for (unsigned i = 0; i != NumElems; ++i)
|
||||
ShuffleVec[i] = i * SizeRatio;
|
||||
|
||||
// Can't shuffle using an illegal type.
|
||||
if (!TLI.isTypeLegal(WideVecVT))
|
||||
return SDValue();
|
||||
|
||||
SDValue Shuff = DAG.getVectorShuffle(WideVecVT, dl, WideVec,
|
||||
DAG.getUNDEF(WideVecVT),
|
||||
ShuffleVec);
|
||||
// At this point all of the data is stored at the bottom of the
|
||||
// register. We now need to save it to mem.
|
||||
|
||||
// Find the largest store unit
|
||||
MVT StoreType = MVT::i8;
|
||||
for (MVT Tp : MVT::integer_valuetypes()) {
|
||||
if (TLI.isTypeLegal(Tp) && Tp.getSizeInBits() <= NumElems * ToSz)
|
||||
StoreType = Tp;
|
||||
}
|
||||
|
||||
// On 32bit systems, we can't save 64bit integers. Try bitcasting to F64.
|
||||
if (TLI.isTypeLegal(MVT::f64) && StoreType.getSizeInBits() < 64 &&
|
||||
(64 <= NumElems * ToSz))
|
||||
StoreType = MVT::f64;
|
||||
|
||||
// Bitcast the original vector into a vector of store-size units
|
||||
EVT StoreVecVT = EVT::getVectorVT(*DAG.getContext(),
|
||||
StoreType, VT.getSizeInBits()/StoreType.getSizeInBits());
|
||||
assert(StoreVecVT.getSizeInBits() == VT.getSizeInBits());
|
||||
SDValue ShuffWide = DAG.getBitcast(StoreVecVT, Shuff);
|
||||
SmallVector<SDValue, 8> Chains;
|
||||
SDValue Ptr = St->getBasePtr();
|
||||
|
||||
// Perform one or more big stores into memory.
|
||||
for (unsigned i=0, e=(ToSz*NumElems)/StoreType.getSizeInBits(); i!=e; ++i) {
|
||||
SDValue SubVec = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||
StoreType, ShuffWide,
|
||||
DAG.getIntPtrConstant(i, dl));
|
||||
SDValue Ch =
|
||||
DAG.getStore(St->getChain(), dl, SubVec, Ptr, St->getPointerInfo(),
|
||||
St->getAlignment(), St->getMemOperand()->getFlags());
|
||||
Ptr = DAG.getMemBasePlusOffset(Ptr, StoreType.getStoreSize(), dl);
|
||||
Chains.push_back(Ch);
|
||||
}
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
// Turn load->store of MMX types into GPR load/stores. This avoids clobbering
|
||||
|
Loading…
Reference in New Issue
Block a user