summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Stefanovic <vladimir.stefanovic@rt-rk.com>2018-08-30 17:31:38 +0000
committerVladimir Stefanovic <vladimir.stefanovic@rt-rk.com>2018-08-30 17:31:38 +0000
commit7e58ebf6b85f8ea737b281a0552bcbb4ea3b04fb (patch)
treeb32d272a9766872803c14c1883de5f71448b11fa
parent748297341171927b0693e4ac78fa0a223df5ea3c (diff)
downloadbcm5719-llvm-7e58ebf6b85f8ea737b281a0552bcbb4ea3b04fb.tar.gz
bcm5719-llvm-7e58ebf6b85f8ea737b281a0552bcbb4ea3b04fb.zip
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 llvm-svn: 341087
-rw-r--r--llvm/lib/CodeGen/CFIInstrInserter.cpp4
-rw-r--r--llvm/test/CodeGen/X86/cfi-inserter-noreturnblock.mir30
2 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/CFIInstrInserter.cpp b/llvm/lib/CodeGen/CFIInstrInserter.cpp
index 00ebf63fc17..4fd119430cf 100644
--- a/llvm/lib/CodeGen/CFIInstrInserter.cpp
+++ b/llvm/lib/CodeGen/CFIInstrInserter.cpp
@@ -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/llvm/test/CodeGen/X86/cfi-inserter-noreturnblock.mir b/llvm/test/CodeGen/X86/cfi-inserter-noreturnblock.mir
new file mode 100644
index 00000000000..809cd377e76
--- /dev/null
+++ b/llvm/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();
+# }
+# }
OpenPOWER on IntegriCloud