[PowerPC] PPC backend optimization on conditional trap intrustions

This patch adds PPC back end optimization to analyze the arguments of a
conditional trap instruction to execute one of the following:
1. Delete it if never trap
2. Replace it if always trap
3. Otherwise keep it

Reviewed By: nemanjai, amyk, PowerPC

Differential revision: https://reviews.llvm.org/D111434
This commit is contained in:
Victor Huang 2021-11-16 09:59:05 -06:00
parent 877d6e9b9a
commit ae27ca9a67
2 changed files with 801 additions and 0 deletions

View File

@ -378,6 +378,7 @@ static void convertUnprimedAccPHIs(const PPCInstrInfo *TII,
// Perform peephole optimizations.
bool PPCMIPeephole::simplifyCode(void) {
bool Simplified = false;
bool TrapOpt = false;
MachineInstr* ToErase = nullptr;
std::map<MachineInstr *, bool> TOCSaves;
const TargetRegisterInfo *TRI = &TII->getRegisterInfo();
@ -419,6 +420,13 @@ bool PPCMIPeephole::simplifyCode(void) {
ToErase->eraseFromParent();
ToErase = nullptr;
}
// If a conditional trap instruction got optimized to an
// unconditional trap, eliminate all the instructions between
// the trap and the terminator of the MBB.
if (TrapOpt && !MI.isTerminator()) {
ToErase = &MI;
continue;
}
// Ignore debug instructions.
if (MI.isDebugInstr())
@ -1006,6 +1014,50 @@ bool PPCMIPeephole::simplifyCode(void) {
++NumRotatesCollapsed;
break;
}
// We will replace TD/TW/TDI/TWI with an unconditional trap if it will
// always trap, we will delete the node if it will never trap.
case PPC::TDI:
case PPC::TWI:
case PPC::TD:
case PPC::TW: {
MachineInstr *LiMI1 = getVRegDefOrNull(&MI.getOperand(1), MRI);
MachineInstr *LiMI2 = getVRegDefOrNull(&MI.getOperand(2), MRI);
unsigned Opcode1 = LiMI1->getOpcode();
unsigned Opcode2 = LiMI2->getOpcode();
bool IsOperand2Immediate = MI.getOperand(2).isImm();
// We can only do the optimization if we can get immediates
// from both operands
if (!(LiMI1 && (Opcode1 == PPC::LI || Opcode1 == PPC::LI8)))
break;
if (!IsOperand2Immediate &&
!(LiMI2 && (Opcode2 == PPC::LI || Opcode2 == PPC::LI8)))
break;
auto ImmOperand0 = MI.getOperand(0).getImm();
auto ImmOperand1 = LiMI1->getOperand(1).getImm();
auto ImmOperand2 = IsOperand2Immediate ? MI.getOperand(2).getImm()
: LiMI2->getOperand(1).getImm();
// We will replace the MI with an unconditional trap if it will always
// trap.
if ((ImmOperand0 == 31) ||
((ImmOperand0 & 0x10) &&
((int64_t)ImmOperand1 < (int64_t)ImmOperand2)) ||
((ImmOperand0 & 0x8) &&
((int64_t)ImmOperand1 > (int64_t)ImmOperand2)) ||
((ImmOperand0 & 0x2) &&
((uint64_t)ImmOperand1 < (uint64_t)ImmOperand2)) ||
((ImmOperand0 & 0x1) &&
((uint64_t)ImmOperand1 > (uint64_t)ImmOperand2)) ||
((ImmOperand0 & 0x4) && (ImmOperand1 == ImmOperand2))) {
BuildMI(MBB, &MI, MI.getDebugLoc(), TII->get(PPC::TRAP));
TrapOpt = true;
}
// We will delete the MI if it will never trap.
ToErase = &MI;
Simplified = true;
break;
}
}
}
@ -1015,6 +1067,8 @@ bool PPCMIPeephole::simplifyCode(void) {
ToErase->eraseFromParent();
ToErase = nullptr;
}
// Reset TrapOpt to false at the end of the basic block.
TrapOpt = false;
}
// Eliminate all the TOC save instructions which are redundant.

View File

