From c63c935a8009f7ae33f7d1c4279f51f526184021 Mon Sep 17 00:00:00 2001 From: Zoran Jovanovic Date: Mon, 10 Nov 2014 17:27:56 +0000 Subject: [PATCH] [mips][microMIPS] Fix issue with delay slot filler and microMIPS Differential Revision: http://reviews.llvm.org/D6193 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221612 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MipsDelaySlotFiller.cpp | 30 ++++++++++++++--------- test/CodeGen/Mips/micromips-delay-slot.ll | 18 ++++++++++++++ 2 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 test/CodeGen/Mips/micromips-delay-slot.ll diff --git a/lib/Target/Mips/MipsDelaySlotFiller.cpp b/lib/Target/Mips/MipsDelaySlotFiller.cpp index f8daec9e50f..9ac62b0df7d 100644 --- a/lib/Target/Mips/MipsDelaySlotFiller.cpp +++ b/lib/Target/Mips/MipsDelaySlotFiller.cpp @@ -497,24 +497,32 @@ getUnderlyingObjects(const MachineInstr &MI, /// We assume there is only one delay slot per delayed instruction. bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) { bool Changed = false; + bool InMicroMipsMode = TM.getSubtarget().inMicroMipsMode(); for (Iter I = MBB.begin(); I != MBB.end(); ++I) { if (!hasUnoccupiedSlot(&*I)) continue; - ++FilledSlots; - Changed = true; + // For microMIPS, at the moment, do not fill delay slots of call + // instructions. + // + // TODO: Support for replacing regular call instructions with corresponding + // short delay slot instructions should be implemented. + if (!InMicroMipsMode || !I->isCall()) { + ++FilledSlots; + Changed = true; - // Delay slot filling is disabled at -O0. - if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None)) { - if (searchBackward(MBB, I)) - continue; - - if (I->isTerminator()) { - if (searchSuccBBs(MBB, I)) + // Delay slot filling is disabled at -O0. + if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None)) { + if (searchBackward(MBB, I)) continue; - } else if (searchForward(MBB, I)) { - continue; + + if (I->isTerminator()) { + if (searchSuccBBs(MBB, I)) + continue; + } else if (searchForward(MBB, I)) { + continue; + } } } diff --git a/test/CodeGen/Mips/micromips-delay-slot.ll b/test/CodeGen/Mips/micromips-delay-slot.ll new file mode 100644 index 00000000000..4bab97aab08 --- /dev/null +++ b/test/CodeGen/Mips/micromips-delay-slot.ll @@ -0,0 +1,18 @@ +; RUN: llc -march=mipsel -mcpu=mips32r2 -mattr=+micromips \ +; RUN: -relocation-model=pic -O3 < %s | FileCheck %s + +; Function Attrs: nounwind uwtable +define i32 @foo(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + %0 = load i32* %a.addr, align 4 + %shl = shl i32 %0, 2 + %call = call i32 @bar(i32 %shl) + ret i32 %call +} + +declare i32 @bar(i32) #1 + +; CHECK: nop +