[llvm] d5d6f60 - [ValueTracking] Support scalable vectors for ExtractElement in computeKnownFPClass. (#143051)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 5 20:48:11 PDT 2025
Author: Craig Topper
Date: 2025-06-05T20:48:07-07:00
New Revision: d5d6f60632c6c6ef5a4342439f767e10880784e1
URL: https://github.com/llvm/llvm-project/commit/d5d6f60632c6c6ef5a4342439f767e10880784e1
DIFF: https://github.com/llvm/llvm-project/commit/d5d6f60632c6c6ef5a4342439f767e10880784e1.diff
LOG: [ValueTracking] Support scalable vectors for ExtractElement in computeKnownFPClass. (#143051)
We can support scalable vectors by setting the demanded mask to APInt(1,
1) to demand the whole vector.
Added:
Modified:
llvm/lib/Analysis/ValueTracking.cpp
llvm/test/Transforms/Attributor/nofpclass.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 0a460786d00ea..bde30060736c1 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5604,19 +5604,20 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
// Look through extract element. If the index is non-constant or
// out-of-range demand all elements, otherwise just the extracted element.
const Value *Vec = Op->getOperand(0);
- const Value *Idx = Op->getOperand(1);
- auto *CIdx = dyn_cast<ConstantInt>(Idx);
+ APInt DemandedVecElts;
if (auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType())) {
unsigned NumElts = VecTy->getNumElements();
- APInt DemandedVecElts = APInt::getAllOnes(NumElts);
+ DemandedVecElts = APInt::getAllOnes(NumElts);
+ auto *CIdx = dyn_cast<ConstantInt>(Op->getOperand(1));
if (CIdx && CIdx->getValue().ult(NumElts))
DemandedVecElts = APInt::getOneBitSet(NumElts, CIdx->getZExtValue());
- return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known,
- Q, Depth + 1);
+ } else {
+ DemandedVecElts = APInt(1, 1);
}
- break;
+ return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known,
+ Q, Depth + 1);
}
case Instruction::InsertElement: {
if (isa<ScalableVectorType>(Op->getType()))
diff --git a/llvm/test/Transforms/Attributor/nofpclass.ll b/llvm/test/Transforms/Attributor/nofpclass.ll
index cfc7877383881..8dd2aa34f94cd 100644
--- a/llvm/test/Transforms/Attributor/nofpclass.ll
+++ b/llvm/test/Transforms/Attributor/nofpclass.ll
@@ -1474,7 +1474,7 @@ define float @returned_extractelement_index_oob(<4 x float> nofpclass(nan) %vec)
define float @returned_extractelement_scalable(<vscale x 4 x float> nofpclass(nan) %vec) {
; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
-; CHECK-LABEL: define float @returned_extractelement_scalable
+; CHECK-LABEL: define nofpclass(nan) float @returned_extractelement_scalable
; CHECK-SAME: (<vscale x 4 x float> nofpclass(nan) [[VEC:%.*]]) #[[ATTR3]] {
; CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <vscale x 4 x float> [[VEC]], i32 0
; CHECK-NEXT: ret float [[EXTRACT]]
More information about the llvm-commits
mailing list