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