mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
At top of generated isel SelectCode() is this:
if (!N.Val->hasOneUse()) { std::map<SDOperand, SDOperand>::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. llvm-svn: 24679
This commit is contained in:
parent
b0b4e53b55
commit
1bc6443c22
@ -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<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(N);\n"
|
||||
<< " if (CGMI != CodeGenMap.end()) return CGMI->second;\n"
|
||||
<< " }\n"
|
||||
<< " std::map<SDOperand, SDOperand>::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"
|
||||
|
Loading…
Reference in New Issue
Block a user