@@ -738,32 +738,52 @@ SDValue LoongArchTargetLowering::PerformDAGCombine(SDNode *N,
738
738
}
739
739
740
740
static MachineBasicBlock *insertDivByZeroTrap (MachineInstr &MI,
741
- MachineBasicBlock &MBB,
742
- const TargetInstrInfo &TII) {
741
+ MachineBasicBlock *MBB) {
743
742
if (!ZeroDivCheck)
744
- return & MBB;
743
+ return MBB;
745
744
746
745
// Build instructions:
746
+ // MBB:
747
747
// div(or mod) $dst, $dividend, $divisor
748
- // bnez $divisor, 8
749
- // break 7
748
+ // bnez $divisor, SinkMBB
749
+ // BreakMBB:
750
+ // break 7 // BRK_DIVZERO
751
+ // SinkMBB:
750
752
// fallthrough
753
+ const BasicBlock *LLVM_BB = MBB->getBasicBlock ();
754
+ MachineFunction::iterator It = ++MBB->getIterator ();
755
+ MachineFunction *MF = MBB->getParent ();
756
+ auto BreakMBB = MF->CreateMachineBasicBlock (LLVM_BB);
757
+ auto SinkMBB = MF->CreateMachineBasicBlock (LLVM_BB);
758
+ MF->insert (It, BreakMBB);
759
+ MF->insert (It, SinkMBB);
760
+
761
+ // Transfer the remainder of MBB and its successor edges to SinkMBB.
762
+ SinkMBB->splice (SinkMBB->end (), MBB, std::next (MI.getIterator ()), MBB->end ());
763
+ SinkMBB->transferSuccessorsAndUpdatePHIs (MBB);
764
+
765
+ const TargetInstrInfo &TII = *MF->getSubtarget ().getInstrInfo ();
766
+ DebugLoc DL = MI.getDebugLoc ();
751
767
MachineOperand &Divisor = MI.getOperand (2 );
752
- auto FallThrough = std::next (MI. getIterator () );
768
+ Register DivisorReg = Divisor. getReg ( );
753
769
754
- BuildMI (MBB, FallThrough, MI.getDebugLoc (), TII.get (LoongArch::BNEZ))
755
- .addReg (Divisor.getReg (), getKillRegState (Divisor.isKill ()))
756
- .addImm (8 );
770
+ // MBB:
771
+ BuildMI (MBB, DL, TII.get (LoongArch::BNEZ))
772
+ .addReg (DivisorReg, getKillRegState (Divisor.isKill ()))
773
+ .addMBB (SinkMBB);
774
+ MBB->addSuccessor (BreakMBB);
775
+ MBB->addSuccessor (SinkMBB);
757
776
777
+ // BreakMBB:
758
778
// See linux header file arch/loongarch/include/uapi/asm/break.h for the
759
779
// definition of BRK_DIVZERO.
760
- BuildMI (MBB, FallThrough, MI. getDebugLoc (), TII.get (LoongArch::BREAK))
761
- . addImm ( 7 /* BRK_DIVZERO */ );
780
+ BuildMI (BreakMBB, DL, TII.get (LoongArch::BREAK)). addImm ( 7 /* BRK_DIVZERO */ );
781
+ BreakMBB-> addSuccessor (SinkMBB );
762
782
763
783
// Clear Divisor's kill flag.
764
784
Divisor.setIsKill (false );
765
785
766
- return &MBB ;
786
+ return SinkMBB ;
767
787
}
768
788
769
789
MachineBasicBlock *LoongArchTargetLowering::EmitInstrWithCustomInserter (
@@ -780,7 +800,7 @@ MachineBasicBlock *LoongArchTargetLowering::EmitInstrWithCustomInserter(
780
800
case LoongArch::DIV_DU:
781
801
case LoongArch::MOD_D:
782
802
case LoongArch::MOD_DU:
783
- return insertDivByZeroTrap (MI, *BB, *Subtarget. getInstrInfo () );
803
+ return insertDivByZeroTrap (MI, BB );
784
804
break ;
785
805
}
786
806
}
0 commit comments