[PATCH] D144845: [IRCE][Test] Add test to constrain a loop bounded by phi
Aleksandr Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 10 04:11:50 PST 2023
aleksandr.popov updated this revision to Diff 504092.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D144845/new/
https://reviews.llvm.org/D144845
Files:
llvm/test/Transforms/IRCE/constrain_loop_with_phi_bound.ll
Index: llvm/test/Transforms/IRCE/constrain_loop_with_phi_bound.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/IRCE/constrain_loop_with_phi_bound.ll
@@ -0,0 +1,90 @@
+; RUN: opt -passes=irce -irce-print-range-checks -irce-print-changed-loops -S < %s 2>&1 | FileCheck %s
+
+declare i32 @bar()
+
+; TODO: Prove that inner loop L1 is guarded by cond '0 <s x' to constrain it by IRCE
+; Inner's loop bound is %x = phi i32 [ %x01, %L0.preheader ], [ %x02, %L0.latch ]
+; We know that:
+; - x != 0
+; - x01 >=s 0
+; - x02 >=s 0
+; Hense: x >s 0
+; CHECK: irce: looking at loop Loop at depth 2 containing: %L1.header<header><exiting>,%L1.latch<latch><exiting>
+; CHECK-NEXT: irce: loop has 1 inductive range checks:
+; CHECK-NEXT: InductiveRangeCheck:
+; CHECK-NEXT: Begin: 0 Step: 1 End: %n
+; CHECK-NEXT: CheckUse: br i1 %cmp2, label %L1.latch, label %L1.exit Operand: 0
+define void @test_constrain_loop_with_phi_bound(i32 %n) {
+; CHECK-LABEL: define void @test_constrain_loop_with_phi_bound
+; CHECK-SAME: (i32 [[N:%.*]]) {
+; CHECK-NEXT: Entry:
+; CHECK-NEXT: [[X01:%.*]] = call i32 @bar()
+; CHECK-NEXT: [[CMP0:%.*]] = icmp slt i32 [[X01]], 0
+; CHECK-NEXT: br i1 [[CMP0]], label [[EXIT:%.*]], label [[L0_PREHEADER:%.*]]
+; CHECK: L0.preheader:
+; CHECK-NEXT: br label [[L0_HEADER:%.*]]
+; CHECK: L0.header:
+; CHECK-NEXT: [[X:%.*]] = phi i32 [ [[X01]], [[L0_PREHEADER]] ], [ [[X02:%.*]], [[L0_LATCH:%.*]] ]
+; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[X]], 0
+; CHECK-NEXT: br i1 [[CMP1]], label [[L0_EXIT:%.*]], label [[L1_PREHEADER:%.*]]
+; CHECK: L1.preheader:
+; CHECK-NEXT: br label [[L1_HEADER:%.*]]
+; CHECK: L1.header:
+; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[L1_PREHEADER]] ], [ [[IV_NEXT:%.*]], [[L1_LATCH:%.*]] ]
+; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[IV]], [[N]]
+; CHECK-NEXT: br i1 [[CMP2]], label [[L1_LATCH]], label [[L1_EXIT:%.*]]
+; CHECK: L1.latch:
+; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
+; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[IV_NEXT]], [[X]]
+; CHECK-NEXT: br i1 [[CMP3]], label [[L1_HEADER]], label [[L0_LATCH]]
+; CHECK: L1.exit:
+; CHECK-NEXT: br label [[EXIT]]
+; CHECK: L0.latch:
+; CHECK-NEXT: [[X02]] = call i32 @bar()
+; CHECK-NEXT: [[CMP4:%.*]] = icmp slt i32 [[X02]], 0
+; CHECK-NEXT: br i1 [[CMP4]], label [[L0_EXIT]], label [[L0_HEADER]]
+; CHECK: L0.exit:
+; CHECK-NEXT: br label [[EXIT]]
+; CHECK: Exit:
+; CHECK-NEXT: ret void
+;
+Entry:
+ %x01 = call i32 @bar()
+ %cmp0 = icmp slt i32 %x01, 0
+ br i1 %cmp0, label %Exit, label %L0.preheader
+
+L0.preheader:
+ br label %L0.header
+
+L0.header:
+ %x = phi i32 [ %x01, %L0.preheader ], [ %x02, %L0.latch ]
+ %cmp1 = icmp eq i32 %x, 0
+ br i1 %cmp1, label %L0.exit, label %L1.preheader
+
+L1.preheader:
+ br label %L1.header
+
+L1.header:
+ %iv = phi i32 [ 0, %L1.preheader ], [ %iv.next, %L1.latch ]
+ %cmp2 = icmp ult i32 %iv, %n
+ br i1 %cmp2, label %L1.latch, label %L1.exit
+
+L1.latch:
+ %iv.next = add nuw nsw i32 %iv, 1
+ %cmp3 = icmp slt i32 %iv.next, %x
+ br i1 %cmp3, label %L1.header, label %L0.latch
+
+L1.exit:
+ br label %Exit
+
+L0.latch:
+ %x02 = call i32 @bar()
+ %cmp4 = icmp slt i32 %x02, 0
+ br i1 %cmp4, label %L0.exit, label %L0.header
+
+L0.exit:
+ br label %Exit
+
+Exit:
+ ret void
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144845.504092.patch
Type: text/x-patch
Size: 3430 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230310/ee61091d/attachment.bin>
More information about the llvm-commits
mailing list