llvm/test/Transforms/CodeGenPrepare/split-indirect-loop.ll
Brendon Cahoon 80269962da [CodeGenPrepare] Fix crash due to an invalid CFG
The splitIndirectCriticalEdges function generates and invalid CFG when the
'Target' basic block is a loop to itself. When this occurs, the code that
updates the predecessor terminator needs to update the terminator in the split
basic block.

This occurs when there is an edge from block D back to D. Since D is split in
to D0 and D1, the code needs to update the terminator in D1. But D1 is not in
the OtherPreds vector, so it was not getting updated.

Differential Revision: https://reviews.llvm.org/D32126


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300480 91177308-0d34-0410-b5e6-96231b3b80d8
2017-04-17 19:11:04 +00:00

38 lines
906 B
LLVM

; RUN: opt -codegenprepare -S < %s | FileCheck %s
; Test that an invalid CFG is not created by splitIndirectCriticalEdges
; transformation when the 'target' block is a loop to itself.
; CHECK: .split:
; CHECK: br label %while.body.clone
; CHECK: if.else1:
; CHECK: indirectbr
; CHECK: while.body.clone:
; CHECK: br label %.split
define void @test() {
entry:
br label %if.else
if.else:
br i1 undef, label %while.body, label %preheader
preheader:
br label %if.else1
if.then:
unreachable
while.body:
%dest.sroa = phi i32 [ %1, %while.body ], [ undef, %if.else1 ], [ undef, %if.else ]
%0 = inttoptr i32 %dest.sroa to i8*
%incdec.ptr = getelementptr inbounds i8, i8* %0, i32 -1
%1 = ptrtoint i8* %incdec.ptr to i32
store i8 undef, i8* %incdec.ptr, align 1
br label %while.body
if.else1:
indirectbr i8* undef, [label %if.then, label %while.body, label %if.else, label %if.else1]
}