[llvm] r309777 - [DAG] Refactor store merge subexpressions. NFC.
Nirav Dave via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 1 18:08:38 PDT 2017
Author: niravd
Date: Tue Aug 1 18:08:38 2017
New Revision: 309777
URL: http://llvm.org/viewvc/llvm-project?rev=309777&view=rev
Log:
[DAG] Refactor store merge subexpressions. NFC.
Distribute various expressions across ifs.
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=309777&r1=309776&r2=309777&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Aug 1 18:08:38 2017
@@ -12445,36 +12445,36 @@ bool DAGCombiner::MergeStoresOfConstants
if (NumStores < 2)
return false;
- int64_t ElementSizeBytes = MemVT.getSizeInBits() / 8;
-
// The latest Node in the DAG.
SDLoc DL(StoreNodes[0].MemNode);
- SDValue StoredVal;
+ int64_t ElementSizeBytes = MemVT.getSizeInBits() / 8;
+ unsigned SizeInBits = NumStores * ElementSizeBytes * 8;
+ unsigned NumMemElts = MemVT.isVector() ? MemVT.getVectorNumElements() : 1;
+
+ EVT StoreTy;
if (UseVector) {
- bool IsVec = MemVT.isVector();
- unsigned Elts = NumStores;
- if (IsVec) {
- // When merging vector stores, get the total number of elements.
- Elts *= MemVT.getVectorNumElements();
- }
+ unsigned Elts = NumStores * NumMemElts;
// Get the type for the merged vector store.
- EVT Ty = EVT::getVectorVT(*DAG.getContext(), MemVT.getScalarType(), Elts);
- assert(TLI.isTypeLegal(Ty) && "Illegal vector store");
+ StoreTy = EVT::getVectorVT(*DAG.getContext(), MemVT.getScalarType(), Elts);
+ } else
+ StoreTy = EVT::getIntegerVT(*DAG.getContext(), SizeInBits);
+ SDValue StoredVal;
+ if (UseVector) {
if (IsConstantSrc) {
SmallVector<SDValue, 8> BuildVector;
- for (unsigned I = 0, E = Ty.getVectorNumElements(); I != E; ++I) {
+ for (unsigned I = 0; I != NumStores; ++I) {
StoreSDNode *St = cast<StoreSDNode>(StoreNodes[I].MemNode);
SDValue Val = St->getValue();
if (MemVT.getScalarType().isInteger())
- if (auto *CFP = dyn_cast<ConstantFPSDNode>(St->getValue()))
+ if (auto *CFP = dyn_cast<ConstantFPSDNode>(Val))
Val = DAG.getConstant(
(uint32_t)CFP->getValueAPF().bitcastToAPInt().getZExtValue(),
SDLoc(CFP), MemVT);
BuildVector.push_back(Val);
}
- StoredVal = DAG.getBuildVector(Ty, DL, BuildVector);
+ StoredVal = DAG.getBuildVector(StoreTy, DL, BuildVector);
} else {
SmallVector<SDValue, 8> Ops;
for (unsigned i = 0; i < NumStores; ++i) {
@@ -12487,14 +12487,15 @@ bool DAGCombiner::MergeStoresOfConstants
}
// Build the extracted vector elements back into a vector.
- StoredVal = DAG.getNode(IsVec ? ISD::CONCAT_VECTORS : ISD::BUILD_VECTOR,
- DL, Ty, Ops); }
+ StoredVal = DAG.getNode(MemVT.isVector() ? ISD::CONCAT_VECTORS
+ : ISD::BUILD_VECTOR,
+ DL, StoreTy, Ops);
+ }
} else {
// We should always use a vector store when merging extracted vector
// elements, so this path implies a store of constants.
assert(IsConstantSrc && "Merged vector elements should use vector store");
- unsigned SizeInBits = NumStores * ElementSizeBytes * 8;
APInt StoreInt(SizeInBits, 0);
// Construct a single integer constant which is made of the smaller
@@ -12516,7 +12517,6 @@ bool DAGCombiner::MergeStoresOfConstants
}
// Create the new Load and Store operations.
- EVT StoreTy = EVT::getIntegerVT(*DAG.getContext(), SizeInBits);
StoredVal = DAG.getConstant(StoreInt, DL, StoreTy);
}
@@ -12588,12 +12588,10 @@ void DAGCombiner::getStoreMergeCandidate
if (Other->isVolatile() || Other->isIndexed())
return false;
SDValue Val = Other->getValue();
- // We can merge constant floats to equivalent integers
- if (Other->getMemoryVT() != MemVT)
- if (!(MemVT.isInteger() && MemVT.bitsEq(Other->getMemoryVT()) &&
- isa<ConstantFPSDNode>(Val)))
- return false;
if (IsLoadSrc) {
+ // Loads must match type.
+ if (Other->getMemoryVT() != MemVT)
+ return false;
// The Load's Base Ptr must also match
if (LoadSDNode *OtherLd = dyn_cast<LoadSDNode>(Val)) {
auto LPtr = BaseIndexOffset::match(OtherLd->getBasePtr(), DAG);
@@ -12605,10 +12603,17 @@ void DAGCombiner::getStoreMergeCandidate
return false;
}
if (IsConstantSrc) {
+ // Allow merging constants of different types as integers.
+ if (MemVT.isInteger() ? !MemVT.bitsEq(Other->getMemoryVT())
+ : Other->getMemoryVT() != MemVT)
+ return false;
if (!(isa<ConstantSDNode>(Val) || isa<ConstantFPSDNode>(Val)))
return false;
}
if (IsExtractVecSrc) {
+ // Must match type.
+ if (Other->getMemoryVT() != MemVT)
+ return false;
if (!(Val.getOpcode() == ISD::EXTRACT_VECTOR_ELT ||
Val.getOpcode() == ISD::EXTRACT_SUBVECTOR))
return false;
More information about the llvm-commits
mailing list