[llvm] [SelectionDAG] Enable softening of FAKE_USE float operands (PR #144392)
Stephen Tozer via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 16 09:57:59 PDT 2025
https://github.com/SLTozer created https://github.com/llvm/llvm-project/pull/144392
Fixes https://github.com/llvm/llvm-project/issues/137308.
FAKE_USE nodes in SelectionDAG currently support all applicable legalizations except for softening of float operands; this patch implements float operand softening, preventing errors when legalizing FAKE_USEs.
>From c49761cddfed17a13352cf230bd96b3eab2ee12c Mon Sep 17 00:00:00 2001
From: Stephen Tozer <stephen.tozer at sony.com>
Date: Mon, 16 Jun 2025 15:33:11 +0100
Subject: [PATCH] [SelectionDAG] Enable softening of FAKE_USE float operands
FAKE_USE nodes in SelectionDAG currently support all applicable
legalizations except for softening of float operands; this patch implements
float operand softening, preventing errors in legalization.
---
llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp | 9 +++++++++
llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 1 +
llvm/test/CodeGen/AVR/intrinsics/soften-fake-use.ll | 9 +++++++++
3 files changed, 19 insertions(+)
create mode 100644 llvm/test/CodeGen/AVR/intrinsics/soften-fake-use.ll
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
index 7dfb43164be37..5d177b0713797 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
@@ -1113,6 +1113,9 @@ bool DAGTypeLegalizer::SoftenFloatOperand(SDNode *N, unsigned OpNo) {
case ISD::BITCAST: Res = SoftenFloatOp_BITCAST(N); break;
case ISD::BR_CC: Res = SoftenFloatOp_BR_CC(N); break;
+ case ISD::FAKE_USE:
+ Res = SoftenFloatOp_FAKE_USE(N);
+ break;
case ISD::STRICT_FP_TO_FP16:
case ISD::FP_TO_FP16: // Same as FP_ROUND for softening purposes
case ISD::FP_TO_BF16:
@@ -1169,6 +1172,12 @@ SDValue DAGTypeLegalizer::SoftenFloatOp_BITCAST(SDNode *N) {
return DAG.getNode(ISD::BITCAST, SDLoc(N), N->getValueType(0), Op0);
}
+SDValue DAGTypeLegalizer::SoftenFloatOp_FAKE_USE(SDNode *N) {
+ SDValue Op = GetSoftenedFloat(N->getOperand(1));
+
+ return DAG.getNode(ISD::FAKE_USE, SDLoc(N), MVT::Other, N->getOperand(0), Op);
+}
+
SDValue DAGTypeLegalizer::SoftenFloatOp_FP_ROUND(SDNode *N) {
// We actually deal with the partially-softened FP_TO_FP16 node too, which
// returns an i16 so doesn't meet the constraints necessary for FP_ROUND.
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index a541833684f38..34f716d3411fa 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -639,6 +639,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
SDValue SoftenFloatOp_Unary(SDNode *N, RTLIB::Libcall LC);
SDValue SoftenFloatOp_BITCAST(SDNode *N);
SDValue SoftenFloatOp_BR_CC(SDNode *N);
+ SDValue SoftenFloatOp_FAKE_USE(SDNode *N);
SDValue SoftenFloatOp_FP_ROUND(SDNode *N);
SDValue SoftenFloatOp_FP_TO_XINT(SDNode *N);
SDValue SoftenFloatOp_FP_TO_XINT_SAT(SDNode *N);
diff --git a/llvm/test/CodeGen/AVR/intrinsics/soften-fake-use.ll b/llvm/test/CodeGen/AVR/intrinsics/soften-fake-use.ll
new file mode 100644
index 0000000000000..a1fe9dbe75473
--- /dev/null
+++ b/llvm/test/CodeGen/AVR/intrinsics/soften-fake-use.ll
@@ -0,0 +1,9 @@
+; RUN: llc -O0 < %s -mtriple=avr 2>&1 --stop-after=finalize-isel | FileCheck %s
+
+;; Tests that we can soften float operands to llvm.fake.use intrinsics.
+
+define double @idd(double %d) {
+entry:
+ notail call void (...) @llvm.fake.use(double %d)
+ ret double %d
+}
More information about the llvm-commits
mailing list