Skip to content

Commit ba6bb69

Browse files
LuoYuankeYuanke Luo
andauthored
[RegAlloc] Fix register's live range for early-clobber (#152895)
When rematerialize a virtual register the register may be early clobbered. However rematerializeAt(...) just return the slot index of Slot_Register which cause mis-calculating live range for the register --------- Co-authored-by: Yuanke Luo <[email protected]>
1 parent 276c1d8 commit ba6bb69

File tree

2 files changed

+81
-2
lines changed

2 files changed

+81
-2
lines changed

llvm/lib/CodeGen/LiveRangeEdit.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,12 @@ SlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
190190
Rematted.insert(RM.ParentVNI);
191191
++NumReMaterialization;
192192

193+
bool EarlyClobber = MI->getOperand(0).isEarlyClobber();
193194
if (ReplaceIndexMI)
194-
return LIS.ReplaceMachineInstrInMaps(*ReplaceIndexMI, *MI).getRegSlot();
195-
return LIS.getSlotIndexes()->insertMachineInstrInMaps(*MI, Late).getRegSlot();
195+
return LIS.ReplaceMachineInstrInMaps(*ReplaceIndexMI, *MI)
196+
.getRegSlot(EarlyClobber);
197+
return LIS.getSlotIndexes()->insertMachineInstrInMaps(*MI, Late).getRegSlot(
198+
EarlyClobber);
196199
}
197200

198201
void LiveRangeEdit::eraseVirtReg(Register Reg) {
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=i386-unknown-linux-gnu -start-before=twoaddressinstruction -stop-after=postrapseudos -verify-machineinstrs -o - %s | FileCheck %s
3+
4+
# Test register live range that is split from rematerializing. The live range should
5+
# start with Slot_EarlyClobber instead of Slot_Register. Machineverifer can check it.
6+
7+
--- |
8+
9+
define void @test() nounwind {
10+
ret void
11+
}
12+
13+
...
14+
---
15+
name: test
16+
alignment: 16
17+
tracksRegLiveness: true
18+
frameInfo:
19+
maxAlignment: 4
20+
fixedStack:
21+
- { id: 0, size: 4, alignment: 16, isImmutable: true }
22+
machineFunctionInfo: {}
23+
body: |
24+
; CHECK-LABEL: name: test
25+
; CHECK: bb.0:
26+
; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
27+
; CHECK-NEXT: liveins: $ebp, $ebx, $edi, $esi
28+
; CHECK-NEXT: {{ $}}
29+
; CHECK-NEXT: frame-setup PUSH32r killed $ebp, implicit-def $esp, implicit $esp
30+
; CHECK-NEXT: frame-setup PUSH32r killed $ebx, implicit-def $esp, implicit $esp
31+
; CHECK-NEXT: frame-setup PUSH32r killed $edi, implicit-def $esp, implicit $esp
32+
; CHECK-NEXT: frame-setup PUSH32r killed $esi, implicit-def $esp, implicit $esp
33+
; CHECK-NEXT: $esp = frame-setup SUB32ri $esp, 12, implicit-def dead $eflags
34+
; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead early-clobber $ebp, 12 /* clobber */, implicit-def dead early-clobber $eax, 12 /* clobber */, implicit-def dead early-clobber $ebx, 12 /* clobber */, implicit-def dead early-clobber $ecx, 12 /* clobber */, implicit-def dead early-clobber $edx, 12 /* clobber */, implicit-def dead early-clobber $esi, 12 /* clobber */, implicit-def dead early-clobber $edi, 12 /* clobber */, implicit-def dead early-clobber $df, 12 /* clobber */, implicit-def early-clobber $fpsw, 12 /* clobber */, implicit-def dead early-clobber $eflags
35+
; CHECK-NEXT: early-clobber renamable $eax = XOR32rr undef $eax, undef $eax, implicit-def dead $eflags
36+
; CHECK-NEXT: TEST8rr renamable $al, renamable $al, implicit-def $eflags
37+
; CHECK-NEXT: JCC_1 %bb.2, 5, implicit $eflags
38+
; CHECK-NEXT: {{ $}}
39+
; CHECK-NEXT: bb.1:
40+
; CHECK-NEXT: successors: %bb.2(0x80000000)
41+
; CHECK-NEXT: {{ $}}
42+
; CHECK-NEXT: renamable $eax = MOV32ri 1
43+
; CHECK-NEXT: {{ $}}
44+
; CHECK-NEXT: bb.2:
45+
; CHECK-NEXT: liveins: $eax
46+
; CHECK-NEXT: {{ $}}
47+
; CHECK-NEXT: $esp = frame-destroy ADD32ri $esp, 12, implicit-def dead $eflags
48+
; CHECK-NEXT: $esi = frame-destroy POP32r implicit-def $esp, implicit $esp
49+
; CHECK-NEXT: $edi = frame-destroy POP32r implicit-def $esp, implicit $esp
50+
; CHECK-NEXT: $ebx = frame-destroy POP32r implicit-def $esp, implicit $esp
51+
; CHECK-NEXT: $ebp = frame-destroy POP32r implicit-def $esp, implicit $esp
52+
; CHECK-NEXT: RET 0, $eax
53+
bb.0:
54+
successors: %bb.1, %bb.2
55+
56+
early-clobber %0:gr32_abcd = MOV32r0 implicit-def dead $eflags
57+
INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead early-clobber $ebp, 12 /* clobber */, implicit-def dead early-clobber $eax, 12 /* clobber */, implicit-def dead early-clobber $ebx, 12 /* clobber */, implicit-def dead early-clobber $ecx, 12 /* clobber */, implicit-def dead early-clobber $edx, 12 /* clobber */, implicit-def dead early-clobber $esi, 12 /* clobber */, implicit-def dead early-clobber $edi, 12 /* clobber */, implicit-def dead early-clobber $df, 12 /* clobber */, implicit-def early-clobber $fpsw, 12 /* clobber */, implicit-def dead early-clobber $eflags
58+
%4:gr8 = COPY %0.sub_8bit
59+
TEST8rr killed %4, %4, implicit-def $eflags
60+
JCC_1 %bb.2, 5, implicit killed $eflags
61+
JMP_1 %bb.1
62+
63+
bb.1:
64+
%1:gr32 = MOV32ri 1
65+
%5:gr32 = COPY killed %1
66+
JMP_1 %bb.3
67+
68+
bb.2:
69+
%5:gr32 = COPY killed %0
70+
71+
bb.3:
72+
%3:gr32 = COPY killed %5
73+
$eax = COPY killed %3
74+
RET 0, killed $eax
75+
76+
...

0 commit comments

Comments
 (0)