[llvm] [X86][APX] Update live internals of physical registers too (PR #192595)

Phoebe Wang via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 16 22:53:06 PDT 2026


https://github.com/phoebewang created https://github.com/llvm/llvm-project/pull/192595

None

>From c7a3852516c479c217a52eeb3bd872fb792886a1 Mon Sep 17 00:00:00 2001
From: Phoebe Wang <phoebe.wang at intel.com>
Date: Fri, 17 Apr 2026 13:50:07 +0800
Subject: [PATCH] [X86][APX] Update live internals of physical registers too

---
 llvm/lib/CodeGen/InlineSpiller.cpp       |   2 +
 llvm/lib/CodeGen/LiveRangeEdit.cpp       |   2 +
 llvm/test/CodeGen/X86/apx/foldmemory.mir | 190 +++++++++++++++++++++++
 3 files changed, 194 insertions(+)
 create mode 100644 llvm/test/CodeGen/X86/apx/foldmemory.mir

diff --git a/llvm/lib/CodeGen/InlineSpiller.cpp b/llvm/lib/CodeGen/InlineSpiller.cpp
index ea062282b97b2..5f4dd2f04a610 100644
--- a/llvm/lib/CodeGen/InlineSpiller.cpp
+++ b/llvm/lib/CodeGen/InlineSpiller.cpp
@@ -1110,6 +1110,8 @@ foldMemoryOperand(ArrayRef<std::pair<MachineInstr *, unsigned>> Ops,
     if (R.isVirtual()) {
       LiveInterval &LI = LIS.getInterval(R);
       LIS.shrinkToUses(&LI);
+    } else {
+      LIS.removeAllRegUnitsForPhysReg(R.asMCReg());
     }
   }
 
diff --git a/llvm/lib/CodeGen/LiveRangeEdit.cpp b/llvm/lib/CodeGen/LiveRangeEdit.cpp
index edff8c8600188..f986fcde205d0 100644
--- a/llvm/lib/CodeGen/LiveRangeEdit.cpp
+++ b/llvm/lib/CodeGen/LiveRangeEdit.cpp
@@ -174,6 +174,8 @@ bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
     if (R.isVirtual()) {
       LiveInterval &SrcLI = LIS.getInterval(R);
       LIS.shrinkToUses(&SrcLI);
+    } else {
+      LIS.removeAllRegUnitsForPhysReg(R.asMCReg());
     }
   }
   return true;
