diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-23 23:47:34 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-23 23:47:34 +0000 |
commit | cec479de4e2452baa68a71fae7e5a15ed36815ac (patch) | |
tree | 6c1bdf406b98aafe40224fafaa190ea12f98746c | |
parent | 5857e0add8ab25825628d1ef19cec027e605dcd5 (diff) |
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
-rw-r--r-- | include/llvm/CodeGen/DAGISelHeader.h | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/include/llvm/CodeGen/DAGISelHeader.h b/include/llvm/CodeGen/DAGISelHeader.h index 345b9f4eb4..b4cc0d7230 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 |