Skip to content

Commit

Permalink
[AArch64] Mark function calls as possibly changing FPCR
Browse files Browse the repository at this point in the history
This patch does the same changes as D111433 for PowerPC and D139549 for
X86, - in the strictfp function all calls are marked as implicit defs of
FPCR. It prevents from moving FP operations across function calls, which
may change rounding mode, as fesetround does.

Differential Revision: https://reviews.llvm.org/D143001
  • Loading branch information
spavloff committed Feb 1, 2023
1 parent d30b187 commit c4e38fa
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 0 deletions.
5 changes: 5 additions & 0 deletions llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
Expand Up @@ -14946,6 +14946,11 @@ AArch64TargetLowering::getScratchRegisters(CallingConv::ID) const {
return ScratchRegs;
}

const MCPhysReg *AArch64TargetLowering::getRoundingControlRegisters() const {
static const MCPhysReg RCRegs[] = {AArch64::FPCR, 0};
return RCRegs;
}

bool
AArch64TargetLowering::isDesirableToCommuteWithShift(const SDNode *N,
CombineLevel Level) const {
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Target/AArch64/AArch64ISelLowering.h
Expand Up @@ -670,6 +670,7 @@ class AArch64TargetLowering : public TargetLowering {
CodeGenOpt::Level OptLevel) const override;

const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
const MCPhysReg *getRoundingControlRegisters() const override;

/// Returns false if N is a bit extraction pattern of (X >> C) & Mask.
bool isDesirableToCommuteWithShift(const SDNode *N,
Expand Down
13 changes: 13 additions & 0 deletions llvm/test/CodeGen/AArch64/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)

0 comments on commit c4e38fa

Please sign in to comment.