Skip to content

Commit b4cf014

Browse files
authored
[RISCV][GISel] Select trap and debugtrap. (#73171)
1 parent be1e8a6 commit b4cf014

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ class RISCVInstructionSelector : public InstructionSelector {
7171
MachineRegisterInfo &MRI) const;
7272
bool selectFPCompare(MachineInstr &MI, MachineIRBuilder &MIB,
7373
MachineRegisterInfo &MRI) const;
74+
bool selectIntrinsicWithSideEffects(MachineInstr &MI, MachineIRBuilder &MIB,
75+
MachineRegisterInfo &MRI) const;
7476

7577
ComplexRendererFns selectShiftMask(MachineOperand &Root) const;
7678
ComplexRendererFns selectAddrRegImm(MachineOperand &Root) const;
@@ -608,6 +610,8 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
608610
return selectSelect(MI, MIB, MRI);
609611
case TargetOpcode::G_FCMP:
610612
return selectFPCompare(MI, MIB, MRI);
613+
case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
614+
return selectIntrinsicWithSideEffects(MI, MIB, MRI);
611615
default:
612616
return false;
613617
}
@@ -1060,6 +1064,29 @@ bool RISCVInstructionSelector::selectFPCompare(MachineInstr &MI,
10601064
return true;
10611065
}
10621066

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+
10631090
namespace llvm {
10641091
InstructionSelector *
10651092
createRISCVInstructionSelector(const RISCVTargetMachine &TM,
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_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -run-pass=instruction-select -simplify-mir \
3+
# RUN: -verify-machineinstrs %s -o - | FileCheck %s
4+
# RUN: llc -mtriple=riscv64 -run-pass=instruction-select -simplify-mir \
5+
# RUN: -verify-machineinstrs %s -o - | FileCheck %s
6+
7+
---
8+
name: test_trap
9+
legalized: true
10+
regBankSelected: true
11+
tracksRegLiveness: true
12+
body: |
13+
bb.1:
14+
; CHECK-LABEL: name: test_trap
15+
; CHECK: UNIMP
16+
; CHECK-NEXT: PseudoRET
17+
G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.trap)
18+
PseudoRET
19+
20+
...
21+
---
22+
name: test_debugtrap
23+
legalized: true
24+
regBankSelected: true
25+
tracksRegLiveness: true
26+
body: |
27+
bb.1:
28+
; CHECK-LABEL: name: test_debugtrap
29+
; CHECK: EBREAK
30+
; CHECK-NEXT: PseudoRET
31+
G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.debugtrap)
32+
PseudoRET
33+
34+
...

0 commit comments

Comments
 (0)