[DAG] SelectionDAG::canCreateUndefOrPoison - add ISD::FCOPYSIGN (#148617)
### Summary
This PR resolves https://github.com/llvm/llvm-project/issues/147694
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 58be4fb..3656500 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -5620,6 +5620,7 @@
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 40ed3d8..9fdfb8fc 100644
--- a/llvm/test/CodeGen/PowerPC/copysignl.ll
+++ b/llvm/test/CodeGen/PowerPC/copysignl.ll
@@ -20,6 +20,23 @@
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 @@
; CHECK-NEXT: mflr 0
; CHECK-NEXT: stdu 1, -112(1)
; CHECK-NEXT: fmr 3, 2
-; CHECK-NEXT: addis 3, 2, .LCPI2_0@toc@ha
+; CHECK-NEXT: addis 3, 2, .LCPI3_0@toc@ha
; CHECK-NEXT: std 0, 128(1)
-; CHECK-NEXT: lfs 2, .LCPI2_0@toc@l(3)
+; CHECK-NEXT: lfs 2, .LCPI3_0@toc@l(3)
; CHECK-NEXT: bl copysignl
; CHECK-NEXT: nop
; CHECK-NEXT: addi 1, 1, 112
@@ -81,9 +98,9 @@
; CHECK-NEXT: mflr 0
; CHECK-NEXT: stdu 1, -112(1)
; CHECK-NEXT: fmr 3, 2
-; CHECK-NEXT: addis 3, 2, .LCPI3_0@toc@ha
+; CHECK-NEXT: addis 3, 2, .LCPI4_0@toc@ha
; CHECK-NEXT: std 0, 128(1)
-; CHECK-NEXT: lfs 2, .LCPI3_0@toc@l(3)
+; CHECK-NEXT: lfs 2, .LCPI4_0@toc@l(3)
; CHECK-NEXT: bl copysignl
; CHECK-NEXT: nop
; CHECK-NEXT: addi 1, 1, 112
@@ -117,9 +134,9 @@
; CHECK-NEXT: mflr 0
; CHECK-NEXT: stdu 1, -112(1)
; CHECK-NEXT: fmr 3, 2
-; CHECK-NEXT: addis 3, 2, .LCPI4_0@toc@ha
+; CHECK-NEXT: addis 3, 2, .LCPI5_0@toc@ha
; CHECK-NEXT: std 0, 128(1)
-; CHECK-NEXT: lfs 2, .LCPI4_0@toc@l(3)
+; CHECK-NEXT: lfs 2, .LCPI5_0@toc@l(3)
; CHECK-NEXT: bl copysignl
; CHECK-NEXT: nop
; CHECK-NEXT: addi 1, 1, 112