From 294ca2fd69a077b35acec9d498120d6cb0324dae Mon Sep 17 00:00:00 2001 From: Naveen Saini Date: Fri, 27 Aug 2021 11:53:27 +0800 Subject: [PATCH 1/2] This patch is required to fix the crash referenced to in #1767 It is a port of the following llvm 11.0 commit : https://reviews.llvm.org/D76994. Upstream-Status: Backport [https://github.com/llvm/llvm-project/commit/41f13f1f64d2074ae7512fb23656c22585e912bd] Signed-off-by: Naveen Saini --- .../CodeGen/SelectionDAG/LegalizeTypes.cpp | 3 +- llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 31 ++++++++++++------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp index 63ddb59fce68..822da2183269 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp @@ -173,7 +173,7 @@ void DAGTypeLegalizer::PerformExpensiveChecks() { } } } - +#ifndef NDEBUG // Checked that NewNodes are only used by other NewNodes. for (unsigned i = 0, e = NewNodes.size(); i != e; ++i) { SDNode *N = NewNodes[i]; @@ -181,6 +181,7 @@ void DAGTypeLegalizer::PerformExpensiveChecks() { UI != UE; ++UI) assert(UI->getNodeId() == NewNode && "NewNode used by non-NewNode!"); } +#endif } /// This is the main entry point for the type legalizer. This does a top-down diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h index faae14444d51..b908c5c58e9f 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h @@ -155,7 +155,9 @@ private: const SDValue &getSDValue(TableId &Id) { RemapId(Id); assert(Id && "TableId should be non-zero"); - return IdToValueMap[Id]; + auto I = IdToValueMap.find(Id); + assert(I != IdToValueMap.end() && "cannot find Id in map"); + return I->second; } public: @@ -172,24 +174,29 @@ public: bool run(); void NoteDeletion(SDNode *Old, SDNode *New) { + assert(Old != New && "node replaced with self"); for (unsigned i = 0, e = Old->getNumValues(); i != e; ++i) { TableId NewId = getTableId(SDValue(New, i)); TableId OldId = getTableId(SDValue(Old, i)); - if (OldId != NewId) + if (OldId != NewId) { ReplacedValues[OldId] = NewId; - // Delete Node from tables. + // Delete Node from tables. We cannot do this when OldId == NewId, + // because NewId can still have table references to it in + // ReplacedValues. + IdToValueMap.erase(OldId); + PromotedIntegers.erase(OldId); + ExpandedIntegers.erase(OldId); + SoftenedFloats.erase(OldId); + PromotedFloats.erase(OldId); + ExpandedFloats.erase(OldId); + ScalarizedVectors.erase(OldId); + SplitVectors.erase(OldId); + WidenedVectors.erase(OldId); + } + ValueToIdMap.erase(SDValue(Old, i)); - IdToValueMap.erase(OldId); - PromotedIntegers.erase(OldId); - ExpandedIntegers.erase(OldId); - SoftenedFloats.erase(OldId); - PromotedFloats.erase(OldId); - ExpandedFloats.erase(OldId); - ScalarizedVectors.erase(OldId); - SplitVectors.erase(OldId); - WidenedVectors.erase(OldId); } } -- 2.17.1