176 lines · plain
1; RUN: opt -passes=sroa -S %s -o - | FileCheck %s2 3;; Check that multiple dbg.assign intrinsics linked to a store that is getting4;; split (or at least that is touched by SROA, causing a replacement store to5;; be generated) are still both linked to the new store(s).6;;7;; Additionally, check that SROA inserts new dbg.assign intrinsics by the8;; originals.9 10;; $ cat test.cpp11;; class a {12;; public:13;; a(int, float &) {}14;; };15;; float b, d;16;; int c;17;; void f() {18;; float e;19;; if (c)20;; e = b;21;; else22;; e = b / d;23;; a(c, e);24;; }25;;26;; Generated by grabbing IR before sroa in:27;; $ clang++ -O2 -g -c test.cpp -Xclang -fexperimental-assignment-tracking 28 29; CHECK: if.then:30; CHECK-NEXT: %1 = load float31; CHECK-NEXT: #dbg_value(float %storemerge, ![[var:[0-9]+]], !DIExpression(),32 33; CHECK: if.else:34; CHECK-NEXT: %2 = load float35; CHECK-NEXT: %3 = load float36; CHECK-NEXT: %div = fdiv float37; CHECK: #dbg_value(float %storemerge, ![[var]], !DIExpression(),38 39%class.a = type { i8 }40 41$_ZN1aC2EiRf = comdat any42 43@b = dso_local local_unnamed_addr global float 0.000000e+00, align 4, !dbg !044@d = dso_local local_unnamed_addr global float 0.000000e+00, align 4, !dbg !645@c = dso_local local_unnamed_addr global i32 0, align 4, !dbg !946 47; Function Attrs: nounwind readonly uwtable48define dso_local void @_Z1fv() local_unnamed_addr #0 !dbg !16 {49entry:50 %e = alloca float, align 4, !DIAssignID !2151 call void @llvm.dbg.assign(metadata i1 undef, metadata !20, metadata !DIExpression(), metadata !21, metadata ptr %e, metadata !DIExpression()), !dbg !2252 %agg.tmp.ensured = alloca %class.a, align 153 %0 = bitcast ptr %e to ptr, !dbg !2354 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %0) #4, !dbg !2355 %1 = load i32, ptr @c, align 4, !dbg !2456 %tobool.not = icmp eq i32 %1, 0, !dbg !2457 br i1 %tobool.not, label %if.else, label %if.then, !dbg !3058 59if.then: ; preds = %entry60 %2 = load float, ptr @b, align 4, !dbg !3161 call void @llvm.dbg.assign(metadata float %2, metadata !20, metadata !DIExpression(), metadata !34, metadata ptr %e, metadata !DIExpression()), !dbg !2262 br label %if.end, !dbg !3563 64if.else: ; preds = %entry65 %3 = load float, ptr @b, align 4, !dbg !3666 %4 = load float, ptr @d, align 4, !dbg !3767 %div = fdiv float %3, %4, !dbg !3868 call void @llvm.dbg.assign(metadata float %div, metadata !20, metadata !DIExpression(), metadata !34, metadata ptr %e, metadata !DIExpression()), !dbg !2269 br label %if.end70 71if.end: ; preds = %if.else, %if.then72 %storemerge = phi float [ %div, %if.else ], [ %2, %if.then ], !dbg !3973 store float %storemerge, ptr %e, align 4, !dbg !39, !DIAssignID !3474 %5 = load i32, ptr @c, align 4, !dbg !4075 call void @llvm.dbg.assign(metadata i1 undef, metadata !41, metadata !DIExpression(), metadata !54, metadata ptr undef, metadata !DIExpression()), !dbg !5576 call void @llvm.dbg.assign(metadata i1 undef, metadata !51, metadata !DIExpression(), metadata !57, metadata ptr undef, metadata !DIExpression()), !dbg !5577 call void @llvm.dbg.assign(metadata i1 undef, metadata !52, metadata !DIExpression(), metadata !58, metadata ptr undef, metadata !DIExpression()), !dbg !5578 call void @llvm.dbg.assign(metadata ptr %agg.tmp.ensured, metadata !41, metadata !DIExpression(), metadata !59, metadata ptr undef, metadata !DIExpression()), !dbg !5579 call void @llvm.dbg.assign(metadata i32 %5, metadata !51, metadata !DIExpression(), metadata !60, metadata ptr undef, metadata !DIExpression()), !dbg !5580 call void @llvm.dbg.assign(metadata ptr %e, metadata !52, metadata !DIExpression(), metadata !61, metadata ptr undef, metadata !DIExpression()), !dbg !5581 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %0) #4, !dbg !6282 ret void, !dbg !6283}84 85; Function Attrs: argmemonly nofree nosync nounwind willreturn86declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #187 88; Function Attrs: nounwind uwtable89define linkonce_odr dso_local void @_ZN1aC2EiRf(ptr %this, i32 %0, ptr nonnull align 4 dereferenceable(4) %1) unnamed_addr #2 comdat align 2 !dbg !42 {90entry:91 call void @llvm.dbg.assign(metadata i1 undef, metadata !41, metadata !DIExpression(), metadata !63, metadata ptr undef, metadata !DIExpression()), !dbg !6492 call void @llvm.dbg.assign(metadata i1 undef, metadata !51, metadata !DIExpression(), metadata !65, metadata ptr undef, metadata !DIExpression()), !dbg !6493 call void @llvm.dbg.assign(metadata i1 undef, metadata !52, metadata !DIExpression(), metadata !66, metadata ptr undef, metadata !DIExpression()), !dbg !6494 call void @llvm.dbg.assign(metadata ptr %this, metadata !41, metadata !DIExpression(), metadata !67, metadata ptr undef, metadata !DIExpression()), !dbg !6495 call void @llvm.dbg.assign(metadata i32 %0, metadata !51, metadata !DIExpression(), metadata !68, metadata ptr undef, metadata !DIExpression()), !dbg !6496 call void @llvm.dbg.assign(metadata ptr %1, metadata !52, metadata !DIExpression(), metadata !69, metadata ptr undef, metadata !DIExpression()), !dbg !6497 ret void, !dbg !7098}99 100; Function Attrs: argmemonly nofree nosync nounwind willreturn101declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1102 103; Function Attrs: nofree nosync nounwind readnone speculatable willreturn104declare void @llvm.dbg.assign(metadata, metadata, metadata, metadata, metadata, metadata) #3105 106!llvm.dbg.cu = !{!2}107!llvm.module.flags = !{!12, !13, !14, !1000}108!llvm.ident = !{!15}109 110!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())111!1 = distinct !DIGlobalVariable(name: "b", scope: !2, file: !3, line: 5, type: !8, isLocal: false, isDefinition: true)112!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 12.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, splitDebugInlining: false, nameTableKind: None)113!3 = !DIFile(filename: "reduce.cpp", directory: "")114!4 = !{}115!5 = !{!0, !6, !9}116!6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())117!7 = distinct !DIGlobalVariable(name: "d", scope: !2, file: !3, line: 5, type: !8, isLocal: false, isDefinition: true)118!8 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)119!9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression())120!10 = distinct !DIGlobalVariable(name: "c", scope: !2, file: !3, line: 6, type: !11, isLocal: false, isDefinition: true)121!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)122!12 = !{i32 7, !"Dwarf Version", i32 4}123!13 = !{i32 2, !"Debug Info Version", i32 3}124!14 = !{i32 1, !"wchar_size", i32 4}125!15 = !{!"clang version 12.0.0"}126!16 = distinct !DISubprogram(name: "f", linkageName: "_Z1fv", scope: !3, file: !3, line: 7, type: !17, scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !19)127!17 = !DISubroutineType(types: !18)128!18 = !{null}129!19 = !{!20}130!20 = !DILocalVariable(name: "e", scope: !16, file: !3, line: 8, type: !8)131!21 = distinct !DIAssignID()132!22 = !DILocation(line: 0, scope: !16)133!23 = !DILocation(line: 8, column: 3, scope: !16)134!24 = !DILocation(line: 9, column: 7, scope: !25)135!25 = distinct !DILexicalBlock(scope: !16, file: !3, line: 9, column: 7)136!30 = !DILocation(line: 9, column: 7, scope: !16)137!31 = !DILocation(line: 10, column: 9, scope: !25)138!34 = distinct !DIAssignID()139!35 = !DILocation(line: 10, column: 5, scope: !25)140!36 = !DILocation(line: 12, column: 9, scope: !25)141!37 = !DILocation(line: 12, column: 13, scope: !25)142!38 = !DILocation(line: 12, column: 11, scope: !25)143!39 = !DILocation(line: 0, scope: !25)144!40 = !DILocation(line: 13, column: 5, scope: !16)145!41 = !DILocalVariable(name: "this", arg: 1, scope: !42, type: !53, flags: DIFlagArtificial | DIFlagObjectPointer)146!42 = distinct !DISubprogram(name: "a", linkageName: "_ZN1aC2EiRf", scope: !43, file: !3, line: 3, type: !46, scopeLine: 3, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, declaration: !45, retainedNodes: !50)147!43 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "a", file: !3, line: 1, size: 8, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !44, identifier: "_ZTS1a")148!44 = !{!45}149!45 = !DISubprogram(name: "a", scope: !43, file: !3, line: 3, type: !46, scopeLine: 3, flags: DIFlagPublic | DIFlagPrototyped, spFlags: DISPFlagOptimized)150!46 = !DISubroutineType(types: !47)151!47 = !{null, !48, !11, !49}152!48 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !43, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)153!49 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !8, size: 64)154!50 = !{!41, !51, !52}155!51 = !DILocalVariable(arg: 2, scope: !42, file: !3, line: 3, type: !11)156!52 = !DILocalVariable(arg: 3, scope: !42, file: !3, line: 3, type: !49)157!53 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !43, size: 64)158!54 = distinct !DIAssignID()159!55 = !DILocation(line: 0, scope: !42, inlinedAt: !56)160!56 = distinct !DILocation(line: 13, column: 3, scope: !16)161!57 = distinct !DIAssignID()162!58 = distinct !DIAssignID()163!59 = distinct !DIAssignID()164!60 = distinct !DIAssignID()165!61 = distinct !DIAssignID()166!62 = !DILocation(line: 14, column: 1, scope: !16)167!63 = distinct !DIAssignID()168!64 = !DILocation(line: 0, scope: !42)169!65 = distinct !DIAssignID()170!66 = distinct !DIAssignID()171!67 = distinct !DIAssignID()172!68 = distinct !DIAssignID()173!69 = distinct !DIAssignID()174!70 = !DILocation(line: 3, column: 20, scope: !42)175!1000 = !{i32 7, !"debug-info-assignment-tracking", i1 true}176