Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9107,8 +9107,18 @@ LegalizerHelper::lowerReadWriteRegister(MachineInstr &MI) {
cast<MDNode>(MI.getOperand(NameOpIdx).getMetadata())->getOperand(0));

Register PhysReg = TLI.getRegisterByName(RegStr->getString().data(), Ty, MF);
if (!PhysReg.isValid())
return UnableToLegalize;
if (!PhysReg) {
const Function &Fn = MF.getFunction();
Fn.getContext().diagnose(DiagnosticInfoGenericWithLoc(
"invalid register \"" + Twine(RegStr->getString().data()) + "\" for " +
(IsRead ? "llvm.read_register" : "llvm.write_register"),
Fn, MI.getDebugLoc()));
if (IsRead)
MIRBuilder.buildUndef(ValReg);

MI.eraseFromParent();
return Legalized;
}

if (IsRead)
MIRBuilder.buildCopy(ValReg, PhysReg);
Expand Down
47 changes: 36 additions & 11 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2460,11 +2460,25 @@ void SelectionDAGISel::Select_READ_REGISTER(SDNode *Op) {

EVT VT = Op->getValueType(0);
LLT Ty = VT.isSimple() ? getLLTForMVT(VT.getSimpleVT()) : LLT();
Register Reg =
TLI->getRegisterByName(RegStr->getString().data(), Ty,
CurDAG->getMachineFunction());
SDValue New = CurDAG->getCopyFromReg(
Op->getOperand(0), dl, Reg, Op->getValueType(0));

const MachineFunction &MF = CurDAG->getMachineFunction();
Register Reg = TLI->getRegisterByName(RegStr->getString().data(), Ty, MF);

SDValue New;
if (!Reg) {
const Function &Fn = MF.getFunction();
Fn.getContext().diagnose(DiagnosticInfoGenericWithLoc(
"invalid register \"" + Twine(RegStr->getString().data()) +
"\" for llvm.read_register",
Fn, Op->getDebugLoc()));
New =
SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, dl, VT), 0);
ReplaceUses(SDValue(Op, 1), Op->getOperand(0));
} else {
New =
CurDAG->getCopyFromReg(Op->getOperand(0), dl, Reg, Op->getValueType(0));
}

New->setNodeId(-1);
ReplaceUses(Op, New.getNode());
CurDAG->RemoveDeadNode(Op);
Expand All @@ -2478,12 +2492,23 @@ void SelectionDAGISel::Select_WRITE_REGISTER(SDNode *Op) {
EVT VT = Op->getOperand(2).getValueType();
LLT Ty = VT.isSimple() ? getLLTForMVT(VT.getSimpleVT()) : LLT();

Register Reg = TLI->getRegisterByName(RegStr->getString().data(), Ty,
CurDAG->getMachineFunction());
SDValue New = CurDAG->getCopyToReg(
Op->getOperand(0), dl, Reg, Op->getOperand(2));
New->setNodeId(-1);
ReplaceUses(Op, New.getNode());
const MachineFunction &MF = CurDAG->getMachineFunction();
Register Reg = TLI->getRegisterByName(RegStr->getString().data(), Ty, MF);

if (!Reg) {
const Function &Fn = MF.getFunction();
Fn.getContext().diagnose(DiagnosticInfoGenericWithLoc(
"invalid register \"" + Twine(RegStr->getString().data()) +
"\" for llvm.write_register",
Fn, Op->getDebugLoc()));
ReplaceUses(SDValue(Op, 0), Op->getOperand(0));
} else {
SDValue New =
CurDAG->getCopyToReg(Op->getOperand(0), dl, Reg, Op->getOperand(2));
New->setNodeId(-1);
ReplaceUses(Op, New.getNode());
}

CurDAG->RemoveDeadNode(Op);
}

Expand Down
7 changes: 2 additions & 5 deletions llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11977,12 +11977,9 @@ getRegisterByName(const char* RegName, LLT VT, const MachineFunction &MF) const
unsigned DwarfRegNum = MRI->getDwarfRegNum(Reg, false);
if (!Subtarget->isXRegisterReserved(DwarfRegNum) &&
!MRI->isReservedReg(MF, Reg))
Reg = 0;
Reg = Register();
}
if (Reg)
return Reg;
report_fatal_error(Twine("Invalid register name \""
+ StringRef(RegName) + "\"."));
return Reg;
}

