1- ; RUN: opt -passes='print<access-info>' -disable-output < %s 2>&1 | FileCheck %s
1+ ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2+ ; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
23
34; Analyze this loop:
45; for (i = 0; i < n; i++)
56; A[i + 1] = A[i] * B[i] * C[i];
67
7- target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
8-
9- ; CHECK: for.body:
10- ; CHECK: Has convergent operation in loop
11- ; CHECK: Report: cannot add control dependency to convergent operation
12- ; CHECK-NEXT: Dependences:
13- ; CHECK-NEXT: Backward:
14- ; CHECK-NEXT: %loadA = load i16, ptr %arrayidxA, align 2 ->
15- ; CHECK-NEXT: store i16 %mul1, ptr %arrayidxA_plus_2, align 2
16- ; CHECK: Run-time memory checks:
17- ; CHECK-NEXT: 0:
18- ; CHECK-NEXT: Comparing group
19- ; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, ptr %a, i64 %storemerge3
20- ; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, ptr %a, i64 %add
21- ; CHECK-NEXT: Against group
22- ; CHECK-NEXT: %arrayidxB = getelementptr inbounds i16, ptr %b, i64 %storemerge3
23- ; CHECK-NEXT: 1:
24- ; CHECK-NEXT: Comparing group
25- ; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, ptr %a, i64 %storemerge3
26- ; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, ptr %a, i64 %add
27- ; CHECK-NEXT: Against group
28- ; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, ptr %c, i64 %storemerge3
29-
30- @B = common global ptr null , align 8
31- @A = common global ptr null , align 8
32- @C = common global ptr null , align 8
33-
34- define void @f () #1 {
8+ define void @rtchecks_needed (ptr %a , ptr %b , ptr %c ) {
9+ ; CHECK-LABEL: 'rtchecks_needed'
10+ ; CHECK-NEXT: for.body:
11+ ; CHECK-NEXT: Has convergent operation in loop
12+ ; CHECK-NEXT: Report: cannot add control dependency to convergent operation
13+ ; CHECK-NEXT: Dependences:
14+ ; CHECK-NEXT: Backward:
15+ ; CHECK-NEXT: %loadA = load i16, ptr %arrayidxA, align 2 ->
16+ ; CHECK-NEXT: store i16 %mul1, ptr %arrayidxA_plus_2, align 2
17+ ; CHECK-EMPTY:
18+ ; CHECK-NEXT: Run-time memory checks:
19+ ; CHECK-NEXT: Check 0:
20+ ; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
21+ ; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, ptr %a, i64 %storemerge3
22+ ; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, ptr %a, i64 %add
23+ ; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
24+ ; CHECK-NEXT: %arrayidxB = getelementptr inbounds i16, ptr %b, i64 %storemerge3
25+ ; CHECK-NEXT: Check 1:
26+ ; CHECK-NEXT: Comparing group ([[GRP1]]):
27+ ; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, ptr %a, i64 %storemerge3
28+ ; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, ptr %a, i64 %add
29+ ; CHECK-NEXT: Against group ([[GRP3:0x[0-9a-f]+]]):
30+ ; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, ptr %c, i64 %storemerge3
31+ ; CHECK-NEXT: Grouped accesses:
32+ ; CHECK-NEXT: Group [[GRP1]]:
33+ ; CHECK-NEXT: (Low: %a High: (42 + %a))
34+ ; CHECK-NEXT: Member: {%a,+,2}<nuw><%for.body>
35+ ; CHECK-NEXT: Member: {(2 + %a),+,2}<nw><%for.body>
36+ ; CHECK-NEXT: Group [[GRP2]]:
37+ ; CHECK-NEXT: (Low: %b High: (40 + %b))
38+ ; CHECK-NEXT: Member: {%b,+,2}<nuw><%for.body>
39+ ; CHECK-NEXT: Group [[GRP3]]:
40+ ; CHECK-NEXT: (Low: %c High: (40 + %c))
41+ ; CHECK-NEXT: Member: {%c,+,2}<nuw><%for.body>
42+ ; CHECK-EMPTY:
43+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
44+ ; CHECK-NEXT: SCEV assumptions:
45+ ; CHECK-EMPTY:
46+ ; CHECK-NEXT: Expressions re-written:
47+ ;
3548entry:
36- %a = load ptr , ptr @A , align 8
37- %b = load ptr , ptr @B , align 8
38- %c = load ptr , ptr @C , align 8
3949 br label %for.body
4050
4151for.body: ; preds = %for.body, %entry
@@ -50,7 +60,7 @@ for.body: ; preds = %for.body, %entry
5060 %arrayidxC = getelementptr inbounds i16 , ptr %c , i64 %storemerge3
5161 %loadC = load i16 , ptr %arrayidxC , align 2
5262
53- call void @llvm.convergent ()
63+ call i16 @llvm.convergent (i16 %loadC )
5464
5565 %mul = mul i16 %loadB , %loadA
5666 %mul1 = mul i16 %mul , %loadC
@@ -66,7 +76,61 @@ for.end: ; preds = %for.body
6676 ret void
6777}
6878
69- declare void @llvm.convergent () #0
79+ define void @no_rtchecks (ptr noalias %a , ptr noalias %b , ptr noalias %c , ptr noalias %d , ptr noalias %e ) {
80+ ; CHECK-LABEL: 'no_rtchecks'
81+ ; CHECK-NEXT: for.body:
82+ ; CHECK-NEXT: Has convergent operation in loop
83+ ; CHECK-NEXT: Report: cannot add control dependency to convergent operation
84+ ; CHECK-NEXT: Dependences:
85+ ; CHECK-NEXT: Backward:
86+ ; CHECK-NEXT: %loadA = load i16, ptr %arrayidxA, align 4 ->
87+ ; CHECK-NEXT: store i16 %mulA, ptr %arrayidxA_plus_4, align 4
88+ ; CHECK-EMPTY:
89+ ; CHECK-NEXT: Run-time memory checks:
90+ ; CHECK-NEXT: Grouped accesses:
91+ ; CHECK-EMPTY:
92+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
93+ ; CHECK-NEXT: SCEV assumptions:
94+ ; CHECK-EMPTY:
95+ ; CHECK-NEXT: Expressions re-written:
96+ ;
97+ entry:
98+ br label %for.body
99+
100+ for.body: ; preds = %for.body, %entry
101+ %ind = phi i64 [ 0 , %entry ], [ %add , %for.body ]
102+
103+ %arrayidxA = getelementptr inbounds i16 , ptr %a , i64 %ind
104+ %loadA = load i16 , ptr %arrayidxA , align 4
105+
106+ %arrayidxB = getelementptr inbounds i16 , ptr %b , i64 %ind
107+ %loadB = load i16 , ptr %arrayidxB , align 4
108+
109+ %mulA = mul i16 %loadB , %loadA
110+
111+ %add = add nuw nsw i64 %ind , 1
112+ %arrayidxA_plus_4 = getelementptr inbounds i16 , ptr %a , i64 %add
113+ store i16 %mulA , ptr %arrayidxA_plus_4 , align 4
114+
115+ %arrayidxD = getelementptr inbounds i16 , ptr %d , i64 %ind
116+ %loadD = load i16 , ptr %arrayidxD , align 4
117+
118+ %arrayidxE = getelementptr inbounds i16 , ptr %e , i64 %ind
119+ %loadE = load i16 , ptr %arrayidxE , align 4
120+
121+ %convergentD = call i16 @llvm.convergent (i16 %loadD )
122+ %mulC = mul i16 %convergentD , %loadE
123+
124+ %arrayidxC = getelementptr inbounds i16 , ptr %c , i64 %ind
125+ store i16 %mulC , ptr %arrayidxC , align 4
126+
127+ %exitcond = icmp eq i64 %add , 20
128+ br i1 %exitcond , label %for.end , label %for.body
129+
130+ for.end: ; preds = %for.body
131+ ret void
132+ }
133+
134+ declare i16 @llvm.convergent (i16 ) #0
70135
71136attributes #0 = { nounwind readnone convergent }
72- attributes #1 = { nounwind convergent }
0 commit comments