[llvm] [DAG] Make strictfp attribute only restricts for libm and make non-math optimizations possible (PR #165464)
zhijian lin via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 10 11:01:29 PST 2025
https://github.com/diggerlin updated https://github.com/llvm/llvm-project/pull/165464
>From a40b5e1546f5330372ff1907dc81101a96d23284 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Tue, 28 Oct 2025 19:12:38 +0000
Subject: [PATCH 1/2] let strictfp only work for libm
---
.../CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 15 +++++++++------
llvm/test/CodeGen/PowerPC/milicode32.ll | 3 ++-
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index a52265055c88a..37108aa3a56d8 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -9392,7 +9392,9 @@ bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
unsigned Opcode) {
// We already checked this call's prototype; verify it doesn't modify errno.
- if (!I.onlyReadsMemory())
+ // Do not perform optimizations for call sites that require strict
+ // floating-point semantics.
+ if (!I.onlyReadsMemory() || I.isStrictFP())
return false;
SDNodeFlags Flags;
@@ -9412,7 +9414,9 @@ bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
unsigned Opcode) {
// We already checked this call's prototype; verify it doesn't modify errno.
- if (!I.onlyReadsMemory())
+ // Do not perform optimizations for call sites that require strict
+ // floating-point semantics.
+ if (!I.onlyReadsMemory() || I.isStrictFP())
return false;
SDNodeFlags Flags;
@@ -9445,11 +9449,10 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
// Check for well-known libc/libm calls. If the function is internal, it
// can't be a library call. Don't do the check if marked as nobuiltin for
- // some reason or the call site requires strict floating point semantics.
+ // some reason.
LibFunc Func;
- if (!I.isNoBuiltin() && !I.isStrictFP() && !F->hasLocalLinkage() &&
- F->hasName() && LibInfo->getLibFunc(*F, Func) &&
- LibInfo->hasOptimizedCodeGen(Func)) {
+ if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
+ LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
switch (Func) {
default: break;
case LibFunc_bcmp:
diff --git a/llvm/test/CodeGen/PowerPC/milicode32.ll b/llvm/test/CodeGen/PowerPC/milicode32.ll
index 78d036202fe4e..09239fb9d1b09 100644
--- a/llvm/test/CodeGen/PowerPC/milicode32.ll
+++ b/llvm/test/CodeGen/PowerPC/milicode32.ll
@@ -64,8 +64,9 @@ entry:
%str.addr = alloca ptr, align 4
store ptr %str, ptr %str.addr, align 4
%0 = load ptr, ptr %str.addr, align 4
- %call = call i32 @strlen(ptr noundef %0)
+ %call = call i32 @strlen(ptr noundef %0) #0
ret i32 %call
}
declare i32 @strlen(ptr noundef) nounwind
+attributes #0 = { strictfp }
>From 44c7bad497286f0fb7ecd2f1be2215afba5fb3e7 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Tue, 4 Nov 2025 14:55:02 +0000
Subject: [PATCH 2/2] add comment to add test caee for fp-strict
---
llvm/test/CodeGen/PowerPC/milicode32.ll | 33 +++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/llvm/test/CodeGen/PowerPC/milicode32.ll b/llvm/test/CodeGen/PowerPC/milicode32.ll
index 09239fb9d1b09..c81b518ef8dbf 100644
--- a/llvm/test/CodeGen/PowerPC/milicode32.ll
+++ b/llvm/test/CodeGen/PowerPC/milicode32.ll
@@ -60,6 +60,39 @@ define i32 @strlen_test(ptr noundef %str) nounwind {
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
; CHECK-LINUX32-P9-NEXT: mtlr r0
; CHECK-LINUX32-P9-NEXT: blr
+entry:
+ %str.addr = alloca ptr, align 4
+ store ptr %str, ptr %str.addr, align 4
+ %0 = load ptr, ptr %str.addr, align 4
+ %call = call i32 @strlen(ptr noundef %0)
+ ret i32 %call
+}
+
+define i32 @strlen_test_fp_strict(ptr noundef %str) nounwind {
+; CHECK-AIX-32-P9-LABEL: strlen_test_fp_strict:
+; CHECK-AIX-32-P9: # %bb.0: # %entry
+; CHECK-AIX-32-P9-NEXT: mflr r0
+; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
+; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
+; CHECK-AIX-32-P9-NEXT: stw r3, 60(r1)
+; CHECK-AIX-32-P9-NEXT: bl .___strlen[PR]
+; CHECK-AIX-32-P9-NEXT: nop
+; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
+; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
+; CHECK-AIX-32-P9-NEXT: mtlr r0
+; CHECK-AIX-32-P9-NEXT: blr
+;
+; CHECK-LINUX32-P9-LABEL: strlen_test_fp_strict:
+; CHECK-LINUX32-P9: # %bb.0: # %entry
+; CHECK-LINUX32-P9-NEXT: mflr r0
+; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
+; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
+; CHECK-LINUX32-P9-NEXT: stw r3, 12(r1)
+; CHECK-LINUX32-P9-NEXT: bl strlen
+; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
+; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
+; CHECK-LINUX32-P9-NEXT: mtlr r0
+; CHECK-LINUX32-P9-NEXT: blr
entry:
%str.addr = alloca ptr, align 4
store ptr %str, ptr %str.addr, align 4
More information about the llvm-commits
mailing list