diff options
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 26 |
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; |