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
This commit is contained in:
Vladimir Stefanovic 2018-08-30 17:31:38 +00:00
parent 1d2600e093
commit 4f40714aee
2 changed files with 34 additions and 0 deletions

View 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++;
}

View File

@ -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();
# }
# }