[llvm] [SLP]Fix a crash on non-fp operator isFast request (PR #213008)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 30 05:19:03 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-vectorizers

Author: Alexey Bataev (alexey-bataev)

<details>
<summary>Changes</summary>

isFast should be used only on FPMathOperator kind instructons.


---
Full diff: https://github.com/llvm/llvm-project/pull/213008.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp (+2-2) 
- (added) llvm/test/Transforms/SLPVectorizer/ARM/non-fp-math-op.ll (+20) 


``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index ae4d57cb4d063..c2b8d81ff5d41 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -10561,8 +10561,8 @@ BoUpSLP::TreeEntry::EntryState BoUpSLP::getScalarsVectorizationState(
   case Instruction::Call: {
     if (S.getMainOp()->getType()->isFloatingPointTy() &&
         TTI->isFPVectorizationPotentiallyUnsafe() && any_of(VL, [](Value *V) {
-          auto *I = dyn_cast<Instruction>(V);
-          return I && !I->isFast();
+          auto *FPOp = dyn_cast<FPMathOperator>(V);
+          return FPOp && !FPOp->isFast();
         }))
       return TreeEntry::NeedToGather;
     // Check if the calls are all to the same vectorizable intrinsic or
diff --git a/llvm/test/Transforms/SLPVectorizer/ARM/non-fp-math-op.ll b/llvm/test/Transforms/SLPVectorizer/ARM/non-fp-math-op.ll
new file mode 100644
index 0000000000000..dfea6792cf7fc
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/ARM/non-fp-math-op.ll
@@ -0,0 +1,20 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -S --passes=slp-vectorizer -mtriple=armv7-unknown-linux-gnueabihf < %s | FileCheck %s
+
+define float @test(ptr %c, float %conv) {
+; CHECK-LABEL: define float @test(
+; CHECK-SAME: ptr [[C:%.*]], float [[CONV:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[C]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call float @llvm.fmuladd.f32(float [[CONV]], float 0.000000e+00, float 0.000000e+00)
+; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP0]], [[TMP1]]
+; CHECK-NEXT:    ret float [[ADD]]
+;
+entry:
+  %0 = load float, ptr %c, align 4
+  %1 = tail call float @llvm.fmuladd.f32(float %conv, float 0.000000e+00, float 0.000000e+00)
+  %add = fadd float %0, %1
+  ret float %add
+}
+
+declare float @llvm.fmuladd.f32(float, float, float)

``````````

</details>


https://github.com/llvm/llvm-project/pull/213008


More information about the llvm-commits mailing list