From cec479de4e2452baa68a71fae7e5a15ed36815ac Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 23 Feb 2010 23:47:34 +0000 Subject: [PATCH] fix X86/uint_to_fp-2.ll, only fold loads when they have a single use. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97003 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/DAGISelHeader.h | 35 ++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/include/llvm/CodeGen/DAGISelHeader.h b/include/llvm/CodeGen/DAGISelHeader.h index 345b9f4eb41..b4cc0d72308 100644 --- a/include/llvm/CodeGen/DAGISelHeader.h +++ b/include/llvm/CodeGen/DAGISelHeader.h @@ -618,25 +618,46 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable, // the old nodes. unsigned NumChains = MatcherTable[MatcherIndex++]; assert(NumChains != 0 && "Can't TF zero chains"); + + assert(ChainNodesMatched.empty() && + "Should only have one EmitMergeInputChains per match"); + + // Handle the first chain. + unsigned RecNo = MatcherTable[MatcherIndex++]; + assert(RecNo < RecordedNodes.size() && "Invalid CheckSame"); + ChainNodesMatched.push_back(RecordedNodes[RecNo].getNode()); + + // If the chained node is not the root, we can't fold it if it has + // multiple uses. + // FIXME: What if other value results of the node have uses not matched by + // this pattern? + if (ChainNodesMatched.back() != NodeToMatch && + !RecordedNodes[RecNo].hasOneUse()) { + ChainNodesMatched.clear(); + break; + } // The common case here is that we have exactly one chain, which is really // cheap to handle, just do it. if (NumChains == 1) { - unsigned RecNo = MatcherTable[MatcherIndex++]; - assert(RecNo < RecordedNodes.size() && "Invalid CheckSame"); - ChainNodesMatched.push_back(RecordedNodes[RecNo].getNode()); InputChain = RecordedNodes[RecNo].getOperand(0); assert(InputChain.getValueType() == MVT::Other && "Not a chain"); continue; } // Read all of the chained nodes. - assert(ChainNodesMatched.empty() && - "Should only have one EmitMergeInputChains per match"); - for (unsigned i = 0; i != NumChains; ++i) { - unsigned RecNo = MatcherTable[MatcherIndex++]; + for (unsigned i = 1; i != NumChains; ++i) { + RecNo = MatcherTable[MatcherIndex++]; assert(RecNo < RecordedNodes.size() && "Invalid CheckSame"); ChainNodesMatched.push_back(RecordedNodes[RecNo].getNode()); + + // FIXME: What if other value results of the node have uses not matched by + // this pattern? + if (ChainNodesMatched.back() != NodeToMatch && + !RecordedNodes[RecNo].hasOneUse()) { + ChainNodesMatched.clear(); + break; + } } // Walk all the chained nodes, adding the input chains if they are not in -- 2.34.1