Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
FixIrreducible: don't crash when moving a child loop
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
- Loading branch information
Showing
2 changed files
with
100 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
; 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 | ||
} |