@ -0,0 +1,747 @@
# RUN: llc -mtriple powerpc64le-unknown-linux-gnu -mcpu=pwr8 -x mir < %s \
# RUN: -verify-machineinstrs -start-before=ppc-mi-peepholes | FileCheck %s
---
name: conditional_trap_opt_reg_implicit_def
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = IMPLICIT_DEF
%1:gprc = IMPLICIT_DEF
%2:g8rc = IMPLICIT_DEF
%3:g8rc = IMPLICIT_DEF
TW 8, %0, %1
TD 8, %2, %3
TWI 24, %0, 0
TDI 24, %2, 0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_reg_implicit_def
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: twgt 3, 3
# CHECK-NEXT: tdgt 3, 3
# CHECK-NEXT: twnei 3, 0
# CHECK-NEXT: tdnei 3, 0
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TW_31
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 3
%1:gprc = LI 0
TW 31, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TW_31
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TW_24
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 3
%1:gprc = LI 0
TW 24, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TW_24
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TW_24
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 3
%1:gprc = LI 3
TW 24, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TW_24
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TW_20
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 3
%1:gprc = LI 3
TW 20, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TW_20
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TW_20
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 3
%1:gprc = LI 5
TW 20, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TW_20
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TW_16
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 5
%1:gprc = LI 1
TW 16, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TW_16
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TW_16
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 5
%1:gprc = LI 1
TW 16, %1, %0
TW 16, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TW_16
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TW_8
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI -1
%1:gprc = LI 10
TW 8, %1, %0
TW 8, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TW_8
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TW_2
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI -1
%1:gprc = LI 2
TW 2, %1, %0
TW 2, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TW_2
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TW_1
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI -3
%1:gprc = LI 4
TW 1, %1, %0
TW 1, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TW_1
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TW_4
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 5
%1:gprc = LI 1
TW 4, %1, %0
TW 4, %1, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TW_4
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TWI_31
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 3
TWI 31, %0, 0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TWI_31
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TWI_24
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 3
TWI 24, %0, 0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TWI_24
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TWI_24
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 0
TWI 24, %0, 0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TWI_24
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TWI_20
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 3
TWI 20, %0, 3
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TWI_20
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TWI_20
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 3
TWI 20, %0, 0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TWI_20
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TWI_16
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 5
TWI 16, %0, 1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TWI_16
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TWI_16
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 5
%1:gprc = LI 1
TWI 16, %1, 5
TWI 16, %0, 1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TWI_16
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TWI_8
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI -1
%1:gprc = LI 10
TWI 8, %1, -1
TWI 8, %0, 10
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TWI_8
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TWI_2
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI -1
%1:gprc = LI 2
TWI 2, %1, -1
TWI 2, %0, 2
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TWI_2
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TWI_1
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI -3
%1:gprc = LI 4
TWI 1, %1, -3
TWI 1, %0, 4
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TWI_1
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TWI_4
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 5
%1:gprc = LI 1
TWI 4, %1, 5
TWI 4, %1, 1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TWI_4
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TD_31
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 3
%1:g8rc = LI8 0
TD 31, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TD_31
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TD_24
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 3
%1:g8rc = LI8 0
TD 24, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TD_24
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TD_24
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 3
%1:g8rc = LI8 3
TD 24, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TD_24
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TD_20
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 3
%1:g8rc = LI8 3
TD 20, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TD_20
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TD_20
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 3
%1:g8rc = LI8 5
TD 20, %1, %0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TD_20
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TD_16
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 5
%1:g8rc = LI8 1
TD 16, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TD_16
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TD_16
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 5
%1:g8rc = LI8 1
TD 16, %1, %0
TD 16, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TD_16
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TD_8
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 -1
%1:g8rc = LI8 10
TD 8, %1, %0
TD 8, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TD_8
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TD_2
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 -1
%1:g8rc = LI8 2
TD 2, %1, %0
TD 2, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TD_2
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TD_1
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 -3
%1:g8rc = LI8 4
TD 1, %1, %0
TD 1, %0, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TD_1
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TD_4
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 5
%1:g8rc = LI8 1
TD 4, %1, %0
TD 4, %1, %1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TD_4
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TDI_31
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 3
TDI 31, %0, 0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TDI_31
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TDI_24
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 3
TDI 24, %0, 0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TDI_24
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TDI_24
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 0
TDI 24, %0, 0
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TDI_24
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TDI_20
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 3
TDI 20, %0, 3
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TDI_20
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TDI_20
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 5
TDI 20, %0, 3
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TDI_20
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_no_trap_TDI_16
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 5
TDI 16, %0, 1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_no_trap_TDI_16
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TDI_16
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 5
%1:g8rc = LI8 1
TDI 16, %1, 5
TDI 16, %0, 1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TDI_16
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TDI_8
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 -1
%1:g8rc = LI8 10
TDI 8, %1, -1
TDI 8, %0, 10
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TDI_8
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TDI_2
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 -1
%1:g8rc = LI8 2
TDI 2, %1, -1
TDI 2, %0, 2
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TDI_2
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TDI_1
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 -3
%1:g8rc = LI8 4
TDI 1, %1, -3
TDI 1, %0, 4
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TDI_1
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_TDI_4
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:g8rc = LI8 5
%1:g8rc = LI8 1
TDI 4, %1, 5
TDI 4, %1, 1
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_TDI_4
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr
---
name: conditional_trap_opt_multiple_traps
alignment: 16
tracksRegLiveness: true
body: |
bb.0.entry:
%0:gprc = LI 5
%1:gprc = LI 1
%2:g8rc = LI8 -1
%3:g8rc = LI8 0
TWI 31, %1, 5
TDI 31, %3, 0
TW 31, %0, %1
TD 31, %2, %2
BLR8 implicit $lr8, implicit $rm
...
# CHECK-LABEL: conditional_trap_opt_multiple_traps
# CHECK: # %bb.0: # %entry
# CHECK-NEXT: trap
# CHECK-NEXT: blr