OSDN Git Service

[SelectionDAG] Fix CombineToPreIndexedLoadStore O(n^2) behavior
authorTim Shen <timshen91@gmail.com>
Wed, 3 Feb 2016 20:58:55 +0000 (20:58 +0000)
committerTim Shen <timshen91@gmail.com>
Wed, 3 Feb 2016 20:58:55 +0000 (20:58 +0000)
commit33bf0bd3ea1ab78e19c7a27b04508d5d318aab87
tree3c1349f513634a40504217d998afba2af9efa869
parent6ebd4e68e859dc7bf81b9ce0d23762369088fa40
[SelectionDAG] Fix CombineToPreIndexedLoadStore O(n^2) behavior

This patch consists of two parts: a performance fix in DAGCombiner.cpp
and a correctness fix in SelectionDAG.cpp.

The test case tests the bug that's uncovered by the performance fix, and
fixed by the correctness fix.

The performance fix keeps the containers required by the
hasPredecessorHelper (which is a lazy DFS) and reuse them. Since
hasPredecessorHelper is called in a loop, the overall efficiency reduced
from O(n^2) to O(n), where n is the number of SDNodes.

The correctness fix keeps iterating the neighbor list even if it's time
to early return. It will return after finishing adding all neighbors to
Worklist, so that no neighbors are discarded due to the original early
return.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259691 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp
test/CodeGen/PowerPC/combine-to-pre-index-store-crash.ll [new file with mode: 0644]