aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorDavid Sherwood <david.sherwood@arm.com>2021-09-16 14:19:55 +0100
committerDavid Sherwood <david.sherwood@arm.com>2021-09-20 15:01:59 +0100
commitf988f680649ad38806897e7aa75e95e9fda88ffd (patch)
tree25f760b0e00133dd4948c82aba8c1229704a3f7c /llvm/lib/Analysis/ValueTracking.cpp
parent680592b5d0a71502964f5568fdc953f8da495b16 (diff)
downloadllvm-f988f680649ad38806897e7aa75e95e9fda88ffd.zip
llvm-f988f680649ad38806897e7aa75e95e9fda88ffd.tar.gz
llvm-f988f680649ad38806897e7aa75e95e9fda88ffd.tar.bz2
[Analysis] Add support for vscale in computeKnownBitsFromOperator
In ValueTracking.cpp we use a function called computeKnownBitsFromOperator to determine the known bits of a value. For the vscale intrinsic if the function contains the vscale_range attribute we can use the maximum and minimum values of vscale to determine some known zero and one bits. This should help to improve code quality by allowing certain optimisations to take place. Tests added here: Transforms/InstCombine/icmp-vscale.ll Differential Revision: https://reviews.llvm.org/D109883
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 8d18d133..57869e3 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -1689,6 +1689,32 @@ static void computeKnownBitsFromOperator(const Operator *I,
if (BitWidth >= 32)
Known.Zero.setBitsFrom(31);
break;
+ case Intrinsic::vscale: {
+ if (!II->getFunction()->hasFnAttribute(Attribute::VScaleRange))
+ break;
+
+ auto VScaleRange = II->getFunction()
+ ->getFnAttribute(Attribute::VScaleRange)
+ .getVScaleRangeArgs();
+
+ if (VScaleRange.second == 0)
+ break;
+
+ // If vscale min = max then we know the exact value at compile time
+ // and hence we know the exact bits.
+ if (VScaleRange.first == VScaleRange.second) {
+ Known.One = VScaleRange.first;
+ Known.Zero = VScaleRange.first;
+ Known.Zero.flipAllBits();
+ break;
+ }
+
+ unsigned FirstZeroHighBit = 32 - countLeadingZeros(VScaleRange.second);
+ if (FirstZeroHighBit < BitWidth)
+ Known.Zero.setBitsFrom(FirstZeroHighBit);
+
+ break;
+ }
}
}
break;