[llvm] [SystemZ] Treat FAKE_USE instructions as instructions without a size (PR #144390)

Stephen Tozer via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 16 09:55:19 PDT 2025


https://github.com/SLTozer created https://github.com/llvm/llvm-project/pull/144390

This patch fixes an error in which `FAKE_USE` instructions would trigger an assertion in SystemZLongBranch due to them having a size of 0 without being excepted in the assertion that each instruction, other than a set of known 0-size instruction types, should have a non-0 size.

`FAKE_USE` instructions are no-op instructions that are emitted into LLVM by the `-fextend-variable-liveness` clang flag to help preserve the liveness of source variables in optimized code, and therefore they should be understood as being valid size 0 instructions.

>From 5f212fad886027a83cf0fb47c7be3fc228ab27ad Mon Sep 17 00:00:00 2001
From: Stephen Tozer <stephen.tozer at sony.com>
Date: Mon, 16 Jun 2025 17:38:55 +0100
Subject: [PATCH] [SystemZ] Treat FAKE_USE instructions as instructions without
 a size

This patch fixes an error in which FAKE_USE instructions would trigger an
assertion in SystemZLongBranch due to them having a size of 0 without being
excepted in the assertion that each instruction, other than a set of known
0-size instruction types, should have a non-0 size.
---
 llvm/lib/Target/SystemZ/SystemZLongBranch.cpp |  2 +-
 llvm/test/CodeGen/SystemZ/fake-use-size.ll    | 14 ++++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/SystemZ/fake-use-size.ll

diff --git a/llvm/lib/Target/SystemZ/SystemZLongBranch.cpp b/llvm/lib/Target/SystemZ/SystemZLongBranch.cpp
index 54e1eb0954945..21a233b2ffa1d 100644
--- a/llvm/lib/Target/SystemZ/SystemZLongBranch.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZLongBranch.cpp
@@ -215,7 +215,7 @@ static unsigned getInstSizeInBytes(const MachineInstr &MI,
           // These do not have a size:
           MI.isDebugOrPseudoInstr() || MI.isPosition() || MI.isKill() ||
           MI.isImplicitDef() || MI.getOpcode() == TargetOpcode::MEMBARRIER ||
-          MI.getOpcode() == TargetOpcode::INIT_UNDEF ||
+          MI.getOpcode() == TargetOpcode::INIT_UNDEF || MI.isFakeUse() ||
           // These have a size that may be zero:
           MI.isInlineAsm() || MI.getOpcode() == SystemZ::STACKMAP ||
           MI.getOpcode() == SystemZ::PATCHPOINT ||
diff --git a/llvm/test/CodeGen/SystemZ/fake-use-size.ll b/llvm/test/CodeGen/SystemZ/fake-use-size.ll
new file mode 100644
index 0000000000000..1690a046aad43
--- /dev/null
+++ b/llvm/test/CodeGen/SystemZ/fake-use-size.ll
@@ -0,0 +1,14 @@
+; RUN: llc -O0 < %s -mtriple=s390x-linux-gnu 2>&1 | FileCheck %s
+
+;; Tests that we can handle FAKE_USE instructions, emitting a comment for them
+;; in the resulting assembly.
+
+; CHECK:      .type   idd, at function
+; CHECK:      # %bb.0:
+; CHECK-NEXT: # fake_use:
+
+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