Skip to content

Commit e0adc3b

Browse files
[Mips] support "sp" named register
After Linux kernel commit commit 200ed341b864 ("mips: Implement "current_stack_pointer"") We observe the following build error when compiling the Linux kernel targeting Mips: fatal error: error in backend: Invalid register name global variable Fixes: llvm#54174 Link: ClangBuiltLinux/linux#1608 Reviewed By: atanasyan Differential Revision: https://reviews.llvm.org/D120926
1 parent d7f9220 commit e0adc3b

File tree

4 files changed

+70
-34
lines changed

4 files changed

+70
-34
lines changed

llvm/lib/Target/Mips/MipsISelLowering.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4722,18 +4722,19 @@ MipsTargetLowering::emitPseudoD_SELECT(MachineInstr &MI,
47224722
Register
47234723
MipsTargetLowering::getRegisterByName(const char *RegName, LLT VT,
47244724
const MachineFunction &MF) const {
4725-
// Named registers is expected to be fairly rare. For now, just support $28
4726-
// since the linux kernel uses it.
4725+
// The Linux kernel uses $28 and sp.
47274726
if (Subtarget.isGP64bit()) {
47284727
Register Reg = StringSwitch<Register>(RegName)
4729-
.Case("$28", Mips::GP_64)
4730-
.Default(Register());
4728+
.Case("$28", Mips::GP_64)
4729+
.Case("sp", Mips::SP_64)
4730+
.Default(Register());
47314731
if (Reg)
47324732
return Reg;
47334733
} else {
47344734
Register Reg = StringSwitch<Register>(RegName)
4735-
.Case("$28", Mips::GP)
4736-
.Default(Register());
4735+
.Case("$28", Mips::GP)
4736+
.Case("sp", Mips::SP)
4737+
.Default(Register());
47374738
if (Reg)
47384739
return Reg;
47394740
}
Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
1-
; RUN: llc -mtriple=mips64 -relocation-model=static -mattr=+noabicalls -target-abi n32 < %s | FileCheck %s
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=mips64 -relocation-model=static -mattr=+noabicalls \
3+
; RUN: -target-abi n32 < %s | FileCheck %s
24

3-
define i32* @get_gp() {
4-
entry:
5-
%0 = call i64 @llvm.read_register.i64(metadata !0)
6-
%1 = trunc i64 %0 to i32
7-
%2 = inttoptr i32 %1 to i32*
8-
ret i32* %2
9-
}
5+
declare i64 @llvm.read_register.i64(metadata)
106

7+
define i64 @get_gp() {
118
; CHECK-LABEL: get_gp:
12-
; CHECK: sll $2, $gp, 0
9+
; CHECK: # %bb.0:
10+
; CHECK-NEXT: jr $ra
11+
; CHECK-NEXT: move $2, $gp
12+
%1 = call i64 @llvm.read_register.i64(metadata !0)
13+
ret i64 %1
14+
}
1315

14-
declare i64 @llvm.read_register.i64(metadata)
16+
define i64 @get_sp() {
17+
; CHECK-LABEL: get_sp:
18+
; CHECK: # %bb.0:
19+
; CHECK-NEXT: jr $ra
20+
; CHECK-NEXT: move $2, $sp
21+
%1 = call i64 @llvm.read_register.i64(metadata !1)
22+
ret i64 %1
23+
}
1524

1625
!llvm.named.register.$28 = !{!0}
26+
!llvm.named.register.sp = !{!1}
1727

1828
!0 = !{!"$28"}
29+
!1 = !{!"sp"}
Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,29 @@
1-
; RUN: llc -mtriple=mips64 -relocation-model=static -mattr=+noabicalls < %s | FileCheck %s
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=mips64 -relocation-model=static -mattr=+noabicalls \
3+
; RUN: < %s | FileCheck %s
24

3-
define i32* @get_gp() {
4-
entry:
5-
%0 = call i64 @llvm.read_register.i64(metadata !0)
6-
%1 = inttoptr i64 %0 to i32*
7-
ret i32* %1
8-
}
5+
declare i64 @llvm.read_register.i64(metadata)
96

7+
define i64 @get_gp() {
108
; CHECK-LABEL: get_gp:
11-
; CHECK: move $2, $gp
9+
; CHECK: # %bb.0:
10+
; CHECK-NEXT: jr $ra
11+
; CHECK-NEXT: move $2, $gp
12+
%1 = call i64 @llvm.read_register.i64(metadata !0)
13+
ret i64 %1
14+
}
1215

13-
declare i64 @llvm.read_register.i64(metadata)
16+
define i64 @get_sp() {
17+
; CHECK-LABEL: get_sp:
18+
; CHECK: # %bb.0:
19+
; CHECK-NEXT: jr $ra
20+
; CHECK-NEXT: move $2, $sp
21+
%1 = call i64 @llvm.read_register.i64(metadata !1)
22+
ret i64 %1
23+
}
1424

1525
!llvm.named.register.$28 = !{!0}
26+
!llvm.named.register.sp = !{!1}
1627

1728
!0 = !{!"$28"}
29+
!1 = !{!"sp"}
Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,29 @@
1-
; RUN: llc -mtriple=mips -relocation-model=static -mattr=+noabicalls < %s | FileCheck %s
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=mips -relocation-model=static -mattr=+noabicalls \
3+
; RUN: < %s | FileCheck %s
24

3-
define i32* @get_gp() {
4-
entry:
5-
%0 = call i32 @llvm.read_register.i32(metadata !0)
6-
%1 = inttoptr i32 %0 to i32*
7-
ret i32* %1
8-
}
5+
declare i32 @llvm.read_register.i32(metadata)
96

7+
define i32 @get_gp() {
108
; CHECK-LABEL: get_gp:
11-
; CHECK: move $2, $gp
9+
; CHECK: # %bb.0:
10+
; CHECK-NEXT: jr $ra
11+
; CHECK-NEXT: move $2, $gp
12+
%1 = call i32 @llvm.read_register.i32(metadata !0)
13+
ret i32 %1
14+
}
1215

13-
declare i32 @llvm.read_register.i32(metadata)
16+
define i32 @get_sp() {
17+
; CHECK-LABEL: get_sp:
18+
; CHECK: # %bb.0:
19+
; CHECK-NEXT: jr $ra
20+
; CHECK-NEXT: move $2, $sp
21+
%1 = call i32 @llvm.read_register.i32(metadata !1)
22+
ret i32 %1
23+
}
1424

1525
!llvm.named.register.$28 = !{!0}
26+
!llvm.named.register.sp = !{!1}
1627

1728
!0 = !{!"$28"}
29+
!1 = !{!"sp"}

0 commit comments

Comments
 (0)