Skip to content

[LegalizeTypes][MSP430] Soften FAKE_USE operand #142714

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 5, 2025

Conversation

Acthink-Yang
Copy link
Contributor

Adds support for softening FAKE_USE operands.
Adds MSP430 tests that exercise the new softening code.

Fixes #137572

@llvmbot llvmbot added backend:MSP430 llvm:SelectionDAG SelectionDAGISel as well labels Jun 4, 2025
@llvmbot
Copy link
Member

llvmbot commented Jun 4, 2025

@llvm/pr-subscribers-backend-msp430

Author: Acthink Yang (Acthink-Yang)

Changes

Adds support for softening FAKE_USE operands.
Adds MSP430 tests that exercise the new softening code.

Fixes #137572


Full diff: https://github.com/llvm/llvm-project/pull/142714.diff

3 Files Affected:

  • (modified) llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp (+9)
  • (modified) llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h (+1)
  • (added) llvm/test/CodeGen/MSP430/fake_use_float.ll (+31)
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
index 41e85521b41ea..81f7c8059760e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
@@ -1143,6 +1143,9 @@ bool DAGTypeLegalizer::SoftenFloatOperand(SDNode *N, unsigned OpNo) {
     Res = SoftenFloatOp_ATOMIC_STORE(N, OpNo);
     break;
   case ISD::FCOPYSIGN:   Res = SoftenFloatOp_FCOPYSIGN(N); break;
+  case ISD::FAKE_USE:
+    Res = SoftenFloatOp_FAKE_USE(N);
+    break;
   }
 
   // If the result is null, the sub-method took care of registering results etc.
@@ -1477,6 +1480,12 @@ SDValue DAGTypeLegalizer::SoftenFloatOp_LLRINT(SDNode *N) {
                                              RTLIB::LLRINT_PPCF128));
 }
 
+SDValue DAGTypeLegalizer::SoftenFloatOp_FAKE_USE(SDNode *N) {
+  SDValue Op1 = BitConvertToInteger(N->getOperand(1));
+  return DAG.getNode(N->getOpcode(), SDLoc(N), N->getValueType(0),
+                     N->getOperand(0), Op1);
+}
+
 //===----------------------------------------------------------------------===//
 //  Float Result Expansion
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index dd9af47da5287..a541833684f38 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -651,6 +651,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
   SDValue SoftenFloatOp_STORE(SDNode *N, unsigned OpNo);
   SDValue SoftenFloatOp_ATOMIC_STORE(SDNode *N, unsigned OpNo);
   SDValue SoftenFloatOp_FCOPYSIGN(SDNode *N);
+  SDValue SoftenFloatOp_FAKE_USE(SDNode *N);
 
   //===--------------------------------------------------------------------===//
   // Float Expansion Support: LegalizeFloatTypes.cpp
diff --git a/llvm/test/CodeGen/MSP430/fake_use_float.ll b/llvm/test/CodeGen/MSP430/fake_use_float.ll
new file mode 100644
index 0000000000000..3983cea0f5939
--- /dev/null
+++ b/llvm/test/CodeGen/MSP430/fake_use_float.ll
@@ -0,0 +1,31 @@
+; RUN: llc -stop-after=finalize-isel -filetype=asm -o - < %s | FileCheck %s
+target datalayout = "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16"
+target triple = "msp430"
+
+; CHECK:       bb.0.entry:
+; CHECK:       %0:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %0
+; CHECK:       %1:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %1
+; CHECK:       %2:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %2
+; CHECK:       %3:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %3
+; CHECK:       RET
+define void @test-double() {
+entry:
+  call void (...) @llvm.fake.use(double -8.765430e+02)
+  ret void
+}
+
+; CHECK:       bb.0.entry:
+; CHECK:       %0:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %0
+; CHECK:       %1:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %1
+; CHECK:       RET
+define void @test-float() {
+entry:
+  call void (...) @llvm.fake.use(float -8.76e+02)
+  ret void
+}

@llvmbot
Copy link
Member

llvmbot commented Jun 4, 2025

@llvm/pr-subscribers-llvm-selectiondag

Author: Acthink Yang (Acthink-Yang)

Changes

Adds support for softening FAKE_USE operands.
Adds MSP430 tests that exercise the new softening code.

Fixes #137572


Full diff: https://github.com/llvm/llvm-project/pull/142714.diff

