[InstCombine] generalize fold for mask-with-signbit-splat
authorSanjay Patel <spatel@rotateright.com>
Fri, 15 Oct 2021 20:22:59 +0000 (16:22 -0400)
committerSanjay Patel <spatel@rotateright.com>
Fri, 15 Oct 2021 20:25:48 +0000 (16:25 -0400)
commit727e642e970d028049d95a8af89a679a61868f15
tree7781b15bd924eed8b7cecf04f249957cd3b1f4da
parent3b48e1170dc623a95ff13a1e34c839cc094bf321
[InstCombine] generalize fold for mask-with-signbit-splat

(iN X s>> (N-1)) & Y --> (X < 0) ? Y : 0

https://alive2.llvm.org/ce/z/qeYhdz

I was looking at a missing abs() transform and found my way to this
generalization of an existing fold that was added with D67799.
As discussed in that review, we want to make sure codegen handles
this difference well, and for all of the targets/types that I
spot-checked, it looks good.

I am leaving the existing fold in place in this commit because
it covers a potentially missing icmp fold, but I plan to remove
that as a follow-up commit as suggested during review.

Differential Revision: https://reviews.llvm.org/D111410
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
llvm/test/Transforms/InstCombine/and.ll
llvm/test/Transforms/InstCombine/icmp.ll
llvm/test/Transforms/InstCombine/mul-inseltpoison.ll
llvm/test/Transforms/InstCombine/mul.ll