[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