[PATCH] D51161: Allow inconsistent offsets for 'noreturn' basic blocks when '-verify-cfiinstrs'

Vladimir Stefanovic via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 30 10:34:12 PDT 2018


This revision was automatically updated to reflect the committed changes.
vstefanovic marked an inline comment as done.
Closed by commit rL341087: Allow inconsistent offsets for 'noreturn' basic blocks when '-verify-cfiinstrs' (authored by vstefanovic, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D51161?vs=163354&id=163368#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D51161

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


Index: llvm/trunk/test/CodeGen/X86/cfi-inserter-noreturnblock.mir
===================================================================
--- llvm/trunk/test/CodeGen/X86/cfi-inserter-noreturnblock.mir
+++ llvm/trunk/test/CodeGen/X86/cfi-inserter-noreturnblock.mir
@@ -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();
+#   }
+# }
Index: llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
===================================================================
--- llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
+++ llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
@@ -317,6 +317,10 @@
       // 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++;
       }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51161.163368.patch
Type: text/x-patch
Size: 1706 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180830/963261c4/attachment.bin>


More information about the llvm-commits mailing list