[llvm] r341087 - Allow inconsistent offsets for 'noreturn' basic blocks when '-verify-cfiinstrs'

Vladimir Stefanovic via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 30 10:31:38 PDT 2018


Author: vstefanovic
Date: Thu Aug 30 10:31:38 2018
New Revision: 341087

URL: http://llvm.org/viewvc/llvm-project?rev=341087&view=rev
Log:
Allow inconsistent offsets for 'noreturn' basic blocks when '-verify-cfiinstrs'

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

Added:
    llvm/trunk/test/CodeGen/X86/cfi-inserter-noreturnblock.mir
Modified:
    llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp

Modified: llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp?rev=341087&r1=341086&r2=341087&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp (original)
+++ llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp Thu Aug 30 10:31:38 2018
@@ -317,6 +317,10 @@ unsigned CFIInstrInserter::verify(Machin
       // 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++;
       }

Added: llvm/trunk/test/CodeGen/X86/cfi-inserter-noreturnblock.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/cfi-inserter-noreturnblock.mir?rev=341087&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/cfi-inserter-noreturnblock.mir (added)
+++ llvm/trunk/test/CodeGen/X86/cfi-inserter-noreturnblock.mir Thu Aug 30 10:31:38 2018
@@ -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();
+#   }
+# }




More information about the llvm-commits mailing list