@@ -71,6 +71,8 @@ class RISCVInstructionSelector : public InstructionSelector {
71
71
MachineRegisterInfo &MRI) const ;
72
72
bool selectFPCompare (MachineInstr &MI, MachineIRBuilder &MIB,
73
73
MachineRegisterInfo &MRI) const ;
74
+ bool selectIntrinsicWithSideEffects (MachineInstr &MI, MachineIRBuilder &MIB,
75
+ MachineRegisterInfo &MRI) const ;
74
76
75
77
ComplexRendererFns selectShiftMask (MachineOperand &Root) const ;
76
78
ComplexRendererFns selectAddrRegImm (MachineOperand &Root) const ;
@@ -608,6 +610,8 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
608
610
return selectSelect (MI, MIB, MRI);
609
611
case TargetOpcode::G_FCMP:
610
612
return selectFPCompare (MI, MIB, MRI);
613
+ case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
614
+ return selectIntrinsicWithSideEffects (MI, MIB, MRI);
611
615
default :
612
616
return false ;
613
617
}
@@ -1060,6 +1064,29 @@ bool RISCVInstructionSelector::selectFPCompare(MachineInstr &MI,
1060
1064
return true ;
1061
1065
}
1062
1066
1067
+ bool RISCVInstructionSelector::selectIntrinsicWithSideEffects (
1068
+ MachineInstr &MI, MachineIRBuilder &MIB, MachineRegisterInfo &MRI) const {
1069
+ assert (MI.getOpcode () == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS &&
1070
+ " Unexpected opcode" );
1071
+ // Find the intrinsic ID.
1072
+ unsigned IntrinID = cast<GIntrinsic>(MI).getIntrinsicID ();
1073
+
1074
+ // Select the instruction.
1075
+ switch (IntrinID) {
1076
+ default :
1077
+ return false ;
1078
+ case Intrinsic::trap:
1079
+ MIB.buildInstr (RISCV::UNIMP, {}, {});
1080
+ break ;
1081
+ case Intrinsic::debugtrap:
1082
+ MIB.buildInstr (RISCV::EBREAK, {}, {});
1083
+ break ;
1084
+ }
1085
+
1086
+ MI.eraseFromParent ();
1087
+ return true ;
1088
+ }
1089
+
1063
1090
namespace llvm {
1064
1091
InstructionSelector *
1065
1092
createRISCVInstructionSelector (const RISCVTargetMachine &TM,
0 commit comments