[SDAG] Fix a bug in the DAG combiner where we would fail to return the
authorChandler Carruth <chandlerc@gmail.com>
Thu, 14 Aug 2014 08:18:34 +0000 (08:18 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Thu, 14 Aug 2014 08:18:34 +0000 (08:18 +0000)
commit369e0ef67d73345a82481c01ac9c67a590f71373
treee80b85c02cf66eeb95c9ec3c67385f4334c91ad1
parenteb323b2b3c7d72ae00bf6d9998fcb8b027102965
[SDAG] Fix a bug in the DAG combiner where we would fail to return the
input node after manually adding it to the worklist and using CombineTo.

Once we use CombineTo the input node may have been deleted. Despite this
being *completely confusing* and somewhat broken, the only way to
"correctly" return from a DAG combine after potentially deleting the
input node is to return *that exact node*....

But really, this code should just never have used CombineTo. It won't do
what it wants (returning the node as mentioned above just causes the
combine to infloop). The correct way to combine away a casted load to
a load of the correct type is to RAUW the chain directly and then return
the loaded value to replace the actual value node.

I managed to find this with the vector shuffle fuzzer even though it
clearly has nothing at all to do with vector shuffles and rather those
happen to trigger a load of a constant pool that hits this combine *just
right*. I've included the test as it is small and a nice stress test
that the infrastructure isn't asserting.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215622 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/X86/vector-shuffle-128-v16.ll