Files
clang-p2996/llvm/test/Transforms/NewGVN/pr33014.ll
Davide Italiano eab0de2b82 [NewGVN] Break infinite recursion in singleReachablePHIPath().
We can have cycles between PHIs and this causes singleReachablePhi()
to call itself indefintely (until we run out of stack). The proper
solution would be that of computing SCCs, but it's not worth for
now, so just keep a visited set and give up when we find a cycle.
Thanks to Dan for the discussion/help with this.

Fixes PR33014.

llvm-svn: 303393
2017-05-18 23:22:44 +00:00

55 lines
1.7 KiB
LLVM

; Make sure we don't end up in an infinite recursion in singleReachablePHIPath().
; REQUIRES: asserts
; RUN: opt -newgvn -S %s | FileCheck %s
@c = external global i64, align 8
; CHECK-LABEL: define void @tinkywinky() {
; CHECK: entry:
; CHECK-NEXT: br i1 undef, label %l2, label %if.then
; CHECK: if.then: ; preds = %entry
; CHECK-NEXT: br label %for.body
; CHECK: ph: ; preds = %back, %ontrue
; CHECK-NEXT: br label %for.body
; CHECK: for.body: ; preds = %ph, %if.then
; CHECK-NEXT: br i1 undef, label %ontrue, label %onfalse
; CHECK: onfalse: ; preds = %for.body
; CHECK-NEXT: %patatino = load i64, i64* @c
; CHECK-NEXT: ret void
; CHECK: ontrue: ; preds = %for.body
; CHECK-NEXT: %dipsy = load i64, i64* @c
; CHECK-NEXT: br label %ph
; CHECK: back: ; preds = %l2
; CHECK-NEXT: store i8 undef, i8* null
; CHECK-NEXT: br label %ph
; CHECK: end: ; preds = %l2
; CHECK-NEXT: ret void
; CHECK: l2: ; preds = %entry
; CHECK-NEXT: br i1 false, label %back, label %end
; CHECK-NEXT: }
define void @tinkywinky() {
entry:
br i1 undef, label %l2, label %if.then
if.then:
br label %for.body
ph:
br label %for.body
for.body:
br i1 undef, label %ontrue, label %onfalse
onfalse:
%patatino = load i64, i64* @c
store i64 %patatino, i64* @c
ret void
ontrue:
%dipsy = load i64, i64* @c
store i64 %dipsy, i64* @c
br label %ph
back:
br label %ph
end:
ret void
l2:
br i1 false, label %back, label %end
}