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

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 30 05:18:23 PDT 2026


https://github.com/alexey-bataev created https://github.com/llvm/llvm-project/pull/213008

isFast should be used only on FPMathOperator kind instructons.


>From 52499975ab742194e52b2d9472263d6b56c32400 Mon Sep 17 00:00:00 2001
From: Alexey Bataev <a.bataev at outlook.com>
Date: Thu, 30 Jul 2026 05:18:05 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
 =?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.7
---
 .../Transforms/Vectorize/SLPVectorizer.cpp    |  4 ++--
 .../SLPVectorizer/ARM/non-fp-math-op.ll       | 20 +++++++++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)
 create mode 100644 llvm/test/Transforms/SLPVectorizer/ARM/non-fp-math-op.ll

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)



More information about the llvm-commits mailing list