xref: /aosp_15_r20/external/llvm/test/Transforms/LoopDistribute/diagnostics.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -loop-distribute -S < %s 2>&1 \
2*9880d681SAndroid Build Coastguard Worker; RUN:     | FileCheck %s --check-prefix=ALWAYS --check-prefix=NO_REMARKS
3*9880d681SAndroid Build Coastguard Worker; RUN: opt -loop-distribute -S -pass-remarks-missed=loop-distribute < %s 2>&1 \
4*9880d681SAndroid Build Coastguard Worker; RUN:     | FileCheck %s --check-prefix=ALWAYS --check-prefix=MISSED_REMARKS
5*9880d681SAndroid Build Coastguard Worker; RUN: opt -loop-distribute -S -pass-remarks-analysis=loop-distribute < %s 2>&1 \
6*9880d681SAndroid Build Coastguard Worker; RUN:     | FileCheck %s --check-prefix=ALWAYS --check-prefix=ANALYSIS_REMARKS
7*9880d681SAndroid Build Coastguard Worker; RUN: opt -loop-distribute -S -pass-remarks=loop-distribute < %s 2>&1 \
8*9880d681SAndroid Build Coastguard Worker; RUN:     | FileCheck %s --check-prefix=ALWAYS --check-prefix=REMARKS
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; This is the input program:
11*9880d681SAndroid Build Coastguard Worker;
12*9880d681SAndroid Build Coastguard Worker;     1	void forced (char *A, char *B, char *C, int N) {
13*9880d681SAndroid Build Coastguard Worker;     2	#pragma clang loop distribute(enable)
14*9880d681SAndroid Build Coastguard Worker;     3	  for(int i = 0; i < N; i++) {
15*9880d681SAndroid Build Coastguard Worker;     4	    A[i] = B[i] * C[i];
16*9880d681SAndroid Build Coastguard Worker;     5	  }
17*9880d681SAndroid Build Coastguard Worker;     6	}
18*9880d681SAndroid Build Coastguard Worker;     7
19*9880d681SAndroid Build Coastguard Worker;     8	void not_forced (char *A, char *B, char *C, int N) {
20*9880d681SAndroid Build Coastguard Worker;     9	  for(int i = 0; i < N; i++) {
21*9880d681SAndroid Build Coastguard Worker;    10	    A[i] = B[i] * C[i];
22*9880d681SAndroid Build Coastguard Worker;    11	  }
23*9880d681SAndroid Build Coastguard Worker;    12	}
24*9880d681SAndroid Build Coastguard Worker;    13
25*9880d681SAndroid Build Coastguard Worker;    14 void success (char *A, char *B, char *C, char *D, char *E, int N) {
26*9880d681SAndroid Build Coastguard Worker;    15   for(int i = 0; i < N; i++) {
27*9880d681SAndroid Build Coastguard Worker;    16     A[i + 1] = A[i] + B[i];
28*9880d681SAndroid Build Coastguard Worker;    17     C[i] = D[i] * E[i];
29*9880d681SAndroid Build Coastguard Worker;    18   }
30*9880d681SAndroid Build Coastguard Worker;    19 }
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
33*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-macosx10.11.0"
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; MISSED_REMARKS: remark:  /tmp/t.c:3:3: loop not distributed: use -Rpass-analysis=loop-distribute for more info
36*9880d681SAndroid Build Coastguard Worker; ALWAYS:         remark: /tmp/t.c:3:3: loop not distributed: memory operations are safe for vectorization
37*9880d681SAndroid Build Coastguard Worker; ALWAYS:         warning: /tmp/t.c:3:3: loop not disributed: failed explicitly specified loop distribution
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine void @forced(i8* %A, i8* %B, i8* %C, i32 %N) !dbg !7 {
40*9880d681SAndroid Build Coastguard Workerentry:
41*9880d681SAndroid Build Coastguard Worker  %cmp12 = icmp sgt i32 %N, 0, !dbg !9
42*9880d681SAndroid Build Coastguard Worker  br i1 %cmp12, label %ph, label %for.cond.cleanup, !dbg !10
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerph:
45*9880d681SAndroid Build Coastguard Worker  br label %for.body
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerfor.body:
48*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %ph ]
49*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %B, i64 %indvars.iv, !dbg !12
50*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %arrayidx, align 1, !dbg !12, !tbaa !13
51*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i8, i8* %C, i64 %indvars.iv, !dbg !16
52*9880d681SAndroid Build Coastguard Worker  %1 = load i8, i8* %arrayidx2, align 1, !dbg !16, !tbaa !13
53*9880d681SAndroid Build Coastguard Worker  %mul = mul i8 %1, %0, !dbg !17
54*9880d681SAndroid Build Coastguard Worker  %arrayidx6 = getelementptr inbounds i8, i8* %A, i64 %indvars.iv, !dbg !18
55*9880d681SAndroid Build Coastguard Worker  store i8 %mul, i8* %arrayidx6, align 1, !dbg !19, !tbaa !13
56*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1, !dbg !10
57*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32, !dbg !10
58*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %lftr.wideiv, %N, !dbg !10
59*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.cond.cleanup, label %for.body, !dbg !10, !llvm.loop !20
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:
62*9880d681SAndroid Build Coastguard Worker  ret void, !dbg !11
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker; NO_REMARKS-NOT: remark: /tmp/t.c:9:3: loop not distributed: memory operations are safe for vectorization
66*9880d681SAndroid Build Coastguard Worker; MISSED_REMARKS: remark: /tmp/t.c:9:3: loop not distributed: use -Rpass-analysis=loop-distribute for more info
67*9880d681SAndroid Build Coastguard Worker; ANALYSIS_REMARKS: remark: /tmp/t.c:9:3: loop not distributed: memory operations are safe for vectorization
68*9880d681SAndroid Build Coastguard Worker; ALWAYS-NOT: warning: /tmp/t.c:9:3: loop not disributed: failed explicitly specified loop distribution
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerdefine void @not_forced(i8* %A, i8* %B, i8* %C, i32 %N) !dbg !22 {
71*9880d681SAndroid Build Coastguard Workerentry:
72*9880d681SAndroid Build Coastguard Worker  %cmp12 = icmp sgt i32 %N, 0, !dbg !23
73*9880d681SAndroid Build Coastguard Worker  br i1 %cmp12, label %ph, label %for.cond.cleanup, !dbg !24
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerph:
76*9880d681SAndroid Build Coastguard Worker  br label %for.body
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerfor.body:
79*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %ph ]
80*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %B, i64 %indvars.iv, !dbg !26
81*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %arrayidx, align 1, !dbg !26, !tbaa !13
82*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i8, i8* %C, i64 %indvars.iv, !dbg !27
83*9880d681SAndroid Build Coastguard Worker  %1 = load i8, i8* %arrayidx2, align 1, !dbg !27, !tbaa !13
84*9880d681SAndroid Build Coastguard Worker  %mul = mul i8 %1, %0, !dbg !28
85*9880d681SAndroid Build Coastguard Worker  %arrayidx6 = getelementptr inbounds i8, i8* %A, i64 %indvars.iv, !dbg !29
86*9880d681SAndroid Build Coastguard Worker  store i8 %mul, i8* %arrayidx6, align 1, !dbg !30, !tbaa !13
87*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1, !dbg !24
88*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32, !dbg !24
89*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %lftr.wideiv, %N, !dbg !24
90*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.cond.cleanup, label %for.body, !dbg !24
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:
93*9880d681SAndroid Build Coastguard Worker  ret void, !dbg !25
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; REMARKS: remark: /tmp/t.c:15:3: distributed loop
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdefine void @success(i8* %A, i8* %B, i8* %C, i8* %D, i8* %E, i32 %N) !dbg !31 {
99*9880d681SAndroid Build Coastguard Workerentry:
100*9880d681SAndroid Build Coastguard Worker  %cmp28 = icmp sgt i32 %N, 0, !dbg !32
101*9880d681SAndroid Build Coastguard Worker  br i1 %cmp28, label %ph, label %for.cond.cleanup, !dbg !33
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerph:
104*9880d681SAndroid Build Coastguard Worker  br label %for.body
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerfor.body:
107*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %ph ]
108*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %A, i64 %indvars.iv, !dbg !35
109*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %arrayidx, align 1, !dbg !35, !tbaa !13
110*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i8, i8* %B, i64 %indvars.iv, !dbg !36
111*9880d681SAndroid Build Coastguard Worker  %1 = load i8, i8* %arrayidx2, align 1, !dbg !36, !tbaa !13
112*9880d681SAndroid Build Coastguard Worker  %add = add i8 %1, %0, !dbg !37
113*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1, !dbg !33
114*9880d681SAndroid Build Coastguard Worker  %arrayidx7 = getelementptr inbounds i8, i8* %A, i64 %indvars.iv.next, !dbg !38
115*9880d681SAndroid Build Coastguard Worker  store i8 %add, i8* %arrayidx7, align 1, !dbg !39, !tbaa !13
116*9880d681SAndroid Build Coastguard Worker  %arrayidx9 = getelementptr inbounds i8, i8* %D, i64 %indvars.iv, !dbg !40
117*9880d681SAndroid Build Coastguard Worker  %2 = load i8, i8* %arrayidx9, align 1, !dbg !40, !tbaa !13
118*9880d681SAndroid Build Coastguard Worker  %arrayidx12 = getelementptr inbounds i8, i8* %E, i64 %indvars.iv, !dbg !41
119*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %arrayidx12, align 1, !dbg !41, !tbaa !13
120*9880d681SAndroid Build Coastguard Worker  %mul = mul i8 %3, %2, !dbg !42
121*9880d681SAndroid Build Coastguard Worker  %arrayidx16 = getelementptr inbounds i8, i8* %C, i64 %indvars.iv, !dbg !43
122*9880d681SAndroid Build Coastguard Worker  store i8 %mul, i8* %arrayidx16, align 1, !dbg !44, !tbaa !13
123*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32, !dbg !33
124*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %lftr.wideiv, %N, !dbg !33
125*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.cond.cleanup, label %for.body, !dbg !33
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:
128*9880d681SAndroid Build Coastguard Worker  ret void, !dbg !34
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker!llvm.dbg.cu = !{!0}
132*9880d681SAndroid Build Coastguard Worker!llvm.module.flags = !{!3, !4}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.9.0 (trunk 267633) (llvm/trunk 267675)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2)
135*9880d681SAndroid Build Coastguard Worker!1 = !DIFile(filename: "/tmp/t.c", directory: "/tmp")
136*9880d681SAndroid Build Coastguard Worker!2 = !{}
137*9880d681SAndroid Build Coastguard Worker!3 = !{i32 2, !"Dwarf Version", i32 2}
138*9880d681SAndroid Build Coastguard Worker!4 = !{i32 2, !"Debug Info Version", i32 3}
139*9880d681SAndroid Build Coastguard Worker!7 = distinct !DISubprogram(name: "forced", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2)
140*9880d681SAndroid Build Coastguard Worker!8 = !DISubroutineType(types: !2)
141*9880d681SAndroid Build Coastguard Worker!9 = !DILocation(line: 3, column: 20, scope: !7)
142*9880d681SAndroid Build Coastguard Worker!10 = !DILocation(line: 3, column: 3, scope: !7)
143*9880d681SAndroid Build Coastguard Worker!11 = !DILocation(line: 6, column: 1, scope: !7)
144*9880d681SAndroid Build Coastguard Worker!12 = !DILocation(line: 4, column: 12, scope: !7)
145*9880d681SAndroid Build Coastguard Worker!13 = !{!14, !14, i64 0}
146*9880d681SAndroid Build Coastguard Worker!14 = !{!"omnipotent char", !15, i64 0}
147*9880d681SAndroid Build Coastguard Worker!15 = !{!"Simple C/C++ TBAA"}
148*9880d681SAndroid Build Coastguard Worker!16 = !DILocation(line: 4, column: 19, scope: !7)
149*9880d681SAndroid Build Coastguard Worker!17 = !DILocation(line: 4, column: 17, scope: !7)
150*9880d681SAndroid Build Coastguard Worker!18 = !DILocation(line: 4, column: 5, scope: !7)
151*9880d681SAndroid Build Coastguard Worker!19 = !DILocation(line: 4, column: 10, scope: !7)
152*9880d681SAndroid Build Coastguard Worker!20 = distinct !{!20, !21}
153*9880d681SAndroid Build Coastguard Worker!21 = !{!"llvm.loop.distribute.enable", i1 true}
154*9880d681SAndroid Build Coastguard Worker!22 = distinct !DISubprogram(name: "not_forced", scope: !1, file: !1, line: 8, type: !8, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2)
155*9880d681SAndroid Build Coastguard Worker!23 = !DILocation(line: 9, column: 20, scope: !22)
156*9880d681SAndroid Build Coastguard Worker!24 = !DILocation(line: 9, column: 3, scope: !22)
157*9880d681SAndroid Build Coastguard Worker!25 = !DILocation(line: 12, column: 1, scope: !22)
158*9880d681SAndroid Build Coastguard Worker!26 = !DILocation(line: 10, column: 12, scope: !22)
159*9880d681SAndroid Build Coastguard Worker!27 = !DILocation(line: 10, column: 19, scope: !22)
160*9880d681SAndroid Build Coastguard Worker!28 = !DILocation(line: 10, column: 17, scope: !22)
161*9880d681SAndroid Build Coastguard Worker!29 = !DILocation(line: 10, column: 5, scope: !22)
162*9880d681SAndroid Build Coastguard Worker!30 = !DILocation(line: 10, column: 10, scope: !22)
163*9880d681SAndroid Build Coastguard Worker!31 = distinct !DISubprogram(name: "success", scope: !1, file: !1, line: 14, type: !8, isLocal: false, isDefinition: true, scopeLine: 14, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2)
164*9880d681SAndroid Build Coastguard Worker!32 = !DILocation(line: 15, column: 20, scope: !31)
165*9880d681SAndroid Build Coastguard Worker!33 = !DILocation(line: 15, column: 3, scope: !31)
166*9880d681SAndroid Build Coastguard Worker!34 = !DILocation(line: 19, column: 1, scope: !31)
167*9880d681SAndroid Build Coastguard Worker!35 = !DILocation(line: 16, column: 16, scope: !31)
168*9880d681SAndroid Build Coastguard Worker!36 = !DILocation(line: 16, column: 23, scope: !31)
169*9880d681SAndroid Build Coastguard Worker!37 = !DILocation(line: 16, column: 21, scope: !31)
170*9880d681SAndroid Build Coastguard Worker!38 = !DILocation(line: 16, column: 5, scope: !31)
171*9880d681SAndroid Build Coastguard Worker!39 = !DILocation(line: 16, column: 14, scope: !31)
172*9880d681SAndroid Build Coastguard Worker!40 = !DILocation(line: 17, column: 12, scope: !31)
173*9880d681SAndroid Build Coastguard Worker!41 = !DILocation(line: 17, column: 19, scope: !31)
174*9880d681SAndroid Build Coastguard Worker!42 = !DILocation(line: 17, column: 17, scope: !31)
175*9880d681SAndroid Build Coastguard Worker!43 = !DILocation(line: 17, column: 5, scope: !31)
176*9880d681SAndroid Build Coastguard Worker!44 = !DILocation(line: 17, column: 10, scope: !31)
177