[llvm] 1f006f5 - [DAG] mergeTruncStores - early out if we collect more than the maximum number of stores
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 23 08:22:53 PDT 2023
Author: Simon Pilgrim
Date: 2023-06-23T16:22:11+01:00
New Revision: 1f006f5fb63df4facb2c45511090b3fdd3e07de5
URL: https://github.com/llvm/llvm-project/commit/1f006f5fb63df4facb2c45511090b3fdd3e07de5
DIFF: https://github.com/llvm/llvm-project/commit/1f006f5fb63df4facb2c45511090b3fdd3e07de5.diff
LOG: [DAG] mergeTruncStores - early out if we collect more than the maximum number of stores
If we have an excessive number of stores in a single chain then the candidate WideVT may exceed the maximum width of an EVT integer type (and will assert) - but since mergeTruncStores doesn't support anything wider than a i64 store we should just early-out if we've collected more than stores than that.
Fixes #63306
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 77b05a3a12cea..ab36d22a2fb43 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -8679,9 +8679,12 @@ SDValue DAGCombiner::mergeTruncStores(StoreSDNode *N) {
!N->isSimple() || N->isIndexed())
return SDValue();
- // Collect all of the stores in the chain.
+ // Collect all of the stores in the chain, upto the maximum store width (i64).
SDValue Chain = N->getChain();
SmallVector<StoreSDNode *, 8> Stores = {N};
+ unsigned NarrowNumBits = MemVT.getScalarSizeInBits();
+ unsigned MaxWideNumBits = 64;
+ unsigned MaxStores = MaxWideNumBits / NarrowNumBits;
while (auto *Store = dyn_cast<StoreSDNode>(Chain)) {
// All stores must be the same size to ensure that we are writing all of the
// bytes in the wide value.
@@ -8695,6 +8698,8 @@ SDValue DAGCombiner::mergeTruncStores(StoreSDNode *N) {
return SDValue();
Stores.push_back(Store);
Chain = Store->getChain();
+ if (MaxStores < Stores.size())
+ return SDValue();
}
// There is no reason to continue if we do not have at least a pair of stores.
if (Stores.size() < 2)
@@ -8703,7 +8708,6 @@ SDValue DAGCombiner::mergeTruncStores(StoreSDNode *N) {
// Handle simple types only.
LLVMContext &Context = *DAG.getContext();
unsigned NumStores = Stores.size();
- unsigned NarrowNumBits = N->getMemoryVT().getScalarSizeInBits();
unsigned WideNumBits = NumStores * NarrowNumBits;
EVT WideVT = EVT::getIntegerVT(Context, WideNumBits);
if (WideVT != MVT::i16 && WideVT != MVT::i32 && WideVT != MVT::i64)
More information about the llvm-commits
mailing list