[PATCH] D127216: [SimplifyCFG] Try to merge edge block when threading (PR55765)
Nikita Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 20 01:29:42 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rG2b089e9ae0df: [SimplifyCFG] Try to merge edge block when threading (PR55765) (authored by nikic).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D127216/new/
https://reviews.llvm.org/D127216
Files:
llvm/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/test/Transforms/SimplifyCFG/pr55765.ll
Index: llvm/test/Transforms/SimplifyCFG/pr55765.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/SimplifyCFG/pr55765.ll
@@ -0,0 +1,63 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -simplifycfg < %s | FileCheck %s
+
+; This used to infinitely thread between loop and loop.latch without reaching a
+; fixed point.
+
+declare void @dummy()
+
+define i32 @main(i1 %c1, i1 %c2, i32 %y) {
+; CHECK-LABEL: @main(
+; CHECK-NEXT: br i1 [[C1:%.*]], label [[EXIT:%.*]], label [[LOOP_PRE_PREHEADER:%.*]]
+; CHECK: loop.pre.preheader:
+; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[Y:%.*]], -1
+; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_PREHEADER:%.*]], label [[EXIT]]
+; CHECK: loop.preheader:
+; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[Y]], 0
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: br i1 [[C1]], label [[LOOP2:%.*]], label [[LOOP]]
+; CHECK: loop.latch:
+; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT]]
+; CHECK: loop2:
+; CHECK-NEXT: br i1 [[CMP2]], label [[JOIN:%.*]], label [[IF:%.*]]
+; CHECK: if:
+; CHECK-NEXT: call void @dummy()
+; CHECK-NEXT: br label [[JOIN]]
+; CHECK: join:
+; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP2]], label [[LOOP_LATCH:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: ret i32 0
+;
+ br i1 %c1, label %exit, label %loop.pre.preheader
+
+loop.pre.preheader:
+ %cmp = icmp sgt i32 %y, -1
+ br i1 %cmp, label %loop.preheader, label %exit
+
+loop.preheader:
+ %cmp2 = icmp eq i32 %y, 0
+ br label %loop
+
+loop:
+ br i1 %c1, label %loop2, label %loop.latch
+
+loop.latch:
+ br i1 %cmp, label %loop, label %exit
+
+loop2:
+ br i1 %cmp2, label %join, label %if
+
+if:
+ call void @dummy()
+ br label %join
+
+join:
+ br i1 %c2, label %loop2, label %loop.latch
+
+exit:
+ ret i32 0
+
+; uselistorder directives
+ uselistorder label %loop2, { 1, 0 }
+}
Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
===================================================================
--- llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -3145,6 +3145,12 @@
DTU->applyUpdates(Updates);
}
+ // For simplicity, we created a separate basic block for the edge. Merge
+ // it back into the predecessor if possible. This not only avoids
+ // unnecessary SimplifyCFG iterations, but also makes sure that we don't
+ // bypass the check for trivial cycles above.
+ MergeBlockIntoPredecessor(EdgeBB, DTU);
+
// Signal repeat, simplifying any other constants.
return None;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127216.438287.patch
Type: text/x-patch
Size: 2680 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220620/c0582e81/attachment.bin>
More information about the llvm-commits
mailing list