Skip to content

Commit c5a49fb

Browse files
committed
[LAA] Add tests with 128 bit inductions and 128 bit pointers.
Adds extra test coverage for llvm#140048.
1 parent 20fbbd7 commit c5a49fb

File tree

1 file changed

+153
-0
lines changed

1 file changed

+153
-0
lines changed
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -disable-output -passes='print<access-info>' %s 2>&1 | FileCheck %s
3+
4+
target datalayout = "e-m:e-p:128:128:128"
5+
6+
; Tests with 128 bit inductions and 128 bit pointer width and index size.
7+
8+
9+
define void @backward_i128(ptr %A, i128 %n) {
10+
; CHECK-LABEL: 'backward_i128'
11+
; CHECK-NEXT: loop:
12+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
13+
; CHECK-NEXT: Unsafe indirect dependence.
14+
; CHECK-NEXT: Dependences:
15+
; CHECK-NEXT: IndirectUnsafe:
16+
; CHECK-NEXT: %l = load i32, ptr %gep.A, align 4 ->
17+
; CHECK-NEXT: store i32 %l, ptr %gep.A.1, align 4
18+
; CHECK-EMPTY:
19+
; CHECK-NEXT: Run-time memory checks:
20+
; CHECK-NEXT: Grouped accesses:
21+
; CHECK-EMPTY:
22+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
23+
; CHECK-NEXT: SCEV assumptions:
24+
; CHECK-EMPTY:
25+
; CHECK-NEXT: Expressions re-written:
26+
;
27+
entry:
28+
br label %loop
29+
30+
loop:
31+
%iv = phi i128 [ 0, %entry ], [ %iv.next, %loop ]
32+
%gep.A = getelementptr inbounds i32, ptr %A, i128 %iv
33+
%l = load i32, ptr %gep.A
34+
%iv.1 = add nuw nsw i128 %iv, 1
35+
%gep.A.1 = getelementptr inbounds i32, ptr %A, i128 %iv.1
36+
store i32 %l, ptr %gep.A.1
37+
%iv.next = add i128 %iv, 1
38+
%ec = icmp eq i128 %iv.next, %n
39+
br i1 %ec, label %exit, label %loop
40+
41+
exit:
42+
ret void
43+
}
44+
45+
define void @forward_i128(ptr %A, i128 %n) {
46+
; CHECK-LABEL: 'forward_i128'
47+
; CHECK-NEXT: loop:
48+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
49+
; CHECK-NEXT: Unsafe indirect dependence.
50+
; CHECK-NEXT: Dependences:
51+
; CHECK-NEXT: IndirectUnsafe:
52+
; CHECK-NEXT: %l = load i32, ptr %gep.A.1, align 4 ->
53+
; CHECK-NEXT: store i32 %l, ptr %gep.A, align 4
54+
; CHECK-EMPTY:
55+
; CHECK-NEXT: Run-time memory checks:
56+
; CHECK-NEXT: Grouped accesses:
57+
; CHECK-EMPTY:
58+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
59+
; CHECK-NEXT: SCEV assumptions:
60+
; CHECK-EMPTY:
61+
; CHECK-NEXT: Expressions re-written:
62+
;
63+
entry:
64+
br label %loop
65+
66+
loop:
67+
%iv = phi i128 [ 0, %entry ], [ %iv.next, %loop ]
68+
%iv.1 = add nuw nsw i128 %iv, 1
69+
%gep.A.1 = getelementptr inbounds i32, ptr %A, i128 %iv.1
70+
%l = load i32, ptr %gep.A.1
71+
%gep.A = getelementptr inbounds i32, ptr %A, i128 %iv
72+
store i32 %l, ptr %gep.A
73+
%iv.next = add i128 %iv, 1
74+
%ec = icmp eq i128 %iv.next, %n
75+
br i1 %ec, label %exit, label %loop
76+
77+
exit:
78+
ret void
79+
}
80+
81+
define void @forward_negative_step(ptr %A, i128 %n) {
82+
; CHECK-LABEL: 'forward_negative_step'
83+
; CHECK-NEXT: loop:
84+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
85+
; CHECK-NEXT: Unsafe indirect dependence.
86+
; CHECK-NEXT: Dependences:
87+
; CHECK-NEXT: IndirectUnsafe:
88+
; CHECK-NEXT: %l = load i32, ptr %gep.A, align 4 ->
89+
; CHECK-NEXT: store i32 %l, ptr %gep.A.1, align 4
90+
; CHECK-EMPTY:
91+
; CHECK-NEXT: Run-time memory checks:
92+
; CHECK-NEXT: Grouped accesses:
93+
; CHECK-EMPTY:
94+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
95+
; CHECK-NEXT: SCEV assumptions:
96+
; CHECK-EMPTY:
97+
; CHECK-NEXT: Expressions re-written:
98+
;
99+
entry:
100+
br label %loop
101+
102+
loop:
103+
%iv = phi i128 [ 36893488147419103232, %entry ], [ %iv.next, %loop ]
104+
%gep.A = getelementptr inbounds i32, ptr %A, i128 %iv
105+
%l = load i32, ptr %gep.A
106+
%iv.1 = add nuw nsw i128 %iv, 1
107+
%gep.A.1 = getelementptr inbounds i32, ptr %A, i128 %iv.1
108+
store i32 %l, ptr %gep.A.1
109+
%iv.next = add nsw i128 %iv, -1
110+
%ec = icmp eq i128 %iv.next, %n
111+
br i1 %ec, label %exit, label %loop
112+
113+
exit:
114+
ret void
115+
}
116+
117+
; The induction step is i128 2^63 + 1, which does not fit into a 64 bit signed
118+
; integer.
119+
define void @forward_i128_step_63bit_plus_one(ptr %A, i128 %n) {
120+
; CHECK-LABEL: 'forward_i128_step_63bit_plus_one'
121+
; CHECK-NEXT: loop:
122+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
123+
; CHECK-NEXT: Unsafe indirect dependence.
124+
; CHECK-NEXT: Dependences:
125+
; CHECK-NEXT: IndirectUnsafe:
126+
; CHECK-NEXT: %l = load i32, ptr %gep.A.1, align 4 ->
127+
; CHECK-NEXT: store i32 %l, ptr %gep.A, align 4
128+
; CHECK-EMPTY:
129+
; CHECK-NEXT: Run-time memory checks:
130+
; CHECK-NEXT: Grouped accesses:
131+
; CHECK-EMPTY:
132+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
133+
; CHECK-NEXT: SCEV assumptions:
134+
; CHECK-EMPTY:
135+
; CHECK-NEXT: Expressions re-written:
136+
;
137+
entry:
138+
br label %loop
139+
140+
loop:
141+
%iv = phi i128 [ 0, %entry ], [ %iv.next, %loop ]
142+
%iv.1 = add nuw nsw i128 %iv, 1
143+
%gep.A.1 = getelementptr inbounds i32, ptr %A, i128 %iv.1
144+
%l = load i32, ptr %gep.A.1
145+
%gep.A = getelementptr inbounds i32, ptr %A, i128 %iv
146+
store i32 %l, ptr %gep.A
147+
%iv.next = add i128 %iv, 9223372036854775809
148+
%ec = icmp eq i128 %iv.next, %n
149+
br i1 %ec, label %exit, label %loop
150+
151+
exit:
152+
ret void
153+
}

0 commit comments

Comments
 (0)