Skip to content

Commit fcd6549

Browse files
committed
[LIR] Add test for #82337 (NFC)
1 parent 2ad43fa commit fcd6549

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S -passes=loop-idiom < %s | FileCheck %s
3+
4+
; FIXME: The poison flags should be preserved, as no transform takes place.
5+
define void @test(ptr %p.end, ptr %p.start) {
6+
; CHECK-LABEL: define void @test(
7+
; CHECK-SAME: ptr [[P_END:%.*]], ptr [[P_START:%.*]]) {
8+
; CHECK-NEXT: entry:
9+
; CHECK-NEXT: [[P_END_INT:%.*]] = ptrtoint ptr [[P_END]] to i64
10+
; CHECK-NEXT: [[P_START_INT:%.*]] = ptrtoint ptr [[P_START]] to i64
11+
; CHECK-NEXT: [[DIST:%.*]] = sub i64 [[P_END_INT]], [[P_START_INT]]
12+
; CHECK-NEXT: [[LEN:%.*]] = lshr i64 [[DIST]], 5
13+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P_END]], [[P_START]]
14+
; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[PREHEADER:%.*]]
15+
; CHECK: preheader:
16+
; CHECK-NEXT: br label [[LOOP:%.*]]
17+
; CHECK: loop:
18+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[LEN]], [[PREHEADER]] ], [ [[IV_DEC:%.*]], [[LOOP]] ]
19+
; CHECK-NEXT: [[IV_NEG:%.*]] = sub nsw i64 0, [[IV]]
20+
; CHECK-NEXT: [[SRC:%.*]] = getelementptr inbounds [32 x i8], ptr [[P_END]], i64 [[IV_NEG]]
21+
; CHECK-NEXT: [[V:%.*]] = load <4 x i64>, ptr [[SRC]], align 8
22+
; CHECK-NEXT: [[DST:%.*]] = getelementptr inbounds [32 x i8], ptr [[P_START]], i64 [[IV_NEG]]
23+
; CHECK-NEXT: store <4 x i64> [[V]], ptr [[DST]], align 8
24+
; CHECK-NEXT: [[IV_DEC]] = add i64 [[IV]], -1
25+
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i64 [[IV_DEC]], 0
26+
; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP_EXIT:%.*]], label [[LOOP]]
27+
; CHECK: loop.exit:
28+
; CHECK-NEXT: br label [[EXIT]]
29+
; CHECK: exit:
30+
; CHECK-NEXT: ret void
31+
;
32+
entry:
33+
%p.end.int = ptrtoint ptr %p.end to i64
34+
%p.start.int = ptrtoint ptr %p.start to i64
35+
%dist = sub nuw i64 %p.end.int, %p.start.int
36+
%len = lshr exact i64 %dist, 5
37+
%cmp = icmp eq ptr %p.end, %p.start
38+
br i1 %cmp, label %exit, label %preheader
39+
40+
preheader:
41+
br label %loop
42+
43+
loop:
44+
%iv = phi i64 [ %len, %preheader ], [ %iv.dec, %loop ]
45+
%iv.neg = sub nsw i64 0, %iv
46+
%src = getelementptr inbounds [32 x i8], ptr %p.end, i64 %iv.neg
47+
%v = load <4 x i64>, ptr %src, align 8
48+
%dst = getelementptr inbounds [32 x i8], ptr %p.start, i64 %iv.neg
49+
store <4 x i64> %v, ptr %dst, align 8
50+
%iv.dec = add i64 %iv, -1
51+
%cmp2 = icmp eq i64 %iv.dec, 0
52+
br i1 %cmp2, label %loop.exit, label %loop
53+
54+
loop.exit:
55+
br label %exit
56+
57+
exit:
58+
ret void
59+
}

0 commit comments

Comments
 (0)