xref: /aosp_15_r20/external/llvm/test/Transforms/LoopDistribute/metadata.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -basicaa -loop-distribute -enable-loop-distribute=0 -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=EXPLICIT --check-prefix=DEFAULT_OFF
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -basicaa -loop-distribute -enable-loop-distribute=1 -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=EXPLICIT --check-prefix=DEFAULT_ON
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Same loop as in basic.ll.  Check that distribution is enabled/disabled
5*9880d681SAndroid Build Coastguard Worker; properly according to -enable-loop-distribute=0/1 and the
6*9880d681SAndroid Build Coastguard Worker; llvm.loop.distribute.enable metadata.
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
9*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-macosx10.10.0"
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @explicit_on(
12*9880d681SAndroid Build Coastguard Workerdefine void @explicit_on(i32* noalias %a,
13*9880d681SAndroid Build Coastguard Worker                         i32* noalias %b,
14*9880d681SAndroid Build Coastguard Worker                         i32* noalias %c,
15*9880d681SAndroid Build Coastguard Worker                         i32* noalias %d,
16*9880d681SAndroid Build Coastguard Worker                         i32* noalias %e) {
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker  br label %for.body
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; EXPLICIT: for.body.ldist1:
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
23*9880d681SAndroid Build Coastguard Worker  %ind = phi i64 [ 0, %entry ], [ %add, %for.body ]
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker  %arrayidxA = getelementptr inbounds i32, i32* %a, i64 %ind
26*9880d681SAndroid Build Coastguard Worker  %loadA = load i32, i32* %arrayidxA, align 4
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker  %arrayidxB = getelementptr inbounds i32, i32* %b, i64 %ind
29*9880d681SAndroid Build Coastguard Worker  %loadB = load i32, i32* %arrayidxB, align 4
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  %mulA = mul i32 %loadB, %loadA
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker  %add = add nuw nsw i64 %ind, 1
34*9880d681SAndroid Build Coastguard Worker  %arrayidxA_plus_4 = getelementptr inbounds i32, i32* %a, i64 %add
35*9880d681SAndroid Build Coastguard Worker  store i32 %mulA, i32* %arrayidxA_plus_4, align 4
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker  %arrayidxD = getelementptr inbounds i32, i32* %d, i64 %ind
38*9880d681SAndroid Build Coastguard Worker  %loadD = load i32, i32* %arrayidxD, align 4
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker  %arrayidxE = getelementptr inbounds i32, i32* %e, i64 %ind
41*9880d681SAndroid Build Coastguard Worker  %loadE = load i32, i32* %arrayidxE, align 4
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker  %mulC = mul i32 %loadD, %loadE
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker  %arrayidxC = getelementptr inbounds i32, i32* %c, i64 %ind
46*9880d681SAndroid Build Coastguard Worker  store i32 %mulC, i32* %arrayidxC, align 4
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %add, 20
49*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !0
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
52*9880d681SAndroid Build Coastguard Worker  ret void
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @explicit_off(
56*9880d681SAndroid Build Coastguard Workerdefine void @explicit_off(i32* noalias %a,
57*9880d681SAndroid Build Coastguard Worker                         i32* noalias %b,
58*9880d681SAndroid Build Coastguard Worker                         i32* noalias %c,
59*9880d681SAndroid Build Coastguard Worker                         i32* noalias %d,
60*9880d681SAndroid Build Coastguard Worker                         i32* noalias %e) {
61*9880d681SAndroid Build Coastguard Workerentry:
62*9880d681SAndroid Build Coastguard Worker  br label %for.body
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; EXPLICIT-NOT: for.body.ldist1:
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
67*9880d681SAndroid Build Coastguard Worker  %ind = phi i64 [ 0, %entry ], [ %add, %for.body ]
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker  %arrayidxA = getelementptr inbounds i32, i32* %a, i64 %ind
70*9880d681SAndroid Build Coastguard Worker  %loadA = load i32, i32* %arrayidxA, align 4
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker  %arrayidxB = getelementptr inbounds i32, i32* %b, i64 %ind
73*9880d681SAndroid Build Coastguard Worker  %loadB = load i32, i32* %arrayidxB, align 4
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker  %mulA = mul i32 %loadB, %loadA
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker  %add = add nuw nsw i64 %ind, 1
78*9880d681SAndroid Build Coastguard Worker  %arrayidxA_plus_4 = getelementptr inbounds i32, i32* %a, i64 %add
79*9880d681SAndroid Build Coastguard Worker  store i32 %mulA, i32* %arrayidxA_plus_4, align 4
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker  %arrayidxD = getelementptr inbounds i32, i32* %d, i64 %ind
82*9880d681SAndroid Build Coastguard Worker  %loadD = load i32, i32* %arrayidxD, align 4
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  %arrayidxE = getelementptr inbounds i32, i32* %e, i64 %ind
85*9880d681SAndroid Build Coastguard Worker  %loadE = load i32, i32* %arrayidxE, align 4
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker  %mulC = mul i32 %loadD, %loadE
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker  %arrayidxC = getelementptr inbounds i32, i32* %c, i64 %ind
90*9880d681SAndroid Build Coastguard Worker  store i32 %mulC, i32* %arrayidxC, align 4
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %add, 20
93*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !2
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
96*9880d681SAndroid Build Coastguard Worker  ret void
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @default_distribute(
100*9880d681SAndroid Build Coastguard Workerdefine void @default_distribute(i32* noalias %a,
101*9880d681SAndroid Build Coastguard Worker               i32* noalias %b,
102*9880d681SAndroid Build Coastguard Worker               i32* noalias %c,
103*9880d681SAndroid Build Coastguard Worker               i32* noalias %d,
104*9880d681SAndroid Build Coastguard Worker               i32* noalias %e) {
105*9880d681SAndroid Build Coastguard Workerentry:
106*9880d681SAndroid Build Coastguard Worker  br label %for.body
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker; Verify the two distributed loops.
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; DEFAULT_ON: for.body.ldist1:
111*9880d681SAndroid Build Coastguard Worker; DEFAULT_OFF-NOT: for.body.ldist1:
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
114*9880d681SAndroid Build Coastguard Worker  %ind = phi i64 [ 0, %entry ], [ %add, %for.body ]
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker  %arrayidxA = getelementptr inbounds i32, i32* %a, i64 %ind
117*9880d681SAndroid Build Coastguard Worker  %loadA = load i32, i32* %arrayidxA, align 4
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker  %arrayidxB = getelementptr inbounds i32, i32* %b, i64 %ind
120*9880d681SAndroid Build Coastguard Worker  %loadB = load i32, i32* %arrayidxB, align 4
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker  %mulA = mul i32 %loadB, %loadA
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker  %add = add nuw nsw i64 %ind, 1
125*9880d681SAndroid Build Coastguard Worker  %arrayidxA_plus_4 = getelementptr inbounds i32, i32* %a, i64 %add
126*9880d681SAndroid Build Coastguard Worker  store i32 %mulA, i32* %arrayidxA_plus_4, align 4
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker  %arrayidxD = getelementptr inbounds i32, i32* %d, i64 %ind
129*9880d681SAndroid Build Coastguard Worker  %loadD = load i32, i32* %arrayidxD, align 4
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker  %arrayidxE = getelementptr inbounds i32, i32* %e, i64 %ind
132*9880d681SAndroid Build Coastguard Worker  %loadE = load i32, i32* %arrayidxE, align 4
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker  %mulC = mul i32 %loadD, %loadE
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker  %arrayidxC = getelementptr inbounds i32, i32* %c, i64 %ind
137*9880d681SAndroid Build Coastguard Worker  store i32 %mulC, i32* %arrayidxC, align 4
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %add, 20
140*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
143*9880d681SAndroid Build Coastguard Worker  ret void
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker!0 = distinct !{!0, !1}
147*9880d681SAndroid Build Coastguard Worker!1 = !{!"llvm.loop.distribute.enable", i1 true}
148*9880d681SAndroid Build Coastguard Worker!2 = distinct !{!2, !3}
149*9880d681SAndroid Build Coastguard Worker!3 = !{!"llvm.loop.distribute.enable", i1 false}
150