Skip to content

Commit 446b3de

Browse files
committed
[IndVars] Add tests showing missed folding opportunity.
1 parent fe93f75 commit 446b3de

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -p indvars -S %s | FileCheck %s
3+
4+
target triple = "arm64-apple-macosx15.0.0"
5+
6+
declare i1 @cond()
7+
8+
define void @pred_mip_12(ptr %dst, ptr %src, i32 %n, i64 %offset) {
9+
; CHECK-LABEL: define void @pred_mip_12(
10+
; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]], i32 [[N:%.*]], i64 [[OFFSET:%.*]]) {
11+
; CHECK-NEXT: [[ENTRY:.*]]:
12+
; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[N]], i32 1)
13+
; CHECK-NEXT: br label %[[OUTER_LOOP:.*]]
14+
; CHECK: [[OUTER_LOOP_LOOPEXIT:.*]]:
15+
; CHECK-NEXT: [[PTR_IV_NEXT_LCSSA:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[INNER_LOOP:.*]] ]
16+
; CHECK-NEXT: br label %[[OUTER_LOOP]]
17+
; CHECK: [[OUTER_LOOP]]:
18+
; CHECK-NEXT: [[OUTER_PTR:%.*]] = phi ptr [ [[SRC]], %[[ENTRY]] ], [ [[PTR_IV_NEXT_LCSSA]], %[[OUTER_LOOP_LOOPEXIT]] ]
19+
; CHECK-NEXT: [[C:%.*]] = call i1 @cond()
20+
; CHECK-NEXT: br i1 [[C]], label %[[INNER_LOOP_PREHEADER:.*]], label %[[EXIT:.*]]
21+
; CHECK: [[INNER_LOOP_PREHEADER]]:
22+
; CHECK-NEXT: br label %[[INNER_LOOP]]
23+
; CHECK: [[INNER_LOOP]]:
24+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[INNER_LOOP]] ], [ 0, %[[INNER_LOOP_PREHEADER]] ]
25+
; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT]], %[[INNER_LOOP]] ], [ [[SRC]], %[[INNER_LOOP_PREHEADER]] ]
26+
; CHECK-NEXT: [[L:%.*]] = load i8, ptr [[OUTER_PTR]], align 1
27+
; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr i8, ptr [[PTR_IV]], i64 [[OFFSET]]
28+
; CHECK-NEXT: store i8 [[L]], ptr [[DST]], align 2
29+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
30+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[IV_NEXT]], [[SMAX]]
31+
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[INNER_LOOP]], label %[[OUTER_LOOP_LOOPEXIT]]
32+
; CHECK: [[EXIT]]:
33+
; CHECK-NEXT: ret void
34+
;
35+
entry:
36+
br label %outer.loop
37+
38+
outer.loop:
39+
%outer.ptr = phi ptr [ %src, %entry ], [ %ptr.iv.next, %inner.loop ]
40+
%c = call i1 @cond()
41+
br i1 %c, label %inner.loop, label %exit
42+
43+
inner.loop:
44+
%iv = phi i32 [ 0, %outer.loop ], [ %iv.next, %inner.loop ]
45+
%ptr.iv = phi ptr [ %src, %outer.loop ], [ %ptr.iv.next, %inner.loop ]
46+
%l = load i8, ptr %outer.ptr, align 1
47+
%ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 %offset
48+
store i8 %l, ptr %dst, align 2
49+
%iv.next = add i32 %iv, 1
50+
%ec = icmp slt i32 %iv.next, %n
51+
br i1 %ec, label %inner.loop, label %outer.loop
52+
53+
exit:
54+
ret void
55+
}

0 commit comments

Comments
 (0)