OSDN Git Service

Allow inconsistent offsets for 'noreturn' basic blocks when '-verify-cfiinstrs'
authorVladimir Stefanovic <vladimir.stefanovic@rt-rk.com>
Thu, 30 Aug 2018 17:31:38 +0000 (17:31 +0000)
committerVladimir Stefanovic <vladimir.stefanovic@rt-rk.com>
Thu, 30 Aug 2018 17:31:38 +0000 (17:31 +0000)
With r295105, some 'noreturn' blocks (those that don't return and have no
successors) may be merged.
If such blocks' predecessors have different outgoing offset or register, don't
report an error in CFIInstrInserter verify().

Thanks to Vlad Tsyrklevich for reporting the issue.

Differential Revision: https://reviews.llvm.org/D51161

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341087 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CFIInstrInserter.cpp
test/CodeGen/X86/cfi-inserter-noreturnblock.mir [new file with mode: 0644]

index 00ebf63..4fd1194 100644 (file)
@@ -317,6 +317,10 @@ unsigned CFIInstrInserter::verify(MachineFunction &MF) {
       // outgoing offset and register values of CurrMBB
       if (SuccMBBInfo.IncomingCFAOffset != CurrMBBInfo.OutgoingCFAOffset ||
           SuccMBBInfo.IncomingCFARegister != CurrMBBInfo.OutgoingCFARegister) {
+        // Inconsistent offsets/registers are ok for 'noreturn' blocks because
+        // we don't generate epilogues inside such blocks.
+        if (SuccMBBInfo.MBB->succ_empty() && !SuccMBBInfo.MBB->isReturnBlock())
+          continue;
         report(CurrMBBInfo, SuccMBBInfo);
         ErrorNum++;
       }
diff --git a/test/CodeGen/X86/cfi-inserter-noreturnblock.mir b/test/CodeGen/X86/cfi-inserter-noreturnblock.mir
new file mode 100644 (file)
index 0000000..809cd37
--- /dev/null
@@ -0,0 +1,30 @@
+# RUN: llc -o - %s -mtriple=x86_64-- -verify-cfiinstrs \
+# RUN:     -run-pass=cfi-instr-inserter
+
+# Test that CFI verifier does not report inconsistent offset for the
+# 'noreturn' block.
+---
+name: testNoreturnBlock
+body: |
+  bb.0:
+    CFI_INSTRUCTION def_cfa_offset 24
+    JNE_1 %bb.2, implicit undef $eflags
+
+  bb.1:
+    CFI_INSTRUCTION def_cfa_offset 32
+
+  bb.2:
+    TRAP
+...
+
+# C code to reproduce the issue, built with
+# '-O2 -mllvm -tail-merge-size=1 -mllvm -verify-cfiinstrs':
+#
+# void foo1(int v) __attribute__((noreturn)) {
+#   if (v == 1) {
+#     __builtin_trap();
+#   }
+#   if (foo2(v)) {
+#     __builtin_trap();
+#   }
+# }