diff --git a/llvm/test/CodeGen/X86/apx/foldmemory.mir b/llvm/test/CodeGen/X86/apx/foldmemory.mir
new file mode 100644
index 0000000000000..b3f665c741b98
--- /dev/null
+++ b/llvm/test/CodeGen/X86/apx/foldmemory.mir
@@ -0,0 +1,190 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=x86_64-- -run-pass=greedy %s -o - | FileCheck %s
+--- |
+  define fastcc void @fold_with_physical_reg(ptr %arg0, i64 %arg1, ptr %arg2, i1 %arg3) #0 {
+  entry:
+    br label %bb1
+
+  bb1:                                              ; preds = %bb2, %entry
+    %alloc = alloca i8, i64 %arg1, align 16
+    br label %bb2
+
+  bb2:                                              ; preds = %bb2, %bb1
+    %phi = phi i64 [ 0, %bb1 ], [ %arg1, %bb2 ]
+    %call = call fastcc ptr null(ptr %arg0, ptr null, ptr null, ptr null, float 0.000000e+00)
+    %gep = getelementptr ptr, ptr %alloc, i64 %phi
+    store ptr null, ptr %gep, align 8
+    store ptr null, ptr %arg2, align 8
+    br i1 %arg3, label %bb1, label %bb2
+  }
+
+  attributes #0 = { nounwind "target-features"="+ndd" }
+...
+---
+name:            fold_with_physical_reg
+alignment:       1
+exposesReturnsTwice: false
+legalized:       false
+regBankSelected: false
+selected:        false
+failedISel:      false
+tracksRegLiveness: true
+hasWinCFI:       false
+noPhis:          true
+isSSA:           false
+noVRegs:         false
+hasFakeUses:     false
+callsEHReturn:   false
+callsUnwindInit: false
+hasEHContTarget: false
+hasEHScopes:     false
+hasEHFunclets:   false
+isOutlined:      false
+debugInstrRef:   true
+failsVerification: false
+tracksDebugUserValues: false
+registers:
+  - { id: 0, class: gr64, preferred-register: '', flags: [  ] }
+  - { id: 1, class: gr64_nosp, preferred-register: '', flags: [  ] }
+  - { id: 2, class: gr64, preferred-register: '', flags: [  ] }
+  - { id: 3, class: gr64, preferred-register: '', flags: [  ] }
+  - { id: 4, class: gr64, preferred-register: '', flags: [  ] }
+  - { id: 5, class: gr32, preferred-register: '', flags: [  ] }
+  - { id: 6, class: gr8, preferred-register: '', flags: [  ] }
+  - { id: 7, class: gr64_with_sub_8bit, preferred-register: '', flags: [  ] }
+  - { id: 8, class: gr64, preferred-register: '', flags: [  ] }
+  - { id: 9, class: gr64, preferred-register: '', flags: [  ] }
+  - { id: 10, class: gr64, preferred-register: '', flags: [  ] }
+  - { id: 11, class: gr32, preferred-register: '', flags: [  ] }
+  - { id: 12, class: gr32, preferred-register: '', flags: [  ] }
+  - { id: 13, class: gr64_with_sub_8bit, preferred-register: '', flags: [  ] }
+  - { id: 14, class: fr32, preferred-register: '', flags: [  ] }
+  - { id: 15, class: gr64, preferred-register: '', flags: [  ] }
+  - { id: 16, class: gr64_nosp, preferred-register: '', flags: [  ] }
+liveins:
+  - { reg: '$rdi', virtual-reg: '%2' }
+  - { reg: '$rsi', virtual-reg: '%3' }
+  - { reg: '$rdx', virtual-reg: '%4' }
+  - { reg: '$ecx', virtual-reg: '%5' }
+frameInfo:
+  isFrameAddressTaken: false
+  isReturnAddressTaken: false
+  hasStackMap:     false
+  hasPatchPoint:   false
+  stackSize:       0
+  offsetAdjustment: 0
+  maxAlignment:    1
+  adjustsStack:    true
+  hasCalls:        true
+  stackProtector:  ''
+  functionContext: ''
+  maxCallFrameSize: 4294967295
+  cvBytesOfCalleeSavedRegisters: 0
+  hasOpaqueSPAdjustment: false
+  hasVAStart:      false
+  hasMustTailInVarArgFunc: false
+  hasTailCall:     false
+  isCalleeSavedInfoValid: false
+  localFrameSize:  0
+fixedStack:      []
+stack:
+  - { id: 0, name: alloc, type: variable-sized, offset: 0, alignment: 1,
+      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
+      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
+entry_values:    []
+callSites:       []
+debugValueSubstitutions: []
+constants:       []
+machineFunctionInfo:
+  amxProgModel:    None
+body:             |
+  ; CHECK-LABEL: name: fold_with_physical_reg
+  ; CHECK: bb.0.entry:
+  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-NEXT:   liveins: $rdi, $rsi, $rdx, $ecx
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr32 = COPY $ecx
+  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gr64 = COPY $rdx
+  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:gr64 = COPY $rsi
+  ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:gr64 = COPY $rdi
+  ; CHECK-NEXT:   [[LEA64r:%[0-9]+]]:gr64 = LEA64r [[COPY2]], 1, $noreg, 15, $noreg
+  ; CHECK-NEXT:   [[AND64ri32_ND:%[0-9]+]]:gr64 = AND64ri32_ND [[LEA64r]], -16, implicit-def dead $eflags
+  ; CHECK-NEXT:   MOV64mr %stack.1, 1, $noreg, 0, $noreg, [[AND64ri32_ND]] :: (store (s64) into %stack.1)
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.1.bb1:
+  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
+  ; CHECK-NEXT:   [[COPY4:%[0-9]+]]:gr64 = COPY $rsp
+  ; CHECK-NEXT:   [[COPY4:%[0-9]+]]:gr64 = SUB64rm [[COPY4]], %stack.1, 1, $noreg, 0, $noreg, implicit-def dead $eflags :: (load (s64) from %stack.1)
+  ; CHECK-NEXT:   MOV64mr %stack.2, 1, $noreg, 0, $noreg, [[COPY4]] :: (store (s64) into %stack.2)
+  ; CHECK-NEXT:   $rsp = COPY [[COPY4]]
+  ; CHECK-NEXT:   ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
+  ; CHECK-NEXT:   undef [[MOV32r0_:%[0-9]+]].sub_32bit:gr64_nosp = MOV32r0 implicit-def dead $eflags
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.2.bb2:
+  ; CHECK-NEXT:   successors: %bb.1(0x04000000), %bb.2(0x7c000000)
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
+  ; CHECK-NEXT:   $xmm0 = FsFLD0SS
+  ; CHECK-NEXT:   [[COPY5:%[0-9]+]]:gr64 = COPY [[COPY3]]
+  ; CHECK-NEXT:   $rdi = COPY [[COPY5]]
+  ; CHECK-NEXT:   [[COPY6:%[0-9]+]]:gr64 = COPY [[COPY2]]
+  ; CHECK-NEXT:   dead $esi = MOV32r0 implicit-def dead $eflags, implicit-def $rsi
+  ; CHECK-NEXT:   [[COPY7:%[0-9]+]]:gr64 = COPY [[COPY1]]
+  ; CHECK-NEXT:   dead $edx = MOV32r0 implicit-def dead $eflags, implicit-def $rdx
+  ; CHECK-NEXT:   [[COPY8:%[0-9]+]]:gr32 = COPY [[COPY]]
+  ; CHECK-NEXT:   dead $ecx = MOV32r0 implicit-def dead $eflags, implicit-def $rcx
+  ; CHECK-NEXT:   undef [[MOV32r0_1:%[0-9]+]].sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags
+  ; CHECK-NEXT:   CALL64r [[MOV32r0_1]], csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $rsi, implicit $rdx, implicit $rcx, implicit killed $xmm0, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax
+  ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:gr64 = COPY [[COPY5]]
+  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:gr64 = COPY [[COPY6]]
+  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gr64 = COPY [[COPY7]]
+  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr32 = COPY [[COPY8]]
+  ; CHECK-NEXT:   ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
+  ; CHECK-NEXT:   [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm %stack.2, 1, $noreg, 0, $noreg :: (load (s64) from %stack.2)
+  ; CHECK-NEXT:   MOV64mi32 [[MOV64rm]], 8, [[MOV32r0_]], 0, $noreg, 0 :: (store (s64) into %ir.gep)
+  ; CHECK-NEXT:   MOV64mi32 [[COPY1]], 1, $noreg, 0, $noreg, 0 :: (store (s64) into %ir.arg2)
+  ; CHECK-NEXT:   TEST8ri [[COPY]].sub_8bit, 1, implicit-def $eflags
+  ; CHECK-NEXT:   [[MOV32r0_:%[0-9]+]]:gr64_nosp = COPY [[COPY2]]
+  ; CHECK-NEXT:   JCC_1 %bb.1, 5, implicit $eflags
+  ; CHECK-NEXT:   JMP_1 %bb.2
+  bb.0.entry:
+    successors: %bb.1(0x80000000)
+    liveins: $rdi, $rsi, $rdx, $ecx
+
+    %5:gr32 = COPY $ecx
+    %4:gr64 = COPY $rdx
+    %3:gr64 = COPY $rsi
+    %2:gr64 = COPY $rdi
+    %8:gr64 = LEA64r %3, 1, $noreg, 15, $noreg
+    %9:gr64 = AND64ri32_ND %8, -16, implicit-def dead $eflags
+    undef %7.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags
+
+  bb.1.bb1:
+    successors: %bb.2(0x80000000)
+
+    ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
+    %0:gr64 = SUB64rr_ND $rsp, %9, implicit-def dead $eflags
+    $rsp = COPY %0
+    ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
+    undef %16.sub_32bit:gr64_nosp = MOV32r0 implicit-def dead $eflags
+
+  bb.2.bb2:
+    successors: %bb.1(0x04000000), %bb.2(0x7c000000)
+
+    ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
+    $xmm0 = FsFLD0SS
+    $rdi = COPY %2
+    dead $esi = MOV32r0 implicit-def dead $eflags, implicit-def $rsi
+    dead $edx = MOV32r0 implicit-def dead $eflags, implicit-def $rdx
+    dead $ecx = MOV32r0 implicit-def dead $eflags, implicit-def $rcx
+    CALL64r %7, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $rsi, implicit $rdx, implicit $rcx, implicit killed $xmm0, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax
+    ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
+    MOV64mi32 %0, 8, %16, 0, $noreg, 0 :: (store (s64) into %ir.gep)
+    MOV64mi32 %4, 1, $noreg, 0, $noreg, 0 :: (store (s64) into %ir.arg2)
+    TEST8ri %5.sub_8bit, 1, implicit-def $eflags
+    %16:gr64_nosp = COPY %3
+    JCC_1 %bb.1, 5, implicit $eflags
+    JMP_1 %bb.2
+...



More information about the llvm-commits mailing list