From c80ed278312095e47201cf352ef525975ff9ee4c Mon Sep 17 00:00:00 2001 From: Petar Avramovic Date: Thu, 5 Sep 2019 11:16:37 +0000 Subject: [PATCH] [MIPS GlobalISel] Select llvm.trap intrinsic Select G_INTRINSIC_W_SIDE_EFFECTS for Intrinsic::trap for MIPS32 via legalizeIntrinsic. Differential Revision: https://reviews.llvm.org/D67180 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@371055 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MipsLegalizerInfo.cpp | 15 ++++++++++++- .../Mips/GlobalISel/legalizer/trap.mir | 22 +++++++++++++++++++ test/CodeGen/Mips/GlobalISel/llvm-ir/trap.ll | 14 ++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/Mips/GlobalISel/legalizer/trap.mir create mode 100644 test/CodeGen/Mips/GlobalISel/llvm-ir/trap.ll diff --git a/lib/Target/Mips/MipsLegalizerInfo.cpp b/lib/Target/Mips/MipsLegalizerInfo.cpp index d4de79c10a2..80a24a3ab42 100644 --- a/lib/Target/Mips/MipsLegalizerInfo.cpp +++ b/lib/Target/Mips/MipsLegalizerInfo.cpp @@ -219,8 +219,16 @@ bool MipsLegalizerInfo::legalizeCustom(MachineInstr &MI, return true; } -bool MipsLegalizerInfo::legalizeIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI, +bool MipsLegalizerInfo::legalizeIntrinsic(MachineInstr &MI, + MachineRegisterInfo &MRI, MachineIRBuilder &MIRBuilder) const { + const MipsSubtarget &ST = + static_cast(MI.getMF()->getSubtarget()); + const MipsInstrInfo &TII = *ST.getInstrInfo(); + const MipsRegisterInfo &TRI = *ST.getRegisterInfo(); + const RegisterBankInfo &RBI = *ST.getRegBankInfo(); + MIRBuilder.setInstr(MI); + switch (MI.getIntrinsicID()) { case Intrinsic::memcpy: case Intrinsic::memset: @@ -230,6 +238,11 @@ bool MipsLegalizerInfo::legalizeIntrinsic(MachineInstr &MI, MachineRegisterInfo return false; MI.eraseFromParent(); return true; + case Intrinsic::trap: { + MachineInstr *Trap = MIRBuilder.buildInstr(Mips::TRAP); + MI.eraseFromParent(); + return constrainSelectedInstRegOperands(*Trap, TII, TRI, RBI); + } default: break; } diff --git a/test/CodeGen/Mips/GlobalISel/legalizer/trap.mir b/test/CodeGen/Mips/GlobalISel/legalizer/trap.mir new file mode 100644 index 00000000000..101a12490b7 --- /dev/null +++ b/test/CodeGen/Mips/GlobalISel/legalizer/trap.mir @@ -0,0 +1,22 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -O0 -mtriple=mipsel-linux-gnu -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=MIPS32 +--- | + + declare void @llvm.trap() + define void @f() { ret void } + +... +--- +name: f +alignment: 2 +body: | + bb.1 (%ir-block.0): + ; MIPS32-LABEL: name: f + ; MIPS32: TRAP + ; MIPS32: RetRA + G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.trap) + RetRA + +... + + diff --git a/test/CodeGen/Mips/GlobalISel/llvm-ir/trap.ll b/test/CodeGen/Mips/GlobalISel/llvm-ir/trap.ll new file mode 100644 index 00000000000..cf71f5f5677 --- /dev/null +++ b/test/CodeGen/Mips/GlobalISel/llvm-ir/trap.ll @@ -0,0 +1,14 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -O0 -mtriple=mipsel-linux-gnu -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32 + + declare void @llvm.trap() + + define void @f() { +; MIPS32-LABEL: f: +; MIPS32: # %bb.0: +; MIPS32-NEXT: break +; MIPS32-NEXT: jr $ra +; MIPS32-NEXT: nop + call void @llvm.trap() + ret void + }