[llvm] [ARM] Remove kill flags in ReplaceConstByVPNOTs. (PR #140082)

David Green via llvm-commits llvm-commits at lists.llvm.org
Thu May 15 08:28:16 PDT 2025


https://github.com/davemgreen created https://github.com/llvm/llvm-project/pull/140082

This is similar to #86300. The vpr register on this branch might be killed before we reuse it.

>From 88310786ecb6ce6187bcccc282fc1c7c0e2d5ed0 Mon Sep 17 00:00:00 2001
From: David Green <david.green at arm.com>
Date: Thu, 15 May 2025 16:23:09 +0100
Subject: [PATCH] [ARM] Remove kill flags in ReplaceConstByVPNOTs.

This is similar to #86300. The vpr register on this branch might be killed
before we reuse it.
---
 .../ARM/MVETPAndVPTOptimisationsPass.cpp      |  1 +
 .../CodeGen/Thumb2/mve-vpt-optimisations.mir  | 25 ++++++++++++++++++-
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/ARM/MVETPAndVPTOptimisationsPass.cpp b/llvm/lib/Target/ARM/MVETPAndVPTOptimisationsPass.cpp
index 18d5c232378a7..0b4e7dfebe369 100644
--- a/llvm/lib/Target/ARM/MVETPAndVPTOptimisationsPass.cpp
+++ b/llvm/lib/Target/ARM/MVETPAndVPTOptimisationsPass.cpp
@@ -984,6 +984,7 @@ bool MVETPAndVPTOptimisations::ReplaceConstByVPNOTs(MachineBasicBlock &MBB,
         if (MRI->hasOneUse(GPR))
           DeadInstructions.insert(MRI->getVRegDef(GPR));
       }
+      MRI->clearKillFlags(LastVPTReg);
       LLVM_DEBUG(dbgs() << "Adding VPNot: " << *VPNot << "  to replace use at "
                         << Instr);
       VPR = NewVPR;
diff --git a/llvm/test/CodeGen/Thumb2/mve-vpt-optimisations.mir b/llvm/test/CodeGen/Thumb2/mve-vpt-optimisations.mir
index f9b175ed80fbf..e174934abdbfc 100644
--- a/llvm/test/CodeGen/Thumb2/mve-vpt-optimisations.mir
+++ b/llvm/test/CodeGen/Thumb2/mve-vpt-optimisations.mir
@@ -1042,5 +1042,28 @@ body:             |
     %5:mqpr = IMPLICIT_DEF
     %6:mqpr = MVE_VORR %5:mqpr, %5:mqpr, 1, killed %4, $noreg, undef %6
     tBX_RET 14 /* CC::al */, $noreg, implicit %5:mqpr
-
+...
+---
+name:            kill_flags_2
+alignment:       4
+body:             |
+  bb.0:
+    ; CHECK-LABEL: name: kill_flags_2
+    ; CHECK: [[COPY:%[0-9]+]]:mqpr = COPY $q0
+    ; CHECK-NEXT: [[t2MOVi:%[0-9]+]]:rgpr = t2MOVi 0, 14 /* CC::al */, $noreg, $noreg
+    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vccr = COPY [[t2MOVi]]
+    ; CHECK-NEXT: [[MVE_VHADDs8_:%[0-9]+]]:mqpr = MVE_VHADDs8 [[COPY]], [[COPY]], 1, [[COPY1]], $noreg, [[COPY]]
+    ; CHECK-NEXT: [[MVE_VPNOT:%[0-9]+]]:vccr = MVE_VPNOT [[COPY1]], 0, $noreg, $noreg
+    ; CHECK-NEXT: [[MVE_VSLIimm8_:%[0-9]+]]:mqpr = MVE_VSLIimm8 [[MVE_VHADDs8_]], [[COPY]], 0, 1, [[MVE_VPNOT]], $noreg
+    ; CHECK-NEXT: $q0 = COPY [[MVE_VSLIimm8_]]
+    ; CHECK-NEXT: tBX_RET 14 /* CC::al */, $noreg, implicit $q0
+    %0:mqpr = COPY $q0
+    %1:rgpr = t2MOVi 0, 14, $noreg, $noreg
+    %2:vccr = COPY %1:rgpr
+    %3:mqpr = MVE_VHADDs8 %0:mqpr, %0:mqpr, 1, killed %2:vccr, $noreg, %0:mqpr
+    %4:rgpr = t2MOVi16 65535, 14, $noreg
+    %5:vccr = COPY %4:rgpr
+    %6:mqpr = MVE_VSLIimm8 %3:mqpr, %0:mqpr, 0, 1, killed %5:vccr, $noreg
+    $q0 = COPY %6:mqpr
+    tBX_RET 14, $noreg, implicit $q0
 ...



More information about the llvm-commits mailing list