From 481c8e05014561d365003cbd1cdb1109d4b5ee1d Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Mon, 12 Dec 2005 23:22:48 +0000 Subject: [PATCH] At top of generated isel SelectCode() is this: if (!N.Val->hasOneUse()) { std::map::iterator CGMI = CodeGenMap.find(N); if (CGMI != CodeGenMap.end()) return CGMI->second; } Suppose a DAG like this: X ^ ^ / \ USE1 USE2 Suppose USE1 is being selected first and during which X is selected and returned a new node. After this, USE1 is no longer an use of X. During USE2 selection, X will be selected again since it has only one use! The fix is to always query CodeGenMap. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24679 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/DAGISelEmitter.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index bcb28a628e6..0a8b989b37c 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -2234,10 +2234,8 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) { << " N.getOpcode() < (ISD::BUILTIN_OP_END+" << InstNS << "INSTRUCTION_LIST_END))\n" << " return N; // Already selected.\n\n" - << " if (!N.Val->hasOneUse()) {\n" - << " std::map::iterator CGMI = CodeGenMap.find(N);\n" - << " if (CGMI != CodeGenMap.end()) return CGMI->second;\n" - << " }\n" + << " std::map::iterator CGMI = CodeGenMap.find(N);\n" + << " if (CGMI != CodeGenMap.end()) return CGMI->second;\n" << " switch (N.getOpcode()) {\n" << " default: break;\n" << " case ISD::EntryToken: // These leaves remain the same.\n"