Skip to content

Commit 4fb90f1

Browse files
author
git apple-llvm automerger
committed
Merge commit '51b4b17eb7e6' from llvm.org/master into apple/master
2 parents 023cd32 + 51b4b17 commit 4fb90f1

File tree

5 files changed

+110
-0
lines changed

5 files changed

+110
-0
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2894,3 +2894,22 @@ bool RISCVTargetLowering::shouldExtendTypeInLibCall(EVT Type) const {
28942894

28952895
return true;
28962896
}
2897+
2898+
#define GET_REGISTER_MATCHER
2899+
#include "RISCVGenAsmMatcher.inc"
2900+
2901+
Register
2902+
RISCVTargetLowering::getRegisterByName(const char *RegName, EVT VT,
2903+
const MachineFunction &MF) const {
2904+
Register Reg = MatchRegisterAltName(RegName);
2905+
if (Reg == RISCV::NoRegister)
2906+
Reg = MatchRegisterName(RegName);
2907+
if (Reg == RISCV::NoRegister)
2908+
report_fatal_error(
2909+
Twine("Invalid register name \"" + StringRef(RegName) + "\"."));
2910+
BitVector ReservedRegs = Subtarget.getRegisterInfo()->getReservedRegs(MF);
2911+
if (!ReservedRegs.test(Reg) && !Subtarget.isRegisterReservedByUser(Reg))
2912+
report_fatal_error(Twine("Trying to obtain non-reserved register \"" +
2913+
StringRef(RegName) + "\"."));
2914+
return Reg;
2915+
}

llvm/lib/Target/RISCV/RISCVISelLowering.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,13 @@ class RISCVTargetLowering : public TargetLowering {
147147

148148
bool shouldExtendTypeInLibCall(EVT Type) const override;
149149

150+
/// Returns the register with the specified architectural or ABI name. This
151+
/// method is necessary to lower the llvm.read_register.* and
152+
/// llvm.write_register.* intrinsics. Allocatable registers must be reserved
153+
/// with the clang -ffixed-xX flag for access to be allowed.
154+
Register getRegisterByName(const char *RegName, EVT VT,
155+
const MachineFunction &MF) const override;
156+
150157
private:
151158
void analyzeInputArgs(MachineFunction &MF, CCState &CCInfo,
152159
const SmallVectorImpl<ISD::InputArg> &Ins,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
; RUN: not llc < %s -mtriple=riscv32 2>&1 | FileCheck %s
2+
3+
define i32 @get_invalid_reg() nounwind {
4+
entry:
5+
; CHECK: Invalid register name "notareg".
6+
%reg = call i32 @llvm.read_register.i32(metadata !0)
7+
ret i32 %reg
8+
}
9+
10+
declare i32 @llvm.read_register.i32(metadata) nounwind
11+
12+
!0 = !{!"notareg\00"}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=riscv32 | FileCheck %s
3+
4+
define i32 @get_stack() nounwind {
5+
; CHECK-LABEL: get_stack:
6+
; CHECK: # %bb.0: # %entry
7+
; CHECK-NEXT: mv a0, sp
8+
; CHECK-NEXT: ret
9+
entry:
10+
%sp = call i32 @llvm.read_register.i32(metadata !0)
11+
ret i32 %sp
12+
}
13+
14+
define void @set_stack(i32 %val) nounwind {
15+
; CHECK-LABEL: set_stack:
16+
; CHECK: # %bb.0: # %entry
17+
; CHECK-NEXT: mv sp, a0
18+
; CHECK-NEXT: ret
19+
entry:
20+
call void @llvm.write_register.i32(metadata !0, i32 %val)
21+
ret void
22+
}
23+
24+
define i32 @get_tp_arch_name() nounwind {
25+
; CHECK-LABEL: get_tp_arch_name:
26+
; CHECK: # %bb.0: # %entry
27+
; CHECK-NEXT: mv a0, tp
28+
; CHECK-NEXT: ret
29+
entry:
30+
%sp = call i32 @llvm.read_register.i32(metadata !1)
31+
ret i32 %sp
32+
}
33+
34+
declare i32 @llvm.read_register.i32(metadata) nounwind
35+
declare void @llvm.write_register.i32(metadata, i32) nounwind
36+
37+
!0 = !{!"sp\00"}
38+
!1 = !{!"x4\00"}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: not llc < %s -mtriple=riscv32 -mattr +reserve-x8 2>&1 \
3+
; RUN: | FileCheck -check-prefix=NO-RESERVE-A1 %s
4+
; RUN: not llc < %s -mtriple=riscv32 -mattr +reserve-x11 2>&1 \
5+
; RUN: | FileCheck -check-prefix=NO-RESERVE-FP %s
6+
; RUN: llc < %s -mtriple=riscv32 -mattr +reserve-x8 -mattr +reserve-x11 \
7+
; RUN: | FileCheck -check-prefix=RESERVE %s
8+
9+
define i32 @get_reg_a1() nounwind {
10+
; NO-RESERVE-A1: Trying to obtain non-reserved register "a1".
11+
; RESERVE-LABEL: get_reg_a1:
12+
; RESERVE: # %bb.0: # %entry
13+
; RESERVE-NEXT: mv a0, a1
14+
; RESERVE-NEXT: ret
15+
entry:
16+
%a1 = call i32 @llvm.read_register.i32(metadata !0)
17+
ret i32 %a1
18+
}
19+
20+
define i32 @get_reg_fp() nounwind {
21+
; NO-RESERVE-FP: Trying to obtain non-reserved register "fp".
22+
; RESERVE-LABEL: get_reg_fp:
23+
; RESERVE: # %bb.0: # %entry
24+
; RESERVE-NEXT: mv a0, s0
25+
; RESERVE-NEXT: ret
26+
entry:
27+
%fp = call i32 @llvm.read_register.i32(metadata !1)
28+
ret i32 %fp
29+
}
30+
31+
declare i32 @llvm.read_register.i32(metadata) nounwind
32+
33+
!0 = !{!"a1\00"}
34+
!1 = !{!"fp\00"}

0 commit comments

Comments
 (0)