Index: llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp @@ -215,24 +215,36 @@ if (Ranges.empty()) continue; - // The first mention of a function argument gets the CurrentFnBegin - // label, so arguments are visible when breaking at function entry. + auto IsDescribedByReg = [](const MachineInstr *MI) { + return MI->getOperand(0).isReg() && MI->getOperand(0).getReg(); + }; + + // The first mention of a function argument gets the CurrentFnBegin label, + // so arguments are visible when breaking at function entry. + // + // We do not change the label for values that are described by registers, + // as that could place them above their defining instructions. We should + // ideally not change the labels for constant debug values either, since + // doing that violates the ranges that are calculated in the history map. + // However, we currently do not emit debug values for constant arguments + // directly at the start of the function, so this code is still useful. const DILocalVariable *DIVar = Ranges.front().first->getDebugVariable(); if (DIVar->isParameter() && getDISubprogram(DIVar->getScope())->describes(&MF->getFunction())) { - LabelsBeforeInsn[Ranges.front().first] = Asm->getFunctionBegin(); + if (!IsDescribedByReg(Ranges.front().first)) + LabelsBeforeInsn[Ranges.front().first] = Asm->getFunctionBegin(); if (Ranges.front().first->getDebugExpression()->isFragment()) { // Mark all non-overlapping initial fragments. for (auto I = Ranges.begin(); I != Ranges.end(); ++I) { const DIExpression *Fragment = I->first->getDebugExpression(); - if (std::all_of(Ranges.begin(), I, + if (std::any_of(Ranges.begin(), I, [&](DbgValueHistoryMap::InstrRange Pred) { - return !Fragment->fragmentsOverlap( + return Fragment->fragmentsOverlap( Pred.first->getDebugExpression()); })) - LabelsBeforeInsn[I->first] = Asm->getFunctionBegin(); - else break; + if (!IsDescribedByReg(I->first)) + LabelsBeforeInsn[I->first] = Asm->getFunctionBegin(); } } } Index: llvm/trunk/test/CodeGen/AMDGPU/llvm.dbg.value.ll =================================================================== --- llvm/trunk/test/CodeGen/AMDGPU/llvm.dbg.value.ll +++ llvm/trunk/test/CodeGen/AMDGPU/llvm.dbg.value.ll @@ -4,6 +4,7 @@ ; GCN-LABEL: {{^}}test_debug_value: ; NOOPT: .loc 1 1 42 prologue_end ; /tmp/test_debug_value.cl:1:42 ; NOOPT-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0 +; NOOPT-NEXT: .Ltmp ; NOOPT-NEXT: ;DEBUG_VALUE: test_debug_value:globalptr_arg <- $sgpr4_sgpr5 ; GCN: flat_store_dword Index: llvm/trunk/test/DebugInfo/AArch64/asan-stack-vars.mir =================================================================== --- llvm/trunk/test/DebugInfo/AArch64/asan-stack-vars.mir +++ llvm/trunk/test/DebugInfo/AArch64/asan-stack-vars.mir @@ -28,7 +28,7 @@ # CHECK: "_cmd" # CHECK: DW_TAG_formal_parameter # CHECK-NEXT: DW_AT_location -# CHECK-NEXT: [0x{{0*}}, 0x{{.*}}): +# CHECK-NEXT: [0x{{.*}}, 0x{{.*}}): # CHECK-NOT: DW_AT_ # CHECK: [0x{{.*}}, [[FN_END]]): # CHECK-NEXT: DW_AT_name {{.*}}"imageSize" Index: llvm/trunk/test/DebugInfo/ARM/partial-subreg.ll =================================================================== --- llvm/trunk/test/DebugInfo/ARM/partial-subreg.ll +++ llvm/trunk/test/DebugInfo/ARM/partial-subreg.ll @@ -9,6 +9,7 @@ ; CHECK: DW_AT_name {{.*}}"subscript.get" ; CHECK: DW_TAG_formal_parameter ; CHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] ({{.*}} +; CHECK-NEXT: [0x{{.*}}, 0x{{.*}}): DW_OP_regx D16, DW_OP_piece 0x8, DW_OP_regx D17, DW_OP_piece 0x4 ; CHECK-NEXT: [0x{{.*}}, 0x{{.*}}): DW_OP_regx D16, DW_OP_piece 0x8, DW_OP_regx D17, DW_OP_piece 0x4, DW_OP_regx D16, DW_OP_piece 0x8, DW_OP_regx D17, DW_OP_piece 0x4 source_filename = "simd.ll" Index: llvm/trunk/test/DebugInfo/COFF/fp-stack.ll =================================================================== --- llvm/trunk/test/DebugInfo/COFF/fp-stack.ll +++ llvm/trunk/test/DebugInfo/COFF/fp-stack.ll @@ -10,14 +10,14 @@ ret double %sub } -; ASM: .cv_def_range Lfunc_begin0 Lfunc_end0, "A\021\200\000\000\000" +; ASM: .cv_def_range Ltmp1 Lfunc_end0, "A\021\200\000\000\000" ; OBJ: DefRangeRegisterSym { ; OBJ: Register: ST0 (0x80) ; OBJ: MayHaveNoName: 0 ; OBJ: LocalVariableAddrRange { -; OBJ: OffsetStart: .text+0x0 +; OBJ: OffsetStart: .text+0x6 ; OBJ: ISectStart: 0x0 -; OBJ: Range: 0x7 +; OBJ: Range: 0x1 ; OBJ: } ; OBJ: } Index: llvm/trunk/test/DebugInfo/COFF/fpo-stack-protect.ll =================================================================== --- llvm/trunk/test/DebugInfo/COFF/fpo-stack-protect.ll +++ llvm/trunk/test/DebugInfo/COFF/fpo-stack-protect.ll @@ -30,7 +30,7 @@ ; CHECK: addl $20, %esp ; CHECK: popl %esi ; CHECK: retl -; CHECK: Ltmp2: +; CHECK: Ltmp3: ; CHECK: .cv_fpo_endproc ; ModuleID = 't.c' Index: llvm/trunk/test/DebugInfo/COFF/pieces.ll =================================================================== --- llvm/trunk/test/DebugInfo/COFF/pieces.ll +++ llvm/trunk/test/DebugInfo/COFF/pieces.ll @@ -136,7 +136,7 @@ ; ASM: .asciz "pad_right" # Function name ; ASM: .short 4414 # Record kind: S_LOCAL ; ASM: .asciz "o" -; ASM: .cv_def_range .Lfunc_begin1 .Ltmp8, "C\021\021\000\000\000\004\000\000\000" +; ASM: .cv_def_range .Ltmp8 .Ltmp8, "C\021\021\000\000\000\004\000\000\000" ; OBJ-LABEL: GlobalProcIdSym { ; OBJ: Kind: S_GPROC32_ID (0x1147) @@ -159,7 +159,7 @@ ; ASM: .asciz "pad_left" # Function name ; ASM: .short 4414 # Record kind: S_LOCAL ; ASM: .asciz "o" -; ASM: .cv_def_range .Lfunc_begin2 .Ltmp10, "C\021\021\000\000\000\000\000\000\000" +; ASM: .cv_def_range .Ltmp10 .Ltmp10, "C\021\021\000\000\000\000\000\000\000" ; OBJ-LABEL: GlobalProcIdSym { ; OBJ: Kind: S_GPROC32_ID (0x1147) Index: llvm/trunk/test/DebugInfo/MIR/AArch64/clobber-sp.mir =================================================================== --- llvm/trunk/test/DebugInfo/MIR/AArch64/clobber-sp.mir +++ llvm/trunk/test/DebugInfo/MIR/AArch64/clobber-sp.mir @@ -4,7 +4,7 @@ # CHECK: DW_TAG_formal_parameter # CHECK: DW_TAG_formal_parameter # CHECK-NEXT: DW_AT_location -# CHECK-NEXT: [0x0000000000000000, 0x0000000000000014): DW_OP_reg1 W1 +# CHECK-NEXT: [0x0000000000000010, 0x0000000000000014): DW_OP_reg1 W1 # CHECK-NEXT: [0x0000000000000014, 0x0000000000000038): DW_OP_breg31 WSP+8 # CHECK-NEXT: DW_AT_name {{.*}}"y" Index: llvm/trunk/test/DebugInfo/NVPTX/debug-info.ll =================================================================== --- llvm/trunk/test/DebugInfo/NVPTX/debug-info.ll +++ llvm/trunk/test/DebugInfo/NVPTX/debug-info.ll @@ -4781,8 +4781,8 @@ ; CHECK-NEXT: .b8 6 // DW_AT_call_line ; CHECK-NEXT: .b8 43 // Abbrev [43] 0x270e:0x22 DW_TAG_inlined_subroutine ; CHECK-NEXT: .b32 9791 // DW_AT_abstract_origin -; CHECK-NEXT: .b64 Ltmp9 // DW_AT_low_pc -; CHECK-NEXT: .b64 Ltmp10 // DW_AT_high_pc +; CHECK-NEXT: .b64 Ltmp10 // DW_AT_low_pc +; CHECK-NEXT: .b64 Ltmp11 // DW_AT_high_pc ; CHECK-NEXT: .b8 12 // DW_AT_call_file ; CHECK-NEXT: .b8 8 // DW_AT_call_line ; CHECK-NEXT: .b8 44 // Abbrev [44] 0x2725:0x5 DW_TAG_formal_parameter Index: llvm/trunk/test/DebugInfo/X86/debug-loc-asan.mir =================================================================== --- llvm/trunk/test/DebugInfo/X86/debug-loc-asan.mir +++ llvm/trunk/test/DebugInfo/X86/debug-loc-asan.mir @@ -27,7 +27,7 @@ # We expect two location ranges for the variable. # # First, its address is stored in %rcx: -# CHECK: .quad .Lfunc_begin0-.Lfunc_begin0 +# CHECK: .quad .Ltmp0-.Lfunc_begin0 # CHECK-NEXT: .quad [[START_LABEL]]-.Lfunc_begin0 # CHECK: DW_OP_breg2 # DWARF: DW_TAG_formal_parameter Index: llvm/trunk/test/DebugInfo/X86/debug-loc-offset.mir =================================================================== --- llvm/trunk/test/DebugInfo/X86/debug-loc-offset.mir +++ llvm/trunk/test/DebugInfo/X86/debug-loc-offset.mir @@ -42,7 +42,7 @@ # CHECK: DW_TAG_formal_parameter # CHECK-NOT: DW_TAG # CHECK: DW_AT_location [DW_FORM_sec_offset] ({{.*}} -# CHECK-NEXT: [0x00000020, 0x00000037): DW_OP_breg0 EAX+0, DW_OP_deref +# CHECK-NEXT: [0x00000029, 0x00000037): DW_OP_breg0 EAX+0, DW_OP_deref # CHECK-NEXT: [0x00000037, 0x00000063): DW_OP_breg5 EBP-8, DW_OP_deref, DW_OP_deref # CHECK-NEXT: DW_AT_name [DW_FORM_strp]{{.*}}"a" # @@ -70,7 +70,7 @@ # CHECK-NEXT: [0x00000000, 0x0000000a): DW_OP_consts +0, DW_OP_stack_value # CHECK-NEXT: [0x0000000a, 0x00000017): DW_OP_consts +1, DW_OP_stack_value # CHECK: 0x00000022: -# CHECK-NEXT: [0x00000000, 0x00000017): DW_OP_breg0 EAX+0, DW_OP_deref +# CHECK-NEXT: [0x00000009, 0x00000017): DW_OP_breg0 EAX+0, DW_OP_deref # CHECK-NEXT: [0x00000017, 0x00000043): DW_OP_breg5 EBP-8, DW_OP_deref, DW_OP_deref --- | target triple = "i386-unknown-linux-gnu" Index: llvm/trunk/test/DebugInfo/X86/dw_op_minus_direct.ll =================================================================== --- llvm/trunk/test/DebugInfo/X86/dw_op_minus_direct.ll +++ llvm/trunk/test/DebugInfo/X86/dw_op_minus_direct.ll @@ -17,7 +17,7 @@ ; CHECK: .debug_loc contents: ; CHECK: 0x00000000: -; CHECK-NEXT: [0x0000000000000000, 0x0000000000000004): DW_OP_breg0 RAX+0, DW_OP_constu 0xffffffff, DW_OP_and, DW_OP_lit1, DW_OP_minus, DW_OP_stack_value +; CHECK-NEXT: [0x0000000000000003, 0x0000000000000004): DW_OP_breg0 RAX+0, DW_OP_constu 0xffffffff, DW_OP_and, DW_OP_lit1, DW_OP_minus, DW_OP_stack_value ; rax+0, constu 0xffffffff, and, constu 0x00000001, minus, stack-value source_filename = "minus.c"