[DAGCombiner][X86][PowerPC] Teach visitSIGN_EXTEND_INREG to fold (sext_in_reg (aext...
authorCraig Topper <craig.topper@intel.com>
Wed, 2 Jan 2019 17:58:27 +0000 (17:58 +0000)
committerCraig Topper <craig.topper@intel.com>
Wed, 2 Jan 2019 17:58:27 +0000 (17:58 +0000)
commitc562fae02b3b125c6d86a7e90730a302bf2d35ec
tree2d5c921d17af9dc2002bc1513f7f6bfdd8a1b805
parenta57ffac7c8e5df5b63a55574849a4607a4af1325
[DAGCombiner][X86][PowerPC] Teach visitSIGN_EXTEND_INREG to fold (sext_in_reg (aext/sext x)) -> (sext x) when x has more than 1 sign bit and the sext_inreg is from one of them.

If x has multiple sign bits than it doesn't matter which one we extend from so we can sext from x's msb instead.

The X86 setcc-combine.ll changes are a little weird. It appears we ended up with a (sext_inreg (aext (trunc (extractelt)))) after type legalization. The sext_inreg+aext now gets optimized by this combine to leave (sext (trunc (extractelt))). Then we visit the trunc before we visit the sext. This ends up changing the truncate to an extractvectorelt from a bitcasted vector. I have a follow up patch to fix this.

Differential Revision: https://reviews.llvm.org/D56156

llvm-svn: 350235
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/PowerPC/f128-truncateNconv.ll
llvm/test/CodeGen/PowerPC/ppc64-P9-setb.ll
llvm/test/CodeGen/X86/setcc-combine.ll
llvm/test/CodeGen/X86/vsel-cmp-load.ll