[TargetLowering] Fix propagation of undefs in zero extension ops (PR40091)
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 19 Dec 2018 13:37:59 +0000 (13:37 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 19 Dec 2018 13:37:59 +0000 (13:37 +0000)
commit6c95bea072a8999818c26da9fec9332cdf6d9bee
tree0d9b8c508c4c1bd3bd4727e93f77119858180233
parentf7cf1a1a7353dc5c578dfc85eb963e61a4d406cd
[TargetLowering] Fix propagation of undefs in zero extension ops (PR40091)

As described on PR40091, we have several places where zext (and zext_vector_inreg) fold an undef input into an undef output. For zero extensions this is incorrect as the output should guarantee to least have the new upper bits set to zero.

SimplifyDemandedVectorElts is the worst offender (and its the most likely to cause new undefs to appear) but DAGCombiner's tryToFoldExtendOfConstant has a similar issue.

Thanks to @dmgreen for catching this.

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

llvm-svn: 349625
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/test/CodeGen/AArch64/pr40091.ll
llvm/test/CodeGen/X86/fold-vector-sext-zext.ll