mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-27 06:54:30 +00:00
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:
parent
1d2600e093
commit
4f40714aee
@ -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++;
|
||||
}
|
||||
|
30
test/CodeGen/X86/cfi-inserter-noreturnblock.mir
Normal file
30
test/CodeGen/X86/cfi-inserter-noreturnblock.mir
Normal 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();
|
||||
# }
|
||||
# }
|
Loading…
x
Reference in New Issue
Block a user