From d7a71bf354d2ef1d38812d04cbab9663ed6b115e Mon Sep 17 00:00:00 2001 From: Simon Dardis Date: Tue, 4 Apr 2017 11:28:53 +0000 Subject: [PATCH] [mips] Deal with empty blocks in the mips hazard scheduler This patch teaches the hazard scheduler how to handle empty blocks when search for the next real instruction when dealing with forbidden slots. Reviewers: slthakur Differential Revision: https://reviews.llvm.org/D31293 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299427 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MipsHazardSchedule.cpp | 25 ++--- .../Mips/compactbranches/empty-block.mir | 92 +++++++++++++++++++ 2 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 test/CodeGen/Mips/compactbranches/empty-block.mir diff --git a/lib/Target/Mips/MipsHazardSchedule.cpp b/lib/Target/Mips/MipsHazardSchedule.cpp index 87446e38aca..f6fcf6ec938 100644 --- a/lib/Target/Mips/MipsHazardSchedule.cpp +++ b/lib/Target/Mips/MipsHazardSchedule.cpp @@ -103,23 +103,24 @@ static Iter getNextMachineInstrInBB(Iter Position) { // Find the next real instruction from the current position, looking through // basic block boundaries. -static Iter getNextMachineInstr(Iter Position, MachineBasicBlock *Parent) { +static std::pair getNextMachineInstr(Iter Position, MachineBasicBlock * Parent) { if (Position == Parent->end()) { - MachineBasicBlock *Succ = Parent->getNextNode(); - if (Succ != nullptr && Parent->isSuccessor(Succ)) { - Position = Succ->begin(); - Parent = Succ; - } else { - llvm_unreachable( - "Should have identified the end of the function earlier!"); - } + do { + MachineBasicBlock *Succ = Parent->getNextNode(); + if (Succ != nullptr && Parent->isSuccessor(Succ)) { + Position = Succ->begin(); + Parent = Succ; + } else { + return std::make_pair(Position, true); + } + } while (Parent->empty()); } Iter Instr = getNextMachineInstrInBB(Position); if (Instr == Parent->end()) { return getNextMachineInstr(Instr, Parent); } - return Instr; + return std::make_pair(Instr, false); } bool MipsHazardSchedule::runOnMachineFunction(MachineFunction &MF) { @@ -145,7 +146,9 @@ bool MipsHazardSchedule::runOnMachineFunction(MachineFunction &MF) { bool LastInstInFunction = std::next(I) == FI->end() && std::next(FI) == MF.end(); if (!LastInstInFunction) { - Inst = getNextMachineInstr(std::next(I), &*FI); + std::pair Res = getNextMachineInstr(std::next(I), &*FI); + LastInstInFunction |= Res.second; + Inst = Res.first; } if (LastInstInFunction || !TII->SafeInForbiddenSlot(*Inst)) { diff --git a/test/CodeGen/Mips/compactbranches/empty-block.mir b/test/CodeGen/Mips/compactbranches/empty-block.mir new file mode 100644 index 00000000000..7831e51e315 --- /dev/null +++ b/test/CodeGen/Mips/compactbranches/empty-block.mir @@ -0,0 +1,92 @@ +# RUN: llc -march=mipsel -mcpu=mips32r6 -start-after=block-placement %s -o - | FileCheck %s + +# Check that empty blocks in the cfg don't cause the mips hazard scheduler to +# crash and that the nop is inserted correctly. + +# CHECK: blezc +# CHECK: nop +# CHECK: # BB#1: +# CHECK: .insn +# CHECK: # BB#2: +# CHECK: .insn +# CHECK: # BB#3: +# CHECK: jal + +--- | + ; ModuleID = '' + source_filename = "" + target datalayout = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" + + declare i32 @k() + + declare void @f(i32) + + define void @l5() { + entry: + %call = tail call i32 @k() + %cmp = icmp sgt i32 %call, 0 + br i1 %cmp, label %if.then, label %if.end + + if.then: ; preds = %entry + tail call void @f(i32 signext 2) + br label %if.end + + if.end: ; preds = %if.then, %entry + ret void + } + +--- +name: l5 +alignment: 2 +exposesReturnsTwice: false +noVRegs: true +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 24 + offsetAdjustment: 0 + maxAlignment: 4 + adjustsStack: true + hasCalls: true + maxCallFrameSize: 16 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false +stack: + - { id: 0, type: spill-slot, offset: -4, size: 4, alignment: 4, callee-saved-register: '%ra' } +body: | + bb.0.entry: + successors: %bb.1.if.then(0x50000000), %bb.4.if.end(0x30000000) + liveins: %ra + + %sp = ADDiu %sp, -24 + CFI_INSTRUCTION def_cfa_offset 24 + SW killed %ra, %sp, 20 :: (store 4 into %stack.0) + CFI_INSTRUCTION offset %ra_64, -4 + JAL @k, csr_o32_fp64, implicit-def dead %ra, implicit-def %sp, implicit-def %v0 + BLEZ %v0, %bb.4.if.end, implicit-def %at + + bb.1.if.then: + successors: %bb.2.if.then(0x80000000) + + bb.2.if.then: + successors: %bb.3.if.then(0x80000000) + + bb.3.if.then: + successors: %bb.4.if.end(0x80000000) + + %a0 = ADDiu %zero, 2 + JAL @f, csr_o32_fp64, implicit-def dead %ra, implicit killed %a0, implicit-def %sp + + bb.4.if.end: + %ra = LW %sp, 20 :: (load 4 from %stack.0) + %sp = ADDiu %sp, 24 + PseudoReturn undef %ra + +... -- 2.40.0