[llvm] TwoAddressInstruction: Fix assert on undef operand with -early-live-intervals (PR #125518)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 3 07:44:04 PST 2025


https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/125518

None

>From f173ea6e5377b7ddbf0a27adbd98e574254e92b1 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Mon, 3 Feb 2025 22:24:09 +0700
Subject: [PATCH] TwoAddressInstruction: Fix assert on undef operand with
 -early-live-intervals

---
 .../lib/CodeGen/TwoAddressInstructionPass.cpp |  3 +++
 .../twoaddress-asserts-liveints-undef-use.mir | 24 +++++++++++++++++++
 2 files changed, 27 insertions(+)
 create mode 100644 llvm/test/CodeGen/ARM/twoaddress-asserts-liveints-undef-use.mir

diff --git a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
index fb6274b09919ba..6236268f77ab16 100644
--- a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
+++ b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
@@ -489,6 +489,9 @@ MachineInstr *TwoAddressInstructionImpl::findOnlyInterestingUse(
     bool &IsDstPhys) const {
   MachineOperand *UseOp = nullptr;
   for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
+    if (MO.isUndef())
+      continue;
+
     MachineInstr *MI = MO.getParent();
     if (MI->getParent() != MBB)
       return nullptr;
diff --git a/llvm/test/CodeGen/ARM/twoaddress-asserts-liveints-undef-use.mir b/llvm/test/CodeGen/ARM/twoaddress-asserts-liveints-undef-use.mir
new file mode 100644
index 00000000000000..6e33d4be9345da
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/twoaddress-asserts-liveints-undef-use.mir
@@ -0,0 +1,24 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
+# RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs -run-pass=liveintervals,twoaddressinstruction -o - %s | FileCheck %s
+
+---
+name:      undef_use_asserts_lr
+tracksRegLiveness: true
+noPhis:          true
+body:             |
+  bb.0:
+    liveins: $q0
+
+    ; CHECK-LABEL: name: undef_use_asserts_lr
+    ; CHECK: liveins: $q0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:mqpr = COPY $q0
+    ; CHECK-NEXT: [[DEF:%[0-9]+]]:spr = IMPLICIT_DEF
+    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:mqpr = COPY [[COPY]]
+    ; CHECK-NEXT: dead [[COPY1:%[0-9]+]].ssub_2:mqpr = COPY [[DEF]]
+    ; CHECK-NEXT: dead [[COPY2:%[0-9]+]]:spr = COPY undef [[COPY1]].ssub_3
+    %0:mqpr = COPY $q0
+    %1:spr = IMPLICIT_DEF
+    %2:mqpr = INSERT_SUBREG %0, %1, %subreg.ssub_2
+    dead %4:spr = COPY undef %2.ssub_3
+...



More information about the llvm-commits mailing list