From 5bed50cf488bc942231c49a97c7c999e451e88f3 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 22 Aug 2024 23:55:03 +0400 Subject: [PATCH] Check soft float --- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 2a27e30a70e023..fbbfe2c8cf4e62 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -27069,7 +27069,8 @@ AArch64TargetLowering::shouldExpandAtomicLoadInIR(LoadInst *LI) const { // Return true if the atomic operation expansion will lower to use a library // call, and is thus ineligible to use an LLSC expansion. -static bool rmwOpMayLowerToLibcall(const AtomicRMWInst *RMW) { +static bool rmwOpMayLowerToLibcall(const AArch64Subtarget &Subtarget, + const AtomicRMWInst *RMW) { if (!RMW->isFloatingPointOperation()) return false; switch (RMW->getType()->getScalarType()->getTypeID()) { @@ -27077,7 +27078,8 @@ static bool rmwOpMayLowerToLibcall(const AtomicRMWInst *RMW) { case Type::DoubleTyID: case Type::HalfTyID: case Type::BFloatTyID: - return false; + // Will use soft float + return !Subtarget.hasFPARMv8(); default: // fp128 will emit library calls. return true; @@ -27132,7 +27134,7 @@ AArch64TargetLowering::shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const { // succeed. So at -O0 lower this operation to a CAS loop. Also worthwhile if // we have a single CAS instruction that can replace the loop. if (getTargetMachine().getOptLevel() == CodeGenOptLevel::None || - Subtarget->hasLSE() || rmwOpMayLowerToLibcall(AI)) + Subtarget->hasLSE() || rmwOpMayLowerToLibcall(*Subtarget, AI)) return AtomicExpansionKind::CmpXChg; return AtomicExpansionKind::LLSC;