mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-12 22:17:47 +00:00
20f2dc251d
Summary: When an irreducible SCC is converted into a new natural loop, existing loops included in that SCC now become children of the new loop. The logic that moves these loops from the parent loop to the new loop invoked undefined behaviour when it modified the container that it was iterating over. Fixed this by first extracting all the loops that are to be removed from the parent. Fixes bug 45623. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D78544
90 lines
3.4 KiB
LLVM
90 lines
3.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -fix-irreducible -S | FileCheck %s
|
|
|
|
define dso_local void @tre_tnfa_run_backtrack() {
|
|
; CHECK-LABEL: @tre_tnfa_run_backtrack(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[RETRY:%.*]]
|
|
; CHECK: retry:
|
|
; CHECK-NEXT: br label [[IRR_GUARD:%.*]]
|
|
; CHECK: while.body248:
|
|
; CHECK-NEXT: br i1 undef, label [[IF_THEN250:%.*]], label [[IF_END275:%.*]]
|
|
; CHECK: if.then250:
|
|
; CHECK-NEXT: br label [[FOR_COND264:%.*]]
|
|
; CHECK: for.cond264:
|
|
; CHECK-NEXT: br i1 undef, label [[FOR_BODY267:%.*]], label [[IRR_GUARD]]
|
|
; CHECK: for.body267:
|
|
; CHECK-NEXT: br label [[FOR_COND264]]
|
|
; CHECK: if.end275:
|
|
; CHECK-NEXT: br label [[FOR_COND342:%.*]]
|
|
; CHECK: for.cond342:
|
|
; CHECK-NEXT: br i1 undef, label [[FOR_BODY345:%.*]], label [[FOR_END580:%.*]]
|
|
; CHECK: for.body345:
|
|
; CHECK-NEXT: br label [[FOR_COND342]]
|
|
; CHECK: for.end580:
|
|
; CHECK-NEXT: br label [[IRR_GUARD]]
|
|
; CHECK: backtrack:
|
|
; CHECK-NEXT: br i1 undef, label [[IF_THEN595:%.*]], label [[IF_ELSE629:%.*]]
|
|
; CHECK: if.then595:
|
|
; CHECK-NEXT: br label [[FOR_COND616:%.*]]
|
|
; CHECK: for.cond616:
|
|
; CHECK-NEXT: br i1 undef, label [[FOR_BODY619:%.*]], label [[FOR_END626:%.*]]
|
|
; CHECK: for.body619:
|
|
; CHECK-NEXT: br label [[FOR_COND616]]
|
|
; CHECK: for.end626:
|
|
; CHECK-NEXT: br label [[IRR_GUARD]]
|
|
; CHECK: if.else629:
|
|
; CHECK-NEXT: br label [[RETRY]]
|
|
; CHECK: irr.guard:
|
|
; CHECK-NEXT: [[GUARD_BACKTRACK:%.*]] = phi i1 [ true, [[FOR_END580]] ], [ true, [[FOR_COND264]] ], [ undef, [[RETRY]] ], [ false, [[FOR_END626]] ]
|
|
; CHECK-NEXT: br i1 [[GUARD_BACKTRACK]], label [[BACKTRACK:%.*]], label [[WHILE_BODY248:%.*]]
|
|
;
|
|
entry:
|
|
br label %retry
|
|
|
|
retry:
|
|
br i1 undef, label %backtrack, label %while.body248
|
|
|
|
while.body248: ; preds = %for.end626, %retry
|
|
br i1 undef, label %if.then250, label %if.end275
|
|
|
|
if.then250: ; preds = %while.body248
|
|
br label %for.cond264
|
|
|
|
for.cond264: ; preds = %for.body267, %if.then250
|
|
br i1 undef, label %for.body267, label %backtrack
|
|
|
|
for.body267: ; preds = %for.cond264
|
|
br label %for.cond264
|
|
|
|
if.end275: ; preds = %while.body248
|
|
br label %for.cond342
|
|
|
|
for.cond342: ; preds = %for.body345, %if.end275
|
|
br i1 undef, label %for.body345, label %for.end580
|
|
|
|
for.body345: ; preds = %for.cond342
|
|
br label %for.cond342
|
|
|
|
for.end580: ; preds = %for.cond342
|
|
br label %backtrack
|
|
|
|
backtrack: ; preds = %for.end580, %for.cond264, %retry
|
|
br i1 undef, label %if.then595, label %if.else629
|
|
|
|
if.then595: ; preds = %backtrack
|
|
br label %for.cond616
|
|
|
|
for.cond616: ; preds = %for.body619, %if.then595
|
|
br i1 undef, label %for.body619, label %for.end626
|
|
|
|
for.body619: ; preds = %for.cond616
|
|
br label %for.cond616
|
|
|
|
for.end626: ; preds = %for.cond616
|
|
br label %while.body248
|
|
|
|
if.else629: ; preds = %backtrack
|
|
br label %retry
|
|
}
|