mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Revert "Revert "Fix merges of non-zero vector stores""
Reapply r239539. Don't assume the collected number of stores is the same vector size. Just take the first N stores to fill the vector. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239825 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -388,6 +388,13 @@ namespace {
|
||||
unsigned SequenceNum;
|
||||
};
|
||||
|
||||
/// This is a helper function for MergeStoresOfConstantsOrVecElts. Returns a
|
||||
/// constant build_vector of the stored constant values in Stores.
|
||||
SDValue getMergedConstantVectorStore(SelectionDAG &DAG,
|
||||
SDLoc SL,
|
||||
ArrayRef<MemOpLink> Stores,
|
||||
EVT Ty) const;
|
||||
|
||||
/// This is a helper function for MergeConsecutiveStores. When the source
|
||||
/// elements of the consecutive stores are all constants or all extracted
|
||||
/// vector elements, try to merge them into one larger store.
|
||||
@@ -10591,6 +10598,18 @@ struct BaseIndexOffset {
|
||||
};
|
||||
} // namespace
|
||||
|
||||
SDValue DAGCombiner::getMergedConstantVectorStore(SelectionDAG &DAG,
|
||||
SDLoc SL,
|
||||
ArrayRef<MemOpLink> Stores,
|
||||
EVT Ty) const {
|
||||
SmallVector<SDValue, 8> BuildVector;
|
||||
|
||||
for (unsigned I = 0, E = Ty.getVectorNumElements(); I != E; ++I)
|
||||
BuildVector.push_back(cast<StoreSDNode>(Stores[I].MemNode)->getValue());
|
||||
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, SL, Ty, BuildVector);
|
||||
}
|
||||
|
||||
bool DAGCombiner::MergeStoresOfConstantsOrVecElts(
|
||||
SmallVectorImpl<MemOpLink> &StoreNodes, EVT MemVT,
|
||||
unsigned NumElem, bool IsConstantSrc, bool UseVector) {
|
||||
@@ -10621,12 +10640,7 @@ bool DAGCombiner::MergeStoresOfConstantsOrVecElts(
|
||||
EVT Ty = EVT::getVectorVT(*DAG.getContext(), MemVT, NumElem);
|
||||
assert(TLI.isTypeLegal(Ty) && "Illegal vector store");
|
||||
if (IsConstantSrc) {
|
||||
// A vector store with a constant source implies that the constant is
|
||||
// zero; we only handle merging stores of constant zeros because the zero
|
||||
// can be materialized without a load.
|
||||
// It may be beneficial to loosen this restriction to allow non-zero
|
||||
// store merging.
|
||||
StoredVal = DAG.getConstant(0, DL, Ty);
|
||||
StoredVal = getMergedConstantVectorStore(DAG, DL, StoreNodes, Ty);
|
||||
} else {
|
||||
SmallVector<SDValue, 8> Ops;
|
||||
for (unsigned i = 0; i < NumElem ; ++i) {
|
||||
|
Reference in New Issue
Block a user