@@ -2460,11 +2460,25 @@ void SelectionDAGISel::Select_READ_REGISTER(SDNode *Op) {
24602460
24612461 EVT VT = Op->getValueType (0 );
24622462 LLT Ty = VT.isSimple () ? getLLTForMVT (VT.getSimpleVT ()) : LLT ();
2463- Register Reg =
2464- TLI->getRegisterByName (RegStr->getString ().data (), Ty,
2465- CurDAG->getMachineFunction ());
2466- SDValue New = CurDAG->getCopyFromReg (
2467- Op->getOperand (0 ), dl, Reg, Op->getValueType (0 ));
2463+
2464+ const MachineFunction &MF = CurDAG->getMachineFunction ();
2465+ Register Reg = TLI->getRegisterByName (RegStr->getString ().data (), Ty, MF);
2466+
2467+ SDValue New;
2468+ if (!Reg) {
2469+ const Function &Fn = MF.getFunction ();
2470+ Fn.getContext ().diagnose (DiagnosticInfoGenericWithLoc (
2471+ " invalid register \" " + Twine (RegStr->getString ().data ()) +
2472+ " \" for llvm.read_register" ,
2473+ Fn, Op->getDebugLoc ()));
2474+ New =
2475+ SDValue (CurDAG->getMachineNode (TargetOpcode::IMPLICIT_DEF, dl, VT), 0 );
2476+ ReplaceUses (SDValue (Op, 1 ), Op->getOperand (0 ));
2477+ } else {
2478+ New =
2479+ CurDAG->getCopyFromReg (Op->getOperand (0 ), dl, Reg, Op->getValueType (0 ));
2480+ }
2481+
24682482 New->setNodeId (-1 );
24692483 ReplaceUses (Op, New.getNode ());
24702484 CurDAG->RemoveDeadNode (Op);
@@ -2478,12 +2492,23 @@ void SelectionDAGISel::Select_WRITE_REGISTER(SDNode *Op) {
24782492 EVT VT = Op->getOperand (2 ).getValueType ();
24792493 LLT Ty = VT.isSimple () ? getLLTForMVT (VT.getSimpleVT ()) : LLT ();
24802494
2481- Register Reg = TLI->getRegisterByName (RegStr->getString ().data (), Ty,
2482- CurDAG->getMachineFunction ());
2483- SDValue New = CurDAG->getCopyToReg (
2484- Op->getOperand (0 ), dl, Reg, Op->getOperand (2 ));
2485- New->setNodeId (-1 );
2486- ReplaceUses (Op, New.getNode ());
2495+ const MachineFunction &MF = CurDAG->getMachineFunction ();
2496+ Register Reg = TLI->getRegisterByName (RegStr->getString ().data (), Ty, MF);
2497+
2498+ if (!Reg) {
2499+ const Function &Fn = MF.getFunction ();
2500+ Fn.getContext ().diagnose (DiagnosticInfoGenericWithLoc (
2501+ " invalid register \" " + Twine (RegStr->getString ().data ()) +
2502+ " \" for llvm.write_register" ,
2503+ Fn, Op->getDebugLoc ()));
2504+ ReplaceUses (SDValue (Op, 0 ), Op->getOperand (0 ));
2505+ } else {
2506+ SDValue New =
2507+ CurDAG->getCopyToReg (Op->getOperand (0 ), dl, Reg, Op->getOperand (2 ));
2508+ New->setNodeId (-1 );
2509+ ReplaceUses (Op, New.getNode ());
2510+ }
2511+
24872512 CurDAG->RemoveDeadNode (Op);
24882513}
24892514
0 commit comments