[PATCH] D46129: [SelectionDAG] Improve selection of DBG_VALUE using a PHI node result

Reid Kleckner via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 26 16:33:00 PDT 2018


rnk added inline comments.


================
Comment at: test/DebugInfo/COFF/pieces.ll:46
+; ASM: [[oy_ox_start:\.Ltmp[0-9]+]]:
 ; ASM:        #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 0 32] $edi
+; ASM:        #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 32 32] $esi
----------------
bjope wrote:
> aprantl wrote:
> > I'm having a hard time interpreting the assembler comment. Does this mean that the range of the DBG_VALUE get's immediately terminated by the assignment to edi, or does that mean "starting with the assignment"?
> The original loop in C looks like this (at least according to the comment in the test case, I've not regenerated it from C since it is an old test case):
> ```
> ;   for (i = 0; i < n; i++) {
> ;     o.x = g(o.x);
> ;     o.y = g(o.y);
> ;   }
> ;   return o.x + o.y;
> ```
> 
> Without the patch we get this kind of structure in the loop body:
> 
> ```
> ox_start:
>   #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 0 32] $edi
>   o.x = g(o.x);
> oy_start:
>   #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 0 32] $edi
>   #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 32 32] $esi
>   o.y = g(o.y);
>   #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 32 32] $esi
> oy_end:
> ```
> 
> after the patch we get
> 
> ```
> ox_oy_start:
>   #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 0 32] $edi
>   #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 32 32] $esi
>   o.x = g(o.x);
> ox_start:
>   #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 0 32] $edi
>   o.y = g(o.y);
> oy_start:
>   #DEBUG_VALUE: loop_csr:o <- [DW_OP_LLVM_fragment 32 32] $esi
> oy_end:
> ```
> So the difference is basically that we now track "o.y" also for the first part of the loop body. That should be an improvement!
> 
> Perhaps I should rename ox_start as ox_restart, and oy_start as oy_restart, to indicate that those labels indicate where a new live range starts for the DEBUG_VALUEs (after the updates of o.x and o.y)? Or we could just call them LBL1, LBL2, LBL3 and LBL4.
> 
> 
I believe your analysis is correct! This is great, I was really annoyed that we didn't track `o.y` for the first part of the loop when I wrote this test case initially. I used it for a demo and I had to carefully put my breakpoint on the loop backedge so that both parts would show up in the debugger.


Repository:
  rL LLVM

https://reviews.llvm.org/D46129





More information about the llvm-commits mailing list