[llvm] [DAG] SelectionDAG::canCreateUndefOrPoison - add ISD::FCOPYSIGN (PR #148617)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 14 05:19:29 PDT 2025


https://github.com/woruyu created https://github.com/llvm/llvm-project/pull/148617

### Summary
This PR resolves https://github.com/llvm/llvm-project/issues/147694

>From 4b306330b7f858e1447fa296348e2d7baa89d825 Mon Sep 17 00:00:00 2001
From: woruyu <1214539920 at qq.com>
Date: Mon, 14 Jul 2025 20:15:32 +0800
Subject: [PATCH] [DAG] SelectionDAG::canCreateUndefOrPoison - add
 ISD::FCOPYSIGN

---
 .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp |  1 +
 llvm/test/CodeGen/PowerPC/copysignl.ll        | 29 +++++++++++++++----
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 58be4fb7e8331..3656500ddf5ff 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -5620,6 +5620,7 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts,
   case ISD::FMUL:
   case ISD::FDIV:
   case ISD::FREM:
+  case ISD::FCOPYSIGN:
     // No poison except from flags (which is handled above)
     return false;
 
diff --git a/llvm/test/CodeGen/PowerPC/copysignl.ll b/llvm/test/CodeGen/PowerPC/copysignl.ll
index 40ed3d803094f..9fdfb8fc548d1 100644
--- a/llvm/test/CodeGen/PowerPC/copysignl.ll
+++ b/llvm/test/CodeGen/PowerPC/copysignl.ll
@@ -20,6 +20,23 @@ entry:
   ret double %conv
 }
 
+define double @foo_d_ll_freeze(ppc_fp128 %a, ppc_fp128 %b) #0 {
+; CHECK-LABEL: foo_d_ll_freeze:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    fcpsgn 1, 3, 1
+; CHECK-NEXT:    blr
+;
+; CHECK-VSX-LABEL: foo_d_ll_freeze:
+; CHECK-VSX:       # %bb.0: # %entry
+; CHECK-VSX-NEXT:    xscpsgndp 1, 3, 1
+; CHECK-VSX-NEXT:    blr
+entry:
+  %call = tail call ppc_fp128 @copysignl(ppc_fp128 %a, ppc_fp128 %b) #0
+  %freeze = freeze ppc_fp128 %call
+  %conv = fptrunc ppc_fp128 %freeze to double
+  ret double %conv
+}
+
 declare ppc_fp128 @copysignl(ppc_fp128, ppc_fp128) #0
 
 define double @foo_dl(double %a, ppc_fp128 %b) #0 {
@@ -46,9 +63,9 @@ define ppc_fp128 @foo_ll(double %a, ppc_fp128 %b) #0 {
 ; CHECK-NEXT:    mflr 0
 ; CHECK-NEXT:    stdu 1, -112(1)
 ; CHECK-NEXT:    fmr 3, 2
-; CHECK-NEXT:    addis 3, 2, .LCPI2_0 at toc@ha
+; CHECK-NEXT:    addis 3, 2, .LCPI3_0 at toc@ha
 ; CHECK-NEXT:    std 0, 128(1)
-; CHECK-NEXT:    lfs 2, .LCPI2_0 at toc@l(3)
+; CHECK-NEXT:    lfs 2, .LCPI3_0 at toc@l(3)
 ; CHECK-NEXT:    bl copysignl
 ; CHECK-NEXT:    nop
 ; CHECK-NEXT:    addi 1, 1, 112
@@ -81,9 +98,9 @@ define ppc_fp128 @foo_ld(double %a, double %b) #0 {
 ; CHECK-NEXT:    mflr 0
 ; CHECK-NEXT:    stdu 1, -112(1)
 ; CHECK-NEXT:    fmr 3, 2
-; CHECK-NEXT:    addis 3, 2, .LCPI3_0 at toc@ha
+; CHECK-NEXT:    addis 3, 2, .LCPI4_0 at toc@ha
 ; CHECK-NEXT:    std 0, 128(1)
-; CHECK-NEXT:    lfs 2, .LCPI3_0 at toc@l(3)
+; CHECK-NEXT:    lfs 2, .LCPI4_0 at toc@l(3)
 ; CHECK-NEXT:    bl copysignl
 ; CHECK-NEXT:    nop
 ; CHECK-NEXT:    addi 1, 1, 112
@@ -117,9 +134,9 @@ define ppc_fp128 @foo_lf(double %a, float %b) #0 {
 ; CHECK-NEXT:    mflr 0
 ; CHECK-NEXT:    stdu 1, -112(1)
 ; CHECK-NEXT:    fmr 3, 2
-; CHECK-NEXT:    addis 3, 2, .LCPI4_0 at toc@ha
+; CHECK-NEXT:    addis 3, 2, .LCPI5_0 at toc@ha
 ; CHECK-NEXT:    std 0, 128(1)
-; CHECK-NEXT:    lfs 2, .LCPI4_0 at toc@l(3)
+; CHECK-NEXT:    lfs 2, .LCPI5_0 at toc@l(3)
 ; CHECK-NEXT:    bl copysignl
 ; CHECK-NEXT:    nop
 ; CHECK-NEXT:    addi 1, 1, 112



More information about the llvm-commits mailing list