diff options
author | Sanjay Patel <spatel@rotateright.com> | 2019-10-11 14:17:56 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2019-10-11 14:17:56 +0000 |
commit | 3b581ac80f727441b1f1487c1a3f7632b5de292b (patch) | |
tree | dd3f735b4feaa1914ba7b304ba684eb50c3dbe22 /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | 30c855d42aa26a9d49c623f51707df0bb39d655b (diff) | |
download | bcm5719-llvm-3b581ac80f727441b1f1487c1a3f7632b5de292b.tar.gz bcm5719-llvm-3b581ac80f727441b1f1487c1a3f7632b5de292b.zip |
[DAGCombiner] fold vselect-of-constants to shift
The diffs suggest that we are missing some more basic
analysis/transforms, but this keeps the vector path in
sync with the scalar (rL374397). This is again a
preliminary step for introducing the reverse transform
in IR as proposed in D63382.
llvm-svn: 374555
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 41303921d87..7fa95ce5cf9 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -8614,6 +8614,15 @@ SDValue DAGCombiner::foldVSelectOfConstants(SDNode *N) { return DAG.getNode(ISD::ADD, DL, VT, ExtendedCond, N2); } + // select Cond, Pow2C, 0 --> (zext Cond) << log2(Pow2C) + APInt Pow2C; + if (ISD::isConstantSplatVector(N1.getNode(), Pow2C) && Pow2C.isPowerOf2() && + isNullOrNullSplat(N2)) { + SDValue ZextCond = DAG.getZExtOrTrunc(Cond, DL, VT); + SDValue ShAmtC = DAG.getConstant(Pow2C.exactLogBase2(), DL, VT); + return DAG.getNode(ISD::SHL, DL, VT, ZextCond, ShAmtC); + } + // The general case for select-of-constants: // vselect <N x i1> Cond, C1, C2 --> xor (and (sext Cond), (C1^C2)), C2 // ...but that only makes sense if a vselect is slower than 2 logic ops, so |