brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · b807f7e Raw
98 lines · plain
1; RUN: opt -S -passes=sroa -sroa-skip-mem2reg %s \2; RUN: | FileCheck %s --implicit-check-not="#dbg_"3 4;; IR hand-modified, originally generated from:5;; struct Pair { int a; int b; };6;; Pair getVar();7;; int fun() {8;;   Pair var;9;;   var = getVar();10;;   return var.b;11;; }12;; Modification: split the dbg.assign linked the the memcpy(64 bits) into two,13;; each describing a 32 bit fragment.14;;15;; Check that assignment tracking updates in SROA work when the store being16;; split is described with one dbg.assign (covering different fragments). The17;; store may have been already split and then merged again at some point.18 19;; Alloca for var.a and associated dbg.assign:20; CHECK: %var.sroa.0 = alloca i32, align 4, !DIAssignID ![[id_1:[0-9]+]]21; CHECK-NEXT: #dbg_assign(i1 undef, ![[var:[0-9]+]], !DIExpression(DW_OP_LLVM_fragment, 0, 32), ![[id_1]], ptr %var.sroa.0, !DIExpression(),22 23;; Alloca for var.b and associated dbg.assign:24; CHECK-NEXT: %var.sroa.1 = alloca i32, align 4, !DIAssignID ![[id_2:[0-9]+]]25; CHECK-NEXT: #dbg_assign(i1 undef, ![[var]], !DIExpression(DW_OP_LLVM_fragment, 32, 32), ![[id_2]], ptr %var.sroa.1, !DIExpression(),26 27;; Store to var.b (split from store to var) and associated dbg.assigns. The28;; dbg.assign for the fragment covering the (pre-split) assignment to var.a29;; should not be linked to the store.30; CHECK: store i32 %[[v:.*]], ptr %var.sroa.1,{{.*}}!DIAssignID ![[id_3:[0-9]+]]31; CHECK-NEXT: #dbg_assign(i32 %{{.*var\.sroa\.0.*}}, ![[var]], !DIExpression(DW_OP_LLVM_fragment, 0, 32), ![[id_4:[0-9]+]], ptr %var.sroa.0, !DIExpression(),32; CHECK-NEXT: #dbg_assign(i32 %[[v]], ![[var]], !DIExpression(DW_OP_LLVM_fragment, 32, 32), ![[id_3]], ptr %var.sroa.1, !DIExpression(),33 34; CHECK-DAG: ![[id_1]] = distinct !DIAssignID()35; CHECK-DAG: ![[id_2]] = distinct !DIAssignID()36; CHECK-DAG: ![[id_3]] = distinct !DIAssignID()37; CHECK-DAG: ![[id_4]] = distinct !DIAssignID()38 39%struct.Pair = type { i32, i32 }40 41define dso_local noundef i32 @_Z3funv() !dbg !9 {42entry:43  %var = alloca %struct.Pair, align 4, !DIAssignID !1944  call void @llvm.dbg.assign(metadata i1 undef, metadata !14, metadata !DIExpression(), metadata !19, metadata ptr %var, metadata !DIExpression()), !dbg !2045  %ref.tmp = alloca %struct.Pair, align 446  %call = call i64 @_Z6getVarv(), !dbg !2247  store i64 %call, ptr %ref.tmp, align 4, !dbg !2248  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %var, ptr align 4 %ref.tmp, i64 8, i1 false), !dbg !23, !DIAssignID !2949  call void @llvm.dbg.assign(metadata i1 undef, metadata !14, metadata !DIExpression(DW_OP_LLVM_fragment, 0, 32), metadata !29, metadata ptr %var, metadata !DIExpression()), !dbg !2050  call void @llvm.dbg.assign(metadata i1 undef, metadata !14, metadata !DIExpression(DW_OP_LLVM_fragment, 32, 32), metadata !29, metadata ptr %var, metadata !DIExpression(DW_OP_plus, DW_OP_constu, 4)), !dbg !2051  %b = getelementptr inbounds %struct.Pair, ptr %var, i32 0, i32 1, !dbg !3152  %0 = load i32, ptr %b, align 4, !dbg !3153  ret i32 %0, !dbg !3554}55 56declare !dbg !36 i64 @_Z6getVarv()57declare void @llvm.dbg.declare(metadata, metadata, metadata)58declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg)59declare void @llvm.dbg.assign(metadata, metadata, metadata, metadata, metadata, metadata)60 61!llvm.dbg.cu = !{!0}62!llvm.module.flags = !{!2, !3, !4, !5, !6, !7}63!llvm.ident = !{!8}64 65!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 16.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)66!1 = !DIFile(filename: "test.cpp", directory: "/")67!2 = !{i32 7, !"Dwarf Version", i32 5}68!3 = !{i32 2, !"Debug Info Version", i32 3}69!4 = !{i32 1, !"wchar_size", i32 4}70!5 = !{i32 8, !"PIC Level", i32 2}71!6 = !{i32 7, !"PIE Level", i32 2}72!7 = !{i32 7, !"uwtable", i32 2}73!8 = !{!"clang version 16.0.0"}74!9 = distinct !DISubprogram(name: "fun", linkageName: "_Z3funv", scope: !1, file: !1, line: 3, type: !10, scopeLine: 3, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !13)75!10 = !DISubroutineType(types: !11)76!11 = !{!12}77!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)78!13 = !{!14}79!14 = !DILocalVariable(name: "var", scope: !9, file: !1, line: 4, type: !15)80!15 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Pair", file: !1, line: 1, size: 64, flags: DIFlagTypePassByValue, elements: !16, identifier: "_ZTS4Pair")81!16 = !{!17, !18}82!17 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !15, file: !1, line: 1, baseType: !12, size: 32)83!18 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !15, file: !1, line: 1, baseType: !12, size: 32, offset: 32)84!19 = distinct !DIAssignID()85!20 = !DILocation(line: 0, scope: !9)86!21 = !DILocation(line: 4, column: 3, scope: !9)87!22 = !DILocation(line: 5, column: 9, scope: !9)88!23 = !DILocation(line: 5, column: 7, scope: !9)89!29 = distinct !DIAssignID()90!30 = !DILocation(line: 5, column: 3, scope: !9)91!31 = !DILocation(line: 6, column: 14, scope: !9)92!34 = !DILocation(line: 7, column: 1, scope: !9)93!35 = !DILocation(line: 6, column: 3, scope: !9)94!36 = !DISubprogram(name: "getVar", linkageName: "_Z6getVarv", scope: !1, file: !1, line: 2, type: !37, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !39)95!37 = !DISubroutineType(types: !38)96!38 = !{!15}97!39 = !{}98