diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-02-23 19:32:27 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-02-23 19:32:27 +0000 |
| commit | 8585850e9421d6b5d03f482671a9456decf860f1 (patch) | |
| tree | 9bd0ded5e0e601d374c442f381eef3eed5eaf408 /llvm/lib/CodeGen | |
| parent | 1738d49b74b4666736f8d081290687fd85ddab68 (diff) | |
| download | bcm5719-llvm-8585850e9421d6b5d03f482671a9456decf860f1.tar.gz bcm5719-llvm-8585850e9421d6b5d03f482671a9456decf860f1.zip | |
fix a bug in findNonImmUse (used by IsLegalToFold) where nodes with
no id's would cause early exit allowing IsLegalToFold to return true
instead of false, producing a cyclic dag.
This was striking the new isel because it isn't using SelectNodeTo yet,
which theoretically is just an optimization.
llvm-svn: 96972
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 9ba0d55b7a9..130299adf74 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1318,8 +1318,20 @@ static SDNode *findFlagUse(SDNode *N) { static bool findNonImmUse(SDNode *Use, SDNode* Def, SDNode *ImmedUse, SDNode *Root, SmallPtrSet<SDNode*, 16> &Visited) { - if (Use->getNodeId() < Def->getNodeId() || - !Visited.insert(Use)) + // The NodeID's are given uniques ID's where a node ID is guaranteed to be + // greater than all of its (recursive) operands. If we scan to a point where + // 'use' is smaller than the node we're scanning for, then we know we will + // never find it. + // + // The Use may be -1 (unassigned) if it is a newly allocated node. This can + // happen because we scan down to newly selected nodes in the case of flag + // uses. + if ((Use->getNodeId() < Def->getNodeId() && Use->getNodeId() != -1)) + return false; + + // Don't revisit nodes if we already scanned it and didn't fail, we know we + // won't fail if we scan it again. + if (!Visited.insert(Use)) return false; for (unsigned i = 0, e = Use->getNumOperands(); i != e; ++i) { |

