From f26ecdaed31373ff233b03cbdf3a5da2ae1ecfe7 Mon Sep 17 00:00:00 2001 From: Erik Enikeev Date: Wed, 27 Aug 2025 18:10:26 +0300 Subject: [PATCH 1/2] [ARM] Mark function calls as possibly changing FPSCR This patch does the same changes as D143001 for AArch64 --- llvm/lib/Target/ARM/ARMISelLowering.cpp | 5 +++++ llvm/lib/Target/ARM/ARMISelLowering.h | 2 ++ llvm/test/CodeGen/ARM/strict-fp-func.ll | 13 +++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 llvm/test/CodeGen/ARM/strict-fp-func.ll diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 2a40fb9b476f8..f13d5fe6f1c47 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -22004,6 +22004,11 @@ bool ARMTargetLowering::isComplexDeinterleavingOperationSupported( ScalarTy->isIntegerTy(32)); } +ArrayRef ARMTargetLowering::getRoundingControlRegisters() const { + static const MCPhysReg RCRegs[] = {ARM::FPSCR}; + return RCRegs; +} + Value *ARMTargetLowering::createComplexDeinterleavingIR( IRBuilderBase &B, ComplexDeinterleavingOperation OperationType, ComplexDeinterleavingRotation Rotation, Value *InputA, Value *InputB, diff --git a/llvm/lib/Target/ARM/ARMISelLowering.h b/llvm/lib/Target/ARM/ARMISelLowering.h index 26ff54cfe0b90..4942f81c694df 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.h +++ b/llvm/lib/Target/ARM/ARMISelLowering.h @@ -1005,6 +1005,8 @@ class VectorType; bool isUnsupportedFloatingType(EVT VT) const; + ArrayRef getRoundingControlRegisters() const override; + SDValue getCMOV(const SDLoc &dl, EVT VT, SDValue FalseVal, SDValue TrueVal, SDValue ARMcc, SDValue Flags, SelectionDAG &DAG) const; SDValue getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, diff --git a/llvm/test/CodeGen/ARM/strict-fp-func.ll b/llvm/test/CodeGen/ARM/strict-fp-func.ll new file mode 100644 index 0000000000000..198d4fdea6831 --- /dev/null +++ b/llvm/test/CodeGen/ARM/strict-fp-func.ll @@ -0,0 +1,13 @@ +; RUN: llc -mtriple aarch64-none-linux-gnu -stop-after=finalize-isel %s -o - | FileCheck %s + +define float @func_02(float %x, float %y) strictfp nounwind { + %call = call float @func_01(float %x) strictfp + %res = call float @llvm.experimental.constrained.fadd.f32(float %call, float %y, metadata !"round.dynamic", metadata !"fpexcept.ignore") strictfp + ret float %res +} +; CHECK-LABEL: name: func_02 +; CHECK: BL @func_01, {{.*}}, implicit-def $fpcr + + +declare float @func_01(float) +declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata) From 107563af1a46801d33226491c2c086984c161277 Mon Sep 17 00:00:00 2001 From: Erik Enikeev Date: Mon, 29 Sep 2025 15:42:33 +0300 Subject: [PATCH 2/2] fixup: use FPSCR_RM instead of FPSCR and correct test target --- llvm/lib/Target/ARM/ARMISelLowering.cpp | 2 +- llvm/test/CodeGen/ARM/strict-fp-func.ll | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index f13d5fe6f1c47..e70f337dd54dd 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -22005,7 +22005,7 @@ bool ARMTargetLowering::isComplexDeinterleavingOperationSupported( } ArrayRef ARMTargetLowering::getRoundingControlRegisters() const { - static const MCPhysReg RCRegs[] = {ARM::FPSCR}; + static const MCPhysReg RCRegs[] = {ARM::FPSCR_RM}; return RCRegs; } diff --git a/llvm/test/CodeGen/ARM/strict-fp-func.ll b/llvm/test/CodeGen/ARM/strict-fp-func.ll index 198d4fdea6831..39bb2b46bdac5 100644 --- a/llvm/test/CodeGen/ARM/strict-fp-func.ll +++ b/llvm/test/CodeGen/ARM/strict-fp-func.ll @@ -1,4 +1,4 @@ -; RUN: llc -mtriple aarch64-none-linux-gnu -stop-after=finalize-isel %s -o - | FileCheck %s +; RUN: llc -mtriple arm-none-eabi -stop-after=finalize-isel %s -o - | FileCheck %s define float @func_02(float %x, float %y) strictfp nounwind { %call = call float @func_01(float %x) strictfp @@ -6,7 +6,7 @@ define float @func_02(float %x, float %y) strictfp nounwind { ret float %res } ; CHECK-LABEL: name: func_02 -; CHECK: BL @func_01, {{.*}}, implicit-def $fpcr +; CHECK: BL @func_01, {{.*}}, implicit-def $fpscr_rm declare float @func_01(float)