This patch addresses an incorrect transformation in the DAG combiner.
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Mon, 14 Jan 2013 22:04:38 +0000 (22:04 +0000)
committerBill Schmidt <wschmidt@linux.vnet.ibm.com>
Mon, 14 Jan 2013 22:04:38 +0000 (22:04 +0000)
commitd006c6938bcc91381c89a31c66c4708e84e46968
tree6404a76edef96dc0b036aa9c9d400488140eedbb
parentd14fac150d2d8da2cb828f25e00d7d3c971bf7fc
This patch addresses an incorrect transformation in the DAG combiner.

The included test case is derived from one of the GCC compatibility tests.
The problem arises after the selection DAG has been converted to type-legalized
form.  The combiner first sees a 64-bit load that can be converted into a
pre-increment form.  The original load feeds into a SRL that isolates the
upper 32 bits of the loaded doubleword.  This looks like an opportunity for
DAGCombiner::ReduceLoadWidth() to replace the 64-bit load with a 32-bit load.

However, this transformation is not valid, as the replacement load is not
a pre-increment load.  The pre-increment load produces an extra result,
which feeds a subsequent add instruction.  The replacement load only has
one result value, and this value is propagated to all uses of the pre-
increment load, including the add.  Because the add is looking for the
second result value as its operand, it ends up attempting to add a constant
to a token chain, resulting in a crash.

So the patch simply disables this transformation for any load with more than
two result values.

llvm-svn: 172480
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/PowerPC/load-shift-combine.ll [new file with mode: 0644]