[PATCH] [mips] Emit the .insn directive for empty basic blocks.

Vasileios Kalintiris Vasileios.Kalintiris at imgtec.com
Wed May 6 08:26:07 PDT 2015


Hi dsanders,

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 MIPS buildbots, for the
exception handling regression tests under: SingleSource/Regression/C++/EH

http://reviews.llvm.org/D9530

Files:
  lib/Target/Mips/MipsAsmPrinter.cpp
  lib/Target/Mips/MipsAsmPrinter.h
  test/CodeGen/Mips/insn-zero-size-bb.ll

Index: lib/Target/Mips/MipsAsmPrinter.cpp
===================================================================
--- lib/Target/Mips/MipsAsmPrinter.cpp
+++ lib/Target/Mips/MipsAsmPrinter.cpp
@@ -384,6 +384,12 @@
   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.
Index: lib/Target/Mips/MipsAsmPrinter.h
===================================================================
--- lib/Target/Mips/MipsAsmPrinter.h
+++ lib/Target/Mips/MipsAsmPrinter.h
@@ -124,6 +124,7 @@
   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,
Index: test/CodeGen/Mips/insn-zero-size-bb.ll
===================================================================
--- /dev/null
+++ 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 when we are in micromips or mips16, we do emit the .insn
+; directive for zero-sized (empty) basic blocks.
+
+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 }

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9530.25050.patch
Type: text/x-patch
Size: 2157 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150506/b818fb29/attachment.bin>


More information about the llvm-commits mailing list