1
+ ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
1
2
; RUN: opt -passes='print<access-info>' -disable-output < %s 2>&1 | FileCheck %s
2
3
3
4
target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
@@ -9,32 +10,76 @@ target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
9
10
; A[i+1] = A[i] + 1;
10
11
; }
11
12
12
- ; CHECK: function 'vectorizable_Read_Write':
13
- ; CHECK-NEXT: for.body:
14
- ; CHECK-NEXT: Report: unsafe dependent memory operations in loop
15
- ; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
16
- ; CHECK-NEXT: Dependences:
17
- ; CHECK-NEXT: ForwardButPreventsForwarding:
18
- ; CHECK-NEXT: %0 = load i32, ptr %arrayidx, align 4 ->
19
- ; CHECK-NEXT: store i32 %add, ptr %gep, align 4
20
-
21
13
define void @vectorizable_Read_Write (ptr nocapture %A ) {
14
+ ; CHECK-LABEL: 'vectorizable_Read_Write'
15
+ ; CHECK-NEXT: loop:
16
+ ; 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
17
+ ; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
18
+ ; CHECK-NEXT: Dependences:
19
+ ; CHECK-NEXT: ForwardButPreventsForwarding:
20
+ ; CHECK-NEXT: %l = load i32, ptr %gep.A, align 4 ->
21
+ ; CHECK-NEXT: store i32 %add, ptr %gep.A.plus.1, align 4
22
+ ; CHECK-EMPTY:
23
+ ; CHECK-NEXT: Run-time memory checks:
24
+ ; CHECK-NEXT: Grouped accesses:
25
+ ; CHECK-EMPTY:
26
+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
27
+ ; CHECK-NEXT: SCEV assumptions:
28
+ ; CHECK-EMPTY:
29
+ ; CHECK-NEXT: Expressions re-written:
30
+ ;
22
31
entry:
23
- %invariant.gep = getelementptr i32 , ptr %A , i64 1
24
- br label %for.body
32
+ %A.plus.1 = getelementptr i32 , ptr %A , i64 1
33
+ br label %loop
25
34
26
- for.cond.cleanup:
27
- ret void
35
+ loop:
36
+ %iv = phi i64 [ 1022 , %entry ], [ %iv.next , %loop ]
37
+ %gep.A = getelementptr inbounds i32 , ptr %A , i64 %iv
38
+ %l = load i32 , ptr %gep.A , align 4
39
+ %add = add nsw i32 %l , 1
40
+ %gep.A.plus.1 = getelementptr i32 , ptr %A.plus.1 , i64 %iv
41
+ store i32 %add , ptr %gep.A.plus.1 , align 4
42
+ %iv.next = add nsw i64 %iv , -1
43
+ %cmp.not = icmp eq i64 %iv , 0
44
+ br i1 %cmp.not , label %exit , label %loop
28
45
29
- for.body:
30
- %indvars.iv = phi i64 [ 1022 , %entry ], [ %indvars.iv.next , %for.body ]
31
- %arrayidx = getelementptr inbounds i32 , ptr %A , i64 %indvars.iv
32
- %0 = load i32 , ptr %arrayidx , align 4
33
- %add = add nsw i32 %0 , 1
34
- %gep = getelementptr i32 , ptr %invariant.gep , i64 %indvars.iv
35
- store i32 %add , ptr %gep , align 4
36
- %indvars.iv.next = add nsw i64 %indvars.iv , -1
37
- %cmp.not = icmp eq i64 %indvars.iv , 0
38
- br i1 %cmp.not , label %for.cond.cleanup , label %for.body
46
+ exit:
47
+ ret void
39
48
}
40
49
50
+ ; FIXME: There's a forward dependency that prevents forwarding here.
51
+ define void @neg_step_ForwardButPreventsForwarding (ptr nocapture %A , ptr noalias %B ) {
52
+ ; CHECK-LABEL: 'neg_step_ForwardButPreventsForwarding'
53
+ ; CHECK-NEXT: loop:
54
+ ; CHECK-NEXT: Memory dependences are safe
55
+ ; CHECK-NEXT: Dependences:
56
+ ; CHECK-NEXT: Forward:
57
+ ; CHECK-NEXT: store i32 0, ptr %gep.A, align 4 ->
58
+ ; CHECK-NEXT: %l = load i32, ptr %gep.A.plus.1, align 4
59
+ ; CHECK-EMPTY:
60
+ ; CHECK-NEXT: Run-time memory checks:
61
+ ; CHECK-NEXT: Grouped accesses:
62
+ ; CHECK-EMPTY:
63
+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
64
+ ; CHECK-NEXT: SCEV assumptions:
65
+ ; CHECK-EMPTY:
66
+ ; CHECK-NEXT: Expressions re-written:
67
+ ;
68
+ entry:
69
+ %A.plus.1 = getelementptr i32 , ptr %A , i64 1
70
+ br label %loop
71
+
72
+ loop:
73
+ %iv = phi i64 [ 1022 , %entry ], [ %iv.next , %loop ]
74
+ %gep.A = getelementptr inbounds i32 , ptr %A , i64 %iv
75
+ store i32 0 , ptr %gep.A , align 4
76
+ %gep.A.plus.1 = getelementptr i32 , ptr %A.plus.1 , i64 %iv
77
+ %l = load i32 , ptr %gep.A.plus.1 , align 4
78
+ store i32 %l , ptr %B
79
+ %iv.next = add nsw i64 %iv , -1
80
+ %cmp.not = icmp eq i64 %iv , 0
81
+ br i1 %cmp.not , label %exit , label %loop
82
+
83
+ exit:
84
+ ret void
85
+ }
0 commit comments