3 Files Affected:

  • (modified) llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp (+9)
  • (modified) llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h (+1)
  • (added) llvm/test/CodeGen/MSP430/fake_use_float.ll (+31)
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
index 41e85521b41ea..81f7c8059760e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
@@ -1143,6 +1143,9 @@ bool DAGTypeLegalizer::SoftenFloatOperand(SDNode *N, unsigned OpNo) {
     Res = SoftenFloatOp_ATOMIC_STORE(N, OpNo);
     break;
   case ISD::FCOPYSIGN:   Res = SoftenFloatOp_FCOPYSIGN(N); break;
+  case ISD::FAKE_USE:
+    Res = SoftenFloatOp_FAKE_USE(N);
+    break;
   }
 
   // If the result is null, the sub-method took care of registering results etc.
@@ -1477,6 +1480,12 @@ SDValue DAGTypeLegalizer::SoftenFloatOp_LLRINT(SDNode *N) {
                                              RTLIB::LLRINT_PPCF128));
 }
 
+SDValue DAGTypeLegalizer::SoftenFloatOp_FAKE_USE(SDNode *N) {
+  SDValue Op1 = BitConvertToInteger(N->getOperand(1));
+  return DAG.getNode(N->getOpcode(), SDLoc(N), N->getValueType(0),
+                     N->getOperand(0), Op1);
+}
+
 //===----------------------------------------------------------------------===//
 //  Float Result Expansion
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index dd9af47da5287..a541833684f38 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -651,6 +651,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
   SDValue SoftenFloatOp_STORE(SDNode *N, unsigned OpNo);
   SDValue SoftenFloatOp_ATOMIC_STORE(SDNode *N, unsigned OpNo);
   SDValue SoftenFloatOp_FCOPYSIGN(SDNode *N);
+  SDValue SoftenFloatOp_FAKE_USE(SDNode *N);
 
   //===--------------------------------------------------------------------===//
   // Float Expansion Support: LegalizeFloatTypes.cpp
diff --git a/llvm/test/CodeGen/MSP430/fake_use_float.ll b/llvm/test/CodeGen/MSP430/fake_use_float.ll
new file mode 100644
index 0000000000000..3983cea0f5939
--- /dev/null
+++ b/llvm/test/CodeGen/MSP430/fake_use_float.ll
@@ -0,0 +1,31 @@
+; RUN: llc -stop-after=finalize-isel -filetype=asm -o - < %s | FileCheck %s
+target datalayout = "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16"
+target triple = "msp430"
+
+; CHECK:       bb.0.entry:
+; CHECK:       %0:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %0
+; CHECK:       %1:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %1
+; CHECK:       %2:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %2
+; CHECK:       %3:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %3
+; CHECK:       RET
+define void @test-double() {
+entry:
+  call void (...) @llvm.fake.use(double -8.765430e+02)
+  ret void
+}
+
+; CHECK:       bb.0.entry:
+; CHECK:       %0:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %0
+; CHECK:       %1:gr16 = MOV16ri
+; CHECK-DAG:   FAKE_USE killed %1
+; CHECK:       RET
+define void @test-float() {
+entry:
+  call void (...) @llvm.fake.use(float -8.76e+02)
+  ret void
+}

@Acthink-Yang Acthink-Yang force-pushed the SoftenFloatOperand-FAKE_USE branch from 5b3c6f5 to 511d75d Compare June 4, 2025 04:46
@Acthink-Yang Acthink-Yang force-pushed the SoftenFloatOperand-FAKE_USE branch from a6f993b to d4a180d Compare June 4, 2025 11:44
Acthink-Yang and others added 4 commits June 5, 2025 09:52
Adds support for softening FAKE_USE operands.
Adds MSP430 tests that exercise the new softening code.

Fixes llvm#137572
Co-authored-by: Matt Arsenault <arsenm2@gmail.com>
Co-authored-by: Matt Arsenault <arsenm2@gmail.com>
@Acthink-Yang Acthink-Yang force-pushed the SoftenFloatOperand-FAKE_USE branch from d4a180d to bec195c Compare June 5, 2025 01:52
@arsenm arsenm merged commit 7263cd4 into llvm:main Jun 5, 2025
6 of 10 checks passed
@Acthink-Yang Acthink-Yang deleted the SoftenFloatOperand-FAKE_USE branch June 5, 2025 02:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:MSP430 llvm:SelectionDAG SelectionDAGISel as well
Projects
None yet
Development

Successfully merging this pull request may close these issues.

SROA pass and llvm.fake.use
3 participants