[llvm] [ValueTracking] Add support for most `llvm.vector.reduce.*` ops. (PR #88320)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 10 21:59:33 PDT 2024
================
@@ -1621,14 +1621,52 @@ static void computeKnownBitsFromOperator(const Operator *I,
computeKnownBits(I->getOperand(1), Known2, Depth + 1, Q);
Known = KnownBits::ssub_sat(Known, Known2);
break;
- // for min/max reduce, any bit common to each element in the input vec
- // is set in the output.
+ // for min/max/and/or reduce, any bit common to each element in the
+ // input vec is set in the output.
+ case Intrinsic::vector_reduce_and:
+ case Intrinsic::vector_reduce_or:
case Intrinsic::vector_reduce_umax:
case Intrinsic::vector_reduce_umin:
case Intrinsic::vector_reduce_smax:
case Intrinsic::vector_reduce_smin:
computeKnownBits(I->getOperand(0), Known, Depth + 1, Q);
break;
+ case Intrinsic::vector_reduce_xor:
+ computeKnownBits(I->getOperand(0), Known, Depth + 1, Q);
+ // The zeros common to all vecs are zero in the output.
+ // If the number of elements is odd, then the common ones remain. If the
+ // number of elements is even, then the common ones becomes zeros.
+ if (auto *VecTy =
+ dyn_cast<FixedVectorType>(I->getOperand(0)->getType())) {
+ // Even, so the ones become zeros.
+ if ((VecTy->getNumElements() % 2) == 0) {
+ Known.Zero |= Known.One;
+ Known.One.clearAllBits();
+ }
+
+ } else
+ Known.One.clearAllBits();
+ break;
+ case Intrinsic::vector_reduce_mul:
+ case Intrinsic::vector_reduce_add:
+ // We compute the common bits for all elements then apply the reduce op
+ // NumEle times. This is mostly useful for known high zeros.
+ if (auto *VecTy =
+ dyn_cast<FixedVectorType>(I->getOperand(0)->getType())) {
+ computeKnownBits(I->getOperand(0), Known, Depth + 1, Q);
+ KnownBits SingleKnown = Known;
+ for (unsigned i = 1, e = VecTy->getNumElements(); i < e; ++i) {
----------------
dtcxzyw wrote:
You can reduce the computational complexity from `O(n)` to `O(lgn)` with [exponentiation by squaring](https://en.wikipedia.org/wiki/Exponentiation_by_squaring).
https://github.com/llvm/llvm-project/pull/88320
More information about the llvm-commits
mailing list