Skip to content

Commit 74c00d4

Browse files
authored
LiveRangeEdit: Clear all dead flags when rematerializing (#73933)
It's allowed to rematerialize instructions with implicit-defs of the same register as the single explicit def. If this happened, it was only clearing the dead flags on the one main result.
1 parent 90681d3 commit 74c00d4

File tree

3 files changed

+245
-1
lines changed

3 files changed

+245
-1
lines changed

llvm/lib/CodeGen/LiveRangeEdit.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ SlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
190190
// DestReg of the cloned instruction cannot be Dead. Set isDead of DestReg
191191
// to false anyway in case the isDead flag of RM.OrigMI's dest register
192192
// is true.
193-
(*--MI).getOperand(0).setIsDead(false);
193+
(*--MI).clearRegisterDeads(DestReg);
194194
Rematted.insert(RM.ParentVNI);
195195
++NumReMaterialization;
196196

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=arm64-apple-macosx10.13.0 -mcpu=apple-m1 < %s | FileCheck %s
3+
4+
@.str = external constant [9 x i8]
5+
6+
define void @_ZN38SanitizerCommonInterceptors_Scanf_Test8TestBodyEv(ptr %.str.40, ptr %.str.41, ptr %.str.42, ptr %.str.43, ptr %.str.44, ptr %.str.45, ptr nocapture writeonly %.str.47) nounwind {
7+
; CHECK-LABEL: _ZN38SanitizerCommonInterceptors_Scanf_Test8TestBodyEv:
8+
; CHECK: ; %bb.0: ; %entry
9+
; CHECK-NEXT: sub sp, sp, #128
10+
; CHECK-NEXT: stp x28, x27, [sp, #32] ; 16-byte Folded Spill
11+
; CHECK-NEXT: stp x26, x25, [sp, #48] ; 16-byte Folded Spill
12+
; CHECK-NEXT: stp x24, x23, [sp, #64] ; 16-byte Folded Spill
13+
; CHECK-NEXT: stp x22, x21, [sp, #80] ; 16-byte Folded Spill
14+
; CHECK-NEXT: stp x20, x19, [sp, #96] ; 16-byte Folded Spill
15+
; CHECK-NEXT: stp x29, x30, [sp, #112] ; 16-byte Folded Spill
16+
; CHECK-NEXT: mov x24, x6
17+
; CHECK-NEXT: mov x19, x5
18+
; CHECK-NEXT: mov x20, x4
19+
; CHECK-NEXT: mov x21, x3
20+
; CHECK-NEXT: mov x22, x2
21+
; CHECK-NEXT: mov x23, x1
22+
; CHECK-NEXT: mov x25, x0
23+
; CHECK-NEXT: str xzr, [sp]
24+
; CHECK-NEXT: mov x0, #0 ; =0x0
25+
; CHECK-NEXT: mov w1, #1 ; =0x1
26+
; CHECK-NEXT: bl __ZL9testScanfPKcjz
27+
; CHECK-NEXT: mov w28, #4 ; =0x4
28+
; CHECK-NEXT: stp x28, x28, [sp, #8]
29+
; CHECK-NEXT: str x28, [sp]
30+
; CHECK-NEXT: mov x0, #0 ; =0x0
31+
; CHECK-NEXT: mov w1, #0 ; =0x0
32+
; CHECK-NEXT: bl __ZL9testScanfPKcjz
33+
; CHECK-NEXT: stp x28, xzr, [sp]
34+
; CHECK-NEXT: mov x0, #0 ; =0x0
35+
; CHECK-NEXT: mov w1, #0 ; =0x0
36+
; CHECK-NEXT: bl __ZL9testScanfPKcjz
37+
; CHECK-NEXT: mov w27, #8 ; =0x8
38+
; CHECK-NEXT: str x27, [sp]
39+
; CHECK-NEXT: mov x0, #0 ; =0x0
40+
; CHECK-NEXT: mov w1, #0 ; =0x0
41+
; CHECK-NEXT: bl __ZL9testScanfPKcjz
42+
; CHECK-NEXT: mov w26, #1 ; =0x1
43+
; CHECK-NEXT: stp xzr, x26, [sp]
44+
; CHECK-NEXT: mov x0, #0 ; =0x0
45+
; CHECK-NEXT: mov w1, #0 ; =0x0
46+
; CHECK-NEXT: bl __ZL9testScanfPKcjz
47+
; CHECK-NEXT: str x26, [sp]
48+
; CHECK-NEXT: mov x0, #0 ; =0x0
49+
; CHECK-NEXT: mov w1, #0 ; =0x0
50+
; CHECK-NEXT: bl __ZL9testScanfPKcjz
51+
; CHECK-NEXT: str x28, [sp]
52+
; CHECK-NEXT: Lloh0:
53+
; CHECK-NEXT: adrp x26, _.str@GOTPAGE
54+
; CHECK-NEXT: Lloh1:
55+
; CHECK-NEXT: ldr x26, [x26, _.str@GOTPAGEOFF]
56+
; CHECK-NEXT: mov x0, x26
57+
; CHECK-NEXT: mov w1, #0 ; =0x0
58+
; CHECK-NEXT: bl __ZL9testScanfPKcjz
59+
; CHECK-NEXT: str wzr, [x24]
60+
; CHECK-NEXT: str x27, [sp]
61+
; CHECK-NEXT: mov x0, x25
62+
; CHECK-NEXT: mov w1, #0 ; =0x0
63+
; CHECK-NEXT: bl __ZL20testScanfNoGnuMallocPKcjz
64+
; CHECK-NEXT: str x28, [sp]
65+
; CHECK-NEXT: mov x0, x23
66+
; CHECK-NEXT: mov w1, #0 ; =0x0
67+
; CHECK-NEXT: bl __ZL20testScanfNoGnuMallocPKcjz
68+
; CHECK-NEXT: str x28, [sp]
69+
; CHECK-NEXT: mov x0, x22
70+
; CHECK-NEXT: mov w1, #0 ; =0x0
71+
; CHECK-NEXT: bl __ZL20testScanfNoGnuMallocPKcjz
72+
; CHECK-NEXT: str x28, [sp]
73+
; CHECK-NEXT: mov x0, x21
74+
; CHECK-NEXT: mov w1, #0 ; =0x0
75+
; CHECK-NEXT: bl __ZL20testScanfNoGnuMallocPKcjz
76+
; CHECK-NEXT: str x28, [sp]
77+
; CHECK-NEXT: mov x0, x20
78+
; CHECK-NEXT: mov w1, #0 ; =0x0
79+
; CHECK-NEXT: bl __ZL20testScanfNoGnuMallocPKcjz
80+
; CHECK-NEXT: str xzr, [sp]
81+
; CHECK-NEXT: mov x0, x19
82+
; CHECK-NEXT: mov w1, #0 ; =0x0
83+
; CHECK-NEXT: bl __ZL20testScanfNoGnuMallocPKcjz
84+
; CHECK-NEXT: str xzr, [sp]
85+
; CHECK-NEXT: mov x0, x26
86+
; CHECK-NEXT: mov w1, #0 ; =0x0
87+
; CHECK-NEXT: bl __ZL20testScanfNoGnuMallocPKcjz
88+
; CHECK-NEXT: mov w8, #1 ; =0x1
89+
; CHECK-NEXT: stp x8, xzr, [sp, #8]
90+
; CHECK-NEXT: str xzr, [sp]
91+
; CHECK-NEXT: mov x0, #0 ; =0x0
92+
; CHECK-NEXT: mov w1, #0 ; =0x0
93+
; CHECK-NEXT: bl __ZL20testScanfNoGnuMallocPKcjz
94+
; CHECK-NEXT: ldp x29, x30, [sp, #112] ; 16-byte Folded Reload
95+
; CHECK-NEXT: ldp x20, x19, [sp, #96] ; 16-byte Folded Reload
96+
; CHECK-NEXT: ldp x22, x21, [sp, #80] ; 16-byte Folded Reload
97+
; CHECK-NEXT: ldp x24, x23, [sp, #64] ; 16-byte Folded Reload
98+
; CHECK-NEXT: ldp x26, x25, [sp, #48] ; 16-byte Folded Reload
99+
; CHECK-NEXT: ldp x28, x27, [sp, #32] ; 16-byte Folded Reload
100+
; CHECK-NEXT: add sp, sp, #128
101+
; CHECK-NEXT: ret
102+
; CHECK-NEXT: .loh AdrpLdrGot Lloh0, Lloh1
103+
entry:
104+
tail call void (ptr, i32, ...) @_ZL9testScanfPKcjz(ptr null, i32 1, i32 0)
105+
tail call void (ptr, i32, ...) @_ZL9testScanfPKcjz(ptr null, i32 0, i32 4, i32 4, i32 4)
106+
tail call void (ptr, i32, ...) @_ZL9testScanfPKcjz(ptr null, i32 0, i32 4, i32 0)
107+
tail call void (ptr, i32, ...) @_ZL9testScanfPKcjz(ptr null, i32 0, i32 8)
108+
tail call void (ptr, i32, ...) @_ZL9testScanfPKcjz(ptr null, i32 0, i32 0, i32 1)
109+
tail call void (ptr, i32, ...) @_ZL9testScanfPKcjz(ptr null, i32 0, i32 1)
110+
tail call void (ptr, i32, ...) @_ZL9testScanfPKcjz(ptr nonnull @.str, i32 0, i32 4)
111+
store i32 0, ptr %.str.47, align 4
112+
tail call void (ptr, i32, ...) @_ZL20testScanfNoGnuMallocPKcjz(ptr %.str.40, i32 0, i32 8)
113+
tail call void (ptr, i32, ...) @_ZL20testScanfNoGnuMallocPKcjz(ptr %.str.41, i32 0, i32 4)
114+
tail call void (ptr, i32, ...) @_ZL20testScanfNoGnuMallocPKcjz(ptr %.str.42, i32 0, i32 4)
115+
tail call void (ptr, i32, ...) @_ZL20testScanfNoGnuMallocPKcjz(ptr %.str.43, i32 0, i32 4)
116+
tail call void (ptr, i32, ...) @_ZL20testScanfNoGnuMallocPKcjz(ptr %.str.44, i32 0, i32 4)
117+
tail call void (ptr, i32, ...) @_ZL20testScanfNoGnuMallocPKcjz(ptr %.str.45, i32 0, i32 0)
118+
tail call void (ptr, i32, ...) @_ZL20testScanfNoGnuMallocPKcjz(ptr nonnull @.str, i32 0, i32 0)
119+
tail call void (ptr, i32, ...) @_ZL20testScanfNoGnuMallocPKcjz(ptr null, i32 0, i32 0, i32 1, i32 0)
120+
ret void
121+
}
122+
123+
declare void @_ZL9testScanfPKcjz(ptr, i32, ...) local_unnamed_addr
124+
125+
declare void @_ZL20testScanfNoGnuMallocPKcjz(ptr, i32, ...) local_unnamed_addr
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
2+
# RUN: llc -mtriple=arm64-apple-macosx -mcpu=apple-m1 -verify-regalloc -run-pass=greedy -o - %s | FileCheck %s
3+
---
4+
name: func
5+
tracksRegLiveness: true
6+
body: |
7+
bb.0:
8+
liveins: $x0, $x1, $x2, $x3, $x4, $x5, $x6
9+
10+
; CHECK-LABEL: name: func
11+
; CHECK: liveins: $x0, $x1, $x2, $x3, $x4, $x5, $x6
12+
; CHECK-NEXT: {{ $}}
13+
; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr64sp = IMPLICIT_DEF
14+
; CHECK-NEXT: dead [[DEF1:%[0-9]+]]:gpr32 = IMPLICIT_DEF
15+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64common = COPY $x0
16+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
17+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr64 = COPY $x2
18+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr64 = COPY $x3
19+
; CHECK-NEXT: [[COPY4:%[0-9]+]]:gpr64 = COPY $x4
20+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:gpr64 = COPY $x5
21+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr64 = COPY $x6
22+
; CHECK-NEXT: undef [[MOVi32imm:%[0-9]+]].sub_32:gpr64 = MOVi32imm 4, implicit-def [[MOVi32imm]]
23+
; CHECK-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
24+
; CHECK-NEXT: BL 0, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
25+
; CHECK-NEXT: ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
26+
; CHECK-NEXT: ADJCALLSTACKDOWN 24, 0, implicit-def dead $sp, implicit $sp
27+
; CHECK-NEXT: ADJCALLSTACKUP 24, 0, implicit-def dead $sp, implicit $sp
28+
; CHECK-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def dead $sp, implicit $sp
29+
; CHECK-NEXT: ADJCALLSTACKUP 16, 0, implicit-def dead $sp, implicit $sp
30+
; CHECK-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
31+
; CHECK-NEXT: [[DEF2:%[0-9]+]]:gpr64 = IMPLICIT_DEF
32+
; CHECK-NEXT: ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
33+
; CHECK-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def dead $sp, implicit $sp
34+
; CHECK-NEXT: undef [[DEF3:%[0-9]+]].sub_32:gpr64 = IMPLICIT_DEF implicit-def [[DEF3]]
35+
; CHECK-NEXT: STRXui [[DEF3]], [[DEF]], 1 :: (store (s64) into stack + 8)
36+
; CHECK-NEXT: BL 0, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
37+
; CHECK-NEXT: ADJCALLSTACKUP 16, 0, implicit-def dead $sp, implicit $sp
38+
; CHECK-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
39+
; CHECK-NEXT: STRXui [[MOVi32imm]], [[DEF]], 0 :: (store (s64) into stack)
40+
; CHECK-NEXT: ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
41+
; CHECK-NEXT: STRWui undef [[MOVi32imm]].sub_32, [[COPY]], 0 :: (store (s32))
42+
; CHECK-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
43+
; CHECK-NEXT: STRXui [[DEF2]], undef [[DEF]], 0 :: (store (s64) into stack)
44+
; CHECK-NEXT: $x0 = COPY [[COPY6]]
45+
; CHECK-NEXT: ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
46+
; CHECK-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
47+
; CHECK-NEXT: $x0 = COPY [[COPY5]]
48+
; CHECK-NEXT: ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
49+
; CHECK-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
50+
; CHECK-NEXT: $x0 = COPY [[COPY4]]
51+
; CHECK-NEXT: ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
52+
; CHECK-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
53+
; CHECK-NEXT: $x0 = COPY [[COPY3]]
54+
; CHECK-NEXT: ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
55+
; CHECK-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
56+
; CHECK-NEXT: $x0 = COPY [[COPY2]]
57+
; CHECK-NEXT: ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
58+
; CHECK-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
59+
; CHECK-NEXT: $x0 = COPY [[COPY1]]
60+
; CHECK-NEXT: ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
61+
; CHECK-NEXT: ADJCALLSTACKDOWN 24, 0, implicit-def dead $sp, implicit $sp
62+
; CHECK-NEXT: undef [[DEF4:%[0-9]+]].sub_32:gpr64 = IMPLICIT_DEF implicit-def [[DEF4]]
63+
; CHECK-NEXT: STRXui [[DEF4]], undef [[DEF]], 1 :: (store (s64) into stack + 8)
64+
; CHECK-NEXT: ADJCALLSTACKUP 24, 0, implicit-def dead $sp, implicit $sp
65+
; CHECK-NEXT: RET_ReallyLR
66+
%0:gpr64sp = IMPLICIT_DEF
67+
undef %13.sub_32:gpr64 = IMPLICIT_DEF implicit-def %13
68+
dead %2:gpr32 = IMPLICIT_DEF
69+
%3:gpr64common = COPY $x0
70+
%4:gpr64 = COPY $x1
71+
%5:gpr64 = COPY $x2
72+
%6:gpr64 = COPY $x3
73+
%7:gpr64 = COPY $x4
74+
%8:gpr64 = COPY $x5
75+
%9:gpr64 = COPY $x6
76+
undef %11.sub_32:gpr64 = MOVi32imm 4, implicit-def %11
77+
ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
78+
BL 0, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
79+
ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
80+
ADJCALLSTACKDOWN 24, 0, implicit-def dead $sp, implicit $sp
81+
ADJCALLSTACKUP 24, 0, implicit-def dead $sp, implicit $sp
82+
ADJCALLSTACKDOWN 16, 0, implicit-def dead $sp, implicit $sp
83+
ADJCALLSTACKUP 16, 0, implicit-def dead $sp, implicit $sp
84+
ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
85+
%12:gpr64 = IMPLICIT_DEF
86+
ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
87+
ADJCALLSTACKDOWN 16, 0, implicit-def dead $sp, implicit $sp
88+
STRXui %13, %0, 1 :: (store (s64) into stack + 8)
89+
BL 0, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
90+
ADJCALLSTACKUP 16, 0, implicit-def dead $sp, implicit $sp
91+
ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
92+
STRXui %11, %0, 0 :: (store (s64) into stack)
93+
ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
94+
STRWui undef %11.sub_32, %3, 0 :: (store (s32))
95+
ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
96+
STRXui %12, undef %0, 0 :: (store (s64) into stack)
97+
$x0 = COPY %9
98+
ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
99+
ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
100+
$x0 = COPY %8
101+
ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
102+
ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
103+
$x0 = COPY %7
104+
ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
105+
ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
106+
$x0 = COPY %6
107+
ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
108+
ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
109+
$x0 = COPY %5
110+
ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
111+
ADJCALLSTACKDOWN 8, 0, implicit-def dead $sp, implicit $sp
112+
$x0 = COPY %4
113+
ADJCALLSTACKUP 8, 0, implicit-def dead $sp, implicit $sp
114+
ADJCALLSTACKDOWN 24, 0, implicit-def dead $sp, implicit $sp
115+
STRXui %13, undef %0, 1 :: (store (s64) into stack + 8)
116+
ADJCALLSTACKUP 24, 0, implicit-def dead $sp, implicit $sp
117+
RET_ReallyLR
118+
119+
...

0 commit comments

Comments
 (0)