1; RUN: opt %loadPolly -polly-detect-unprofitable -pass-remarks-missed="polly-detect" -polly-detect-track-failures -polly-detect -analyze < %s 2>&1| FileCheck %s 2 3; struct b { 4; double **b; 5; }; 6; 7; void a(struct b *A) { 8; for (int i=0; i<32; i++) 9; A->b[i] = 0; 10; } 11 12; CHECK: remark: ReportVariantBasePtr01.c:6:8: The following errors keep this region from being a Scop. 13; CHECK: remark: ReportVariantBasePtr01.c:7:5: The base address of this array is not invariant inside the loop 14 15target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 16target triple = "x86_64-unknown-linux-gnu" 17 18%struct.b = type { double** } 19 20define void @a(%struct.b* nocapture readonly %A) #0 { 21entry: 22 br label %entry.split 23 24entry.split: ; preds = %entry 25 tail call void @llvm.dbg.value(metadata %struct.b* %A, i64 0, metadata !16), !dbg !23 26 tail call void @llvm.dbg.value(metadata i32 0, i64 0, metadata !17), !dbg !25 27 %b = getelementptr inbounds %struct.b, %struct.b* %A, i64 0, i32 0, !dbg !26 28 br label %for.body, !dbg !27 29 30for.body: ; preds = %for.body, %entry.split 31 %indvar4 = phi i64 [ %indvar.next, %for.body ], [ 0, %entry.split ] 32 %0 = mul i64 %indvar4, 4, !dbg !26 33 %1 = add i64 %0, 3, !dbg !26 34 %2 = add i64 %0, 2, !dbg !26 35 %3 = add i64 %0, 1, !dbg !26 36 %4 = load double**, double*** %b, align 8, !dbg !26, !tbaa !28 37 %arrayidx = getelementptr double*, double** %4, i64 %0, !dbg !26 38 store double* null, double** %arrayidx, align 8, !dbg !26, !tbaa !33 39 %5 = load double**, double*** %b, align 8, !dbg !26, !tbaa !28 40 %arrayidx.1 = getelementptr double*, double** %5, i64 %3, !dbg !26 41 store double* null, double** %arrayidx.1, align 8, !dbg !26, !tbaa !33 42 %6 = load double**, double*** %b, align 8, !dbg !26, !tbaa !28 43 %arrayidx.2 = getelementptr double*, double** %6, i64 %2, !dbg !26 44 store double* null, double** %arrayidx.2, align 8, !dbg !26, !tbaa !33 45 %7 = load double**, double*** %b, align 8, !dbg !26, !tbaa !28 46 %arrayidx.3 = getelementptr double*, double** %7, i64 %1, !dbg !26 47 store double* null, double** %arrayidx.3, align 8, !dbg !26, !tbaa !33 48 %indvar.next = add i64 %indvar4, 1, !dbg !27 49 %exitcond = icmp eq i64 %indvar.next, 8, !dbg !27 50 br i1 %exitcond, label %for.end, label %for.body, !dbg !27 51 52for.end: ; preds = %for.body 53 ret void, !dbg !34 54} 55 56declare void @llvm.dbg.value(metadata, i64, metadata) #1 57 58attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 59attributes #1 = { nounwind readnone } 60 61!llvm.dbg.cu = !{!0} 62!llvm.module.flags = !{!20, !21} 63!llvm.ident = !{!22} 64 65!0 = !MDCompileUnit(language: DW_LANG_C99, producer: "clang version 3.5.0 ", isOptimized: true, emissionKind: 1, file: !1, enums: !2, retainedTypes: !2, subprograms: !3, globals: !2, imports: !2) 66!1 = !MDFile(filename: "ReportVariantBasePtr01.c", directory: "test/ScopDetectionDiagnostics") 67!2 = !{} 68!3 = !{!4} 69!4 = !MDSubprogram(name: "a", line: 5, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, scopeLine: 5, file: !1, scope: !5, type: !6, function: void (%struct.b*)* @a, variables: !15) 70!5 = !MDFile(filename: "ReportVariantBasePtr01.c", directory: "test/ScopDetectionDiagnostics") 71!6 = !MDSubroutineType(types: !7) 72!7 = !{null, !8} 73!8 = !MDDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !9) 74!9 = !MDCompositeType(tag: DW_TAG_structure_type, name: "b", line: 1, size: 64, align: 64, file: !1, elements: !10) 75!10 = !{!11} 76!11 = !MDDerivedType(tag: DW_TAG_member, name: "b", line: 2, size: 64, align: 64, file: !1, scope: !9, baseType: !12) 77!12 = !MDDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !13) 78!13 = !MDDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !14) 79!14 = !MDBasicType(tag: DW_TAG_base_type, name: "double", size: 64, align: 64, encoding: DW_ATE_float) 80!15 = !{!16, !17} 81!16 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "A", line: 5, arg: 1, scope: !4, file: !5, type: !8) 82!17 = !MDLocalVariable(tag: DW_TAG_auto_variable, name: "i", line: 6, scope: !18, file: !5, type: !19) 83!18 = distinct !MDLexicalBlock(line: 6, column: 3, file: !1, scope: !4) 84!19 = !MDBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) 85!20 = !{i32 2, !"Dwarf Version", i32 4} 86!21 = !{i32 2, !"Debug Info Version", i32 3} 87!22 = !{!"clang version 3.5.0 "} 88!23 = !MDLocation(line: 5, column: 18, scope: !4) 89!24 = !{i32 0} 90!25 = !MDLocation(line: 6, column: 12, scope: !18) 91!26 = !MDLocation(line: 7, column: 5, scope: !18) 92!27 = !MDLocation(line: 6, column: 8, scope: !18) 93!28 = !{!29, !30, i64 0} 94!29 = !{!"b", !30, i64 0} 95!30 = !{!"any pointer", !31, i64 0} 96!31 = !{!"omnipotent char", !32, i64 0} 97!32 = !{!"Simple C/C++ TBAA"} 98!33 = !{!30, !30, i64 0} 99!34 = !MDLocation(line: 8, column: 1, scope: !4) 100