[llvm] e51ef7f - [Test] Add test on missing opportunity in Loop Deletion
Max Kazantsev via llvm-commits
llvm-commits at lists.llvm.org
Fri May 14 02:58:09 PDT 2021
Author: Max Kazantsev
Date: 2021-05-14T16:57:50+07:00
New Revision: e51ef7f0706ada40d33819d1b3bdca2351e4fb4e
URL: https://github.com/llvm/llvm-project/commit/e51ef7f0706ada40d33819d1b3bdca2351e4fb4e
DIFF: https://github.com/llvm/llvm-project/commit/e51ef7f0706ada40d33819d1b3bdca2351e4fb4e.diff
LOG: [Test] Add test on missing opportunity in Loop Deletion
We can break the backedge in some cases when we can evaluate some of the
values and conditions on the 1st iteration.
Added:
llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll b/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll
new file mode 100644
index 0000000000000..692787b39dfbd
--- /dev/null
+++ b/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll
@@ -0,0 +1,228 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -loop-deletion -S | FileCheck %s
+; RUN: opt < %s -passes='loop(loop-deletion)' -S | FileCheck %s
+
+; The idea is that we know that %is.positive is true on the 1st iteration,
+; it means that we can evaluate %merge.phi = %sub on the 1st iteration,
+; and therefore prove that %sum.next = %sum + %sub = %sum + %limit - %sum = %limit,
+; and predicate is false.
+
+; TODO: We can break the backedge here.
+define i32 @test_ne(i32 %limit) {
+; CHECK-LABEL: @test_ne(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
+; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT:%.*]], [[SUM]]
+; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]
+; CHECK: if.false:
+; CHECK-NEXT: br label [[BACKEDGE]]
+; CHECK: backedge:
+; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
+; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], [[LIMIT]]
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
+; CHECK: done:
+; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
+; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
+;
+entry:
+ br label %loop
+
+loop: ; preds = %backedge, %entry
+ %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]
+ %sub = sub i32 %limit, %sum
+ %is.positive = icmp sgt i32 %sub, 0
+ br i1 %is.positive, label %backedge, label %if.false
+
+if.false: ; preds = %loop
+ br label %backedge
+
+backedge: ; preds = %if.false, %loop
+ %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]
+ %sum.next = add i32 %sum, %merge.phi
+ %loop.cond = icmp ne i32 %sum.next, %limit
+ br i1 %loop.cond, label %loop, label %done
+
+done: ; preds = %backedge
+ %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]
+ ret i32 %sum.next.lcssa
+}
+
+; TODO: We can break the backedge here.
+define i32 @test_slt(i32 %limit) {
+; CHECK-LABEL: @test_slt(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
+; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT:%.*]], [[SUM]]
+; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]
+; CHECK: if.false:
+; CHECK-NEXT: br label [[BACKEDGE]]
+; CHECK: backedge:
+; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
+; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[SUM_NEXT]], [[LIMIT]]
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
+; CHECK: done:
+; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
+; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
+;
+entry:
+ br label %loop
+
+loop: ; preds = %backedge, %entry
+ %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]
+ %sub = sub i32 %limit, %sum
+ %is.positive = icmp sgt i32 %sub, 0
+ br i1 %is.positive, label %backedge, label %if.false
+
+if.false: ; preds = %loop
+ br label %backedge
+
+backedge: ; preds = %if.false, %loop
+ %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]
+ %sum.next = add i32 %sum, %merge.phi
+ %loop.cond = icmp slt i32 %sum.next, %limit
+ br i1 %loop.cond, label %loop, label %done
+
+done: ; preds = %backedge
+ %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]
+ ret i32 %sum.next.lcssa
+}
+
+; TODO: We can break the backedge here.
+define i32 @test_ult(i32 %limit) {
+; CHECK-LABEL: @test_ult(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
+; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT:%.*]], [[SUM]]
+; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]
+; CHECK: if.false:
+; CHECK-NEXT: br label [[BACKEDGE]]
+; CHECK: backedge:
+; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
+; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[SUM_NEXT]], [[LIMIT]]
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
+; CHECK: done:
+; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
+; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
+;
+entry:
+ br label %loop
+
+loop: ; preds = %backedge, %entry
+ %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]
+ %sub = sub i32 %limit, %sum
+ %is.positive = icmp sgt i32 %sub, 0
+ br i1 %is.positive, label %backedge, label %if.false
+
+if.false: ; preds = %loop
+ br label %backedge
+
+backedge: ; preds = %if.false, %loop
+ %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]
+ %sum.next = add i32 %sum, %merge.phi
+ %loop.cond = icmp ult i32 %sum.next, %limit
+ br i1 %loop.cond, label %loop, label %done
+
+done: ; preds = %backedge
+ %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]
+ ret i32 %sum.next.lcssa
+}
+
+; TODO: We can break the backedge here.
+define i32 @test_sgt(i32 %limit) {
+; CHECK-LABEL: @test_sgt(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
+; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT:%.*]], [[SUM]]
+; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]
+; CHECK: if.false:
+; CHECK-NEXT: br label [[BACKEDGE]]
+; CHECK: backedge:
+; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
+; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp sgt i32 [[SUM_NEXT]], [[LIMIT]]
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
+; CHECK: done:
+; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
+; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
+;
+entry:
+ br label %loop
+
+loop: ; preds = %backedge, %entry
+ %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]
+ %sub = sub i32 %limit, %sum
+ %is.positive = icmp sgt i32 %sub, 0
+ br i1 %is.positive, label %backedge, label %if.false
+
+if.false: ; preds = %loop
+ br label %backedge
+
+backedge: ; preds = %if.false, %loop
+ %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]
+ %sum.next = add i32 %sum, %merge.phi
+ %loop.cond = icmp sgt i32 %sum.next, %limit
+ br i1 %loop.cond, label %loop, label %done
+
+done: ; preds = %backedge
+ %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]
+ ret i32 %sum.next.lcssa
+}
+
+; TODO: We can break the backedge here.
+define i32 @test_ugt(i32 %limit) {
+; CHECK-LABEL: @test_ugt(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
+; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT:%.*]], [[SUM]]
+; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]
+; CHECK: if.false:
+; CHECK-NEXT: br label [[BACKEDGE]]
+; CHECK: backedge:
+; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
+; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ugt i32 [[SUM_NEXT]], [[LIMIT]]
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
+; CHECK: done:
+; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
+; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
+;
+entry:
+ br label %loop
+
+loop: ; preds = %backedge, %entry
+ %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]
+ %sub = sub i32 %limit, %sum
+ %is.positive = icmp sgt i32 %sub, 0
+ br i1 %is.positive, label %backedge, label %if.false
+
+if.false: ; preds = %loop
+ br label %backedge
+
+backedge: ; preds = %if.false, %loop
+ %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]
+ %sum.next = add i32 %sum, %merge.phi
+ %loop.cond = icmp ugt i32 %sum.next, %limit
+ br i1 %loop.cond, label %loop, label %done
+
+done: ; preds = %backedge
+ %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]
+ ret i32 %sum.next.lcssa
+}
More information about the llvm-commits
mailing list