diff options
author | Noah Goldstein <goldstein.w.n@gmail.com> | 2024-04-09 11:58:38 -0500 |
---|---|---|
committer | Noah Goldstein <goldstein.w.n@gmail.com> | 2024-04-10 10:40:48 -0500 |
commit | 77d668451ad2e6370eb595c171779429e9becdf2 (patch) | |
tree | 16ceaca5a898b00c32bf7e9f6d411a82fcabcbdc /llvm/lib/Analysis/ValueTracking.cpp | |
parent | f9f4aba547f50e6dcb2d9345b51fe4883bb64d8d (diff) | |
download | llvm-77d668451ad2e6370eb595c171779429e9becdf2.zip llvm-77d668451ad2e6370eb595c171779429e9becdf2.tar.gz llvm-77d668451ad2e6370eb595c171779429e9becdf2.tar.bz2 |
[ValueTracking] Add support for `vector_reduce_{s,u}{min,max}` in `isKnownNonZero`
Previously missing, proofs for all implementations:
https://alive2.llvm.org/ce/z/G8wpmG
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index ca48cfe..869a94d 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2824,6 +2824,12 @@ static bool isKnownNonZeroFromOperator(const Operator *I, return isNonZeroAdd(DemandedElts, Depth, Q, BitWidth, II->getArgOperand(0), II->getArgOperand(1), /*NSW=*/true, /* NUW=*/false); + // umin/smin/smax/smin of all non-zero elements is always non-zero. + case Intrinsic::vector_reduce_umax: + case Intrinsic::vector_reduce_umin: + case Intrinsic::vector_reduce_smax: + case Intrinsic::vector_reduce_smin: + return isKnownNonZero(II->getArgOperand(0), Depth, Q); case Intrinsic::umax: case Intrinsic::uadd_sat: return isKnownNonZero(II->getArgOperand(1), DemandedElts, Depth, Q) || |