forked from llvm/llvm-project
- Notifications
You must be signed in to change notification settings - Fork 339
/
Copy pathforward-loop-independent.ll
79 lines (68 loc) · 3.09 KB
/
forward-loop-independent.ll
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes='print<access-info>' -disable-output < %s 2>&1 | FileCheck %s
; Check that loop-independent forward dependences are discovered properly.
;
; FIXME: This does not actually always work which is pretty confusing. Right
; now there is hack in LAA that tries to figure out loop-independent forward
; dependeces *outside* of the MemoryDepChecker logic (i.e. proper dependence
; analysis).
;
; Therefore if there is only loop-independent dependences for an array
; (i.e. the same index is used), we don't discover the forward dependence.
; So, at ***, we add another non-I-based access of A to trigger
; MemoryDepChecker analysis for accesses of A.
;
; for (unsigned i = 0; i < 100; i++) {
; A[i + 1] = B[i] + 1; // ***
; A[i] = B[i] + 2;
; C[i] = A[i] * 2;
; }
targetdatalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
definevoid@f(ptrnoalias%A, ptrnoalias%B, ptrnoalias%C, i64%N) {
; CHECK-LABEL: 'f'
; CHECK-NEXT: for.body:
; 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
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
; CHECK-NEXT: Dependences:
; CHECK-NEXT: Forward:
; CHECK-NEXT: store i32 %b_p1, ptr %Aidx, align 4 ->
; CHECK-NEXT: %a = load i32, ptr %Aidx, align 4
; CHECK-EMPTY:
; CHECK-NEXT: ForwardButPreventsForwarding:
; CHECK-NEXT: store i32 %b_p2, ptr %Aidx_next, align 4 ->
; CHECK-NEXT: %a = load i32, ptr %Aidx, align 4
; CHECK-EMPTY:
; CHECK-NEXT: Forward:
; CHECK-NEXT: store i32 %b_p2, ptr %Aidx_next, align 4 ->
; CHECK-NEXT: store i32 %b_p1, ptr %Aidx, align 4
; CHECK-EMPTY:
; CHECK-NEXT: Run-time memory checks:
; CHECK-NEXT: Grouped accesses:
; CHECK-EMPTY:
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
; CHECK-NEXT: SCEV assumptions:
; CHECK-EMPTY:
; CHECK-NEXT: Expressions re-written:
;
entry:
brlabel%for.body
for.body: ; preds = %for.body, %entry
%indvars.iv = phii64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
%indvars.iv.next = addnuwnswi64%indvars.iv, 1
%Bidx = getelementptrinboundsi32, ptr%B, i64%indvars.iv
%Cidx = getelementptrinboundsi32, ptr%C, i64%indvars.iv
%Aidx_next = getelementptrinboundsi32, ptr%A, i64%indvars.iv.next
%Aidx = getelementptrinboundsi32, ptr%A, i64%indvars.iv
%b = loadi32, ptr%Bidx, align4
%b_p2 = addi32%b, 1
storei32%b_p2, ptr%Aidx_next, align4
%b_p1 = addi32%b, 2
storei32%b_p1, ptr%Aidx, align4
%a = loadi32, ptr%Aidx, align4
%c = muli32%a, 2
storei32%c, ptr%Cidx, align4
%exitcond = icmpeqi64%indvars.iv.next, %N
bri1%exitcond, label%for.end, label%for.body
for.end: ; preds = %for.body
retvoid
}