SDValue AArch64TargetLowering::LowerADDROFRETURNADDR(SDValue Op,
Expand Down
7 changes: 2 additions & 5 deletions llvm/lib/Target/AMDGPU/SIISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4492,11 +4492,8 @@ Register SITargetLowering::getRegisterByName(const char *RegName, LLT VT,
.Case("flat_scratch_lo", AMDGPU::FLAT_SCR_LO)
.Case("flat_scratch_hi", AMDGPU::FLAT_SCR_HI)
.Default(Register());

if (Reg == AMDGPU::NoRegister) {
report_fatal_error(
Twine("invalid register name \"" + StringRef(RegName) + "\"."));
}
if (!Reg)
return Reg;

if (!Subtarget->hasFlatScrRegister() &&
Subtarget->getRegisterInfo()->regsOverlap(Reg, AMDGPU::FLAT_SCR)) {
Expand Down
10 changes: 3 additions & 7 deletions llvm/lib/Target/ARM/ARMISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6166,13 +6166,9 @@ SDValue ARMTargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
// this table could be generated automatically from RegInfo.
Register ARMTargetLowering::getRegisterByName(const char* RegName, LLT VT,
const MachineFunction &MF) const {
Register Reg = StringSwitch<unsigned>(RegName)
.Case("sp", ARM::SP)
.Default(0);
if (Reg)
return Reg;
report_fatal_error(Twine("Invalid register name \""
+ StringRef(RegName) + "\"."));
return StringSwitch<Register>(RegName)
.Case("sp", ARM::SP)
.Default(Register());
}

// Result is 64 bit value so split into two 32 bit values and return as a
Expand Down
5 changes: 1 addition & 4 deletions llvm/lib/Target/Hexagon/HexagonISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -329,10 +329,7 @@ Register HexagonTargetLowering::getRegisterByName(
.Case("cs0", Hexagon::CS0)
.Case("cs1", Hexagon::CS1)
.Default(Register());
if (Reg)
return Reg;

report_fatal_error("Invalid register name global variable");
return Reg;
}

/// LowerCallResult - Lower the result values of an ISD::CALL into the
Expand Down
9 changes: 3 additions & 6 deletions llvm/lib/Target/Lanai/LanaiISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ Register LanaiTargetLowering::getRegisterByName(
const char *RegName, LLT /*VT*/,
const MachineFunction & /*MF*/) const {
// Only unallocatable registers should be matched here.
Register Reg = StringSwitch<unsigned>(RegName)
Register Reg = StringSwitch<Register>(RegName)
.Case("pc", Lanai::PC)
.Case("sp", Lanai::SP)
.Case("fp", Lanai::FP)
Expand All @@ -220,11 +220,8 @@ Register LanaiTargetLowering::getRegisterByName(
.Case("rr2", Lanai::RR2)
.Case("r11", Lanai::R11)
.Case("rca", Lanai::RCA)
.Default(0);

if (Reg)
return Reg;
report_fatal_error("Invalid register name global variable");
.Default(Register());
return Reg;
}

std::pair<unsigned, const TargetRegisterClass *>
Expand Down
7 changes: 3 additions & 4 deletions llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7957,11 +7957,10 @@ LoongArchTargetLowering::getRegisterByName(const char *RegName, LLT VT,
std::pair<StringRef, StringRef> Name = StringRef(RegName).split('$');
std::string NewRegName = Name.second.str();
Register Reg = MatchRegisterAltName(NewRegName);
if (Reg == LoongArch::NoRegister)
if (!Reg)
Reg = MatchRegisterName(NewRegName);
if (Reg == LoongArch::NoRegister)
report_fatal_error(
Twine("Invalid register name \"" + StringRef(RegName) + "\"."));
if (!Reg)
return Reg;
BitVector ReservedRegs = Subtarget.getRegisterInfo()->getReservedRegs(MF);
if (!ReservedRegs.test(Reg))
report_fatal_error(Twine("Trying to obtain non-reserved register \"" +
Expand Down
17 changes: 7 additions & 10 deletions llvm/lib/Target/Mips/MipsISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4969,17 +4969,14 @@ MipsTargetLowering::getRegisterByName(const char *RegName, LLT VT,
.Case("$28", Mips::GP_64)
.Case("sp", Mips::SP_64)
.Default(Register());
if (Reg)
return Reg;
} else {
Register Reg = StringSwitch<Register>(RegName)
.Case("$28", Mips::GP)
.Case("sp", Mips::SP)
.Default(Register());
if (Reg)
return Reg;
return Reg;
}
report_fatal_error("Invalid register name global variable");

Register Reg = StringSwitch<Register>(RegName)
.Case("$28", Mips::GP)
.Case("sp", Mips::SP)
.Default(Register());
return Reg;
}

MachineBasicBlock *MipsTargetLowering::emitLDR_W(MachineInstr &MI,
Expand Down
3 changes: 1 addition & 2 deletions llvm/lib/Target/PowerPC/PPCISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17984,8 +17984,7 @@ Register PPCTargetLowering::getRegisterByName(const char *RegName, LLT VT,

Register Reg = MatchRegisterName(RegName);
if (!Reg)
report_fatal_error(
Twine("Invalid global name register \"" + StringRef(RegName) + "\"."));
return Reg;

// FIXME: Unable to generate code for `-O2` but okay for `-O0`.
// Need followup investigation as to why.
Expand Down
8 changes: 4 additions & 4 deletions llvm/lib/Target/RISCV/RISCVISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24563,11 +24563,11 @@ Register
RISCVTargetLowering::getRegisterByName(const char *RegName, LLT VT,
const MachineFunction &MF) const {
Register Reg = MatchRegisterAltName(RegName);
if (Reg == RISCV::NoRegister)
if (!Reg)
Reg = MatchRegisterName(RegName);
if (Reg == RISCV::NoRegister)
report_fatal_error(
Twine("Invalid register name \"" + StringRef(RegName) + "\"."));
if (!Reg)
return Reg;

BitVector ReservedRegs = Subtarget.getRegisterInfo()->getReservedRegs(MF);
if (!ReservedRegs.test(Reg) && !Subtarget.isRegisterReservedByUser(Reg))
report_fatal_error(Twine("Trying to obtain non-reserved register \"" +
Expand Down
7 changes: 2 additions & 5 deletions llvm/lib/Target/Sparc/SparcISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1162,12 +1162,9 @@ Register SparcTargetLowering::getRegisterByName(const char* RegName, LLT VT,
// make sure that said register is in the reserve list.
const SparcRegisterInfo *TRI = Subtarget->getRegisterInfo();
if (!TRI->isReservedReg(MF, Reg))
Reg = 0;
Reg = Register();

if (Reg)
return Reg;

report_fatal_error("Invalid register name global variable");
return Reg;
}

// Fixup floating point arguments in the ... part of a varargs call.
Expand Down
6 changes: 2 additions & 4 deletions llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1713,11 +1713,9 @@ SystemZTargetLowering::getRegisterByName(const char *RegName, LLT VT,
: SystemZ::NoRegister)
.Case("r15",
Subtarget.isTargetELF() ? SystemZ::R15D : SystemZ::NoRegister)
.Default(SystemZ::NoRegister);
.Default(Register());

if (Reg)
return Reg;
report_fatal_error("Invalid register name global variable");
return Reg;
}

Register SystemZTargetLowering::getExceptionPointerRegister(
Expand Down
8 changes: 2 additions & 6 deletions llvm/lib/Target/VE/VEISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -563,12 +563,8 @@ Register VETargetLowering::getRegisterByName(const char *RegName, LLT VT,
.Case("info", VE::SX17) // Info area register
.Case("got", VE::SX15) // Global offset table register
.Case("plt", VE::SX16) // Procedure linkage table register
.Default(0);

if (Reg)
return Reg;

report_fatal_error("Invalid register name global variable");
.Default(Register());
return Reg;
}

//===----------------------------------------------------------------------===//
Expand Down
5 changes: 1 addition & 4 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28312,10 +28312,7 @@ Register X86TargetLowering::getRegisterByName(const char* RegName, LLT VT,
#endif
}

if (Reg)
return Reg;

report_fatal_error("Invalid register name global variable");
return Reg;
}

SDValue X86TargetLowering::LowerFRAME_TO_ARGS_OFFSET(SDValue Op,
Expand Down
8 changes: 4 additions & 4 deletions llvm/test/CodeGen/AArch64/arm64-named-reg-alloc.ll
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
; RUN: not --crash llc < %s -mtriple=arm64-apple-darwin 2>&1 | FileCheck %s
; RUN: not --crash llc < %s -mtriple=arm64-linux-gnueabi 2>&1 | FileCheck %s
; RUN: not llc < %s -mtriple=arm64-apple-darwin -filetype=null 2>&1 | FileCheck %s
; RUN: not llc < %s -mtriple=arm64-linux-gnueabi -filetype=null 2>&1 | FileCheck %s

define i32 @get_stack() nounwind {
entry:
; FIXME: Include an allocatable-specific error message
; CHECK: Invalid register name "x5".
%sp = call i32 @llvm.read_register.i32(metadata !0)
; CHECK: error: <unknown>:0:0: invalid register "x5" for llvm.read_register
%sp = call i32 @llvm.read_register.i32(metadata !0)
ret i32 %sp
}

Expand Down
8 changes: 4 additions & 4 deletions llvm/test/CodeGen/AArch64/arm64-named-reg-notareg.ll
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
; RUN: not --crash llc < %s -mtriple=arm64-apple-darwin 2>&1 | FileCheck %s
; RUN: not --crash llc < %s -mtriple=arm64-linux-gnueabi 2>&1 | FileCheck %s
; RUN: not llc < %s -mtriple=arm64-apple-darwin 2>&1 | FileCheck %s
; RUN: not llc < %s -mtriple=arm64-linux-gnueabi 2>&1 | FileCheck %s

define i32 @get_stack() nounwind {
entry:
; CHECK: Invalid register name "notareg".
%sp = call i32 @llvm.read_register.i32(metadata !0)
; CHECK: error: <unknown>:0:0: invalid register "notareg" for llvm.read_register
%sp = call i32 @llvm.read_register.i32(metadata !0)
ret i32 %sp
}

Expand Down
Loading
Loading