From ca33d726584c2cf169dae14a1f61328eae9e390a Mon Sep 17 00:00:00 2001 From: Vasileios Kalintiris Date: Fri, 8 May 2015 09:10:15 +0000 Subject: [PATCH] [mips] Emit the .insn directive for empty basic blocks. Summary: In microMIPS, labels need to know whether they are on code or data. This is indicated with STO_MIPS_MICROMIPS and can be inferred by being followed by instructions. For empty basic blocks, we can ensure this by emitting the .insn directive after the label. Also, this fixes some failures in our out-of-tree microMIPS buildbots, for the exception handling regression tests under: SingleSource/Regression/C++/EH Reviewers: dsanders Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D9530 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236815 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MipsAsmPrinter.cpp | 6 ++++++ lib/Target/Mips/MipsAsmPrinter.h | 1 + test/CodeGen/Mips/insn-zero-size-bb.ll | 27 ++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 test/CodeGen/Mips/insn-zero-size-bb.ll diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp index de15e6371d1..9d969330e5b 100644 --- a/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/lib/Target/Mips/MipsAsmPrinter.cpp @@ -384,6 +384,12 @@ void MipsAsmPrinter::EmitFunctionBodyEnd() { OutStreamer->EmitDataRegion(MCDR_DataRegionEnd); } +void MipsAsmPrinter::EmitBasicBlockEnd(const MachineBasicBlock &MBB) { + MipsTargetStreamer &TS = getTargetStreamer(); + if (MBB.size() == 0) + TS.emitDirectiveInsn(); +} + /// isBlockOnlyReachableByFallthough - Return true if the basic block has /// exactly one predecessor and the control transfer mechanism between /// the predecessor and this block is a fall-through. diff --git a/lib/Target/Mips/MipsAsmPrinter.h b/lib/Target/Mips/MipsAsmPrinter.h index d4c5b809960..a7f3304a3da 100644 --- a/lib/Target/Mips/MipsAsmPrinter.h +++ b/lib/Target/Mips/MipsAsmPrinter.h @@ -124,6 +124,7 @@ public: void EmitFunctionEntryLabel() override; void EmitFunctionBodyStart() override; void EmitFunctionBodyEnd() override; + void EmitBasicBlockEnd(const MachineBasicBlock &MBB) override; bool isBlockOnlyReachableByFallthrough( const MachineBasicBlock* MBB) const override; bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, diff --git a/test/CodeGen/Mips/insn-zero-size-bb.ll b/test/CodeGen/Mips/insn-zero-size-bb.ll new file mode 100644 index 00000000000..9739c6f17fa --- /dev/null +++ b/test/CodeGen/Mips/insn-zero-size-bb.ll @@ -0,0 +1,27 @@ +; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s +; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips | FileCheck %s +; RUN: llc < %s -march=mips -mcpu=mips16 | FileCheck %s + +; Verify that we emit the .insn directive for zero-sized (empty) basic blocks. +; This only really matters for microMIPS and MIPS16. + +declare i32 @foo(...) +declare void @bar() + +define void @main() { +entry: + invoke void @bar() #0 + to label %unreachable unwind label %return + +unreachable: +; CHECK: ${{.*}}: # %unreachable +; CHECK-NEXT: .insn + unreachable + +return: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @foo to i8*) + catch i8* null + ret void +} + +attributes #0 = { noreturn } -- 2.34.1