[Bug debug/100960] New: var-tracking: parameter location in subregister not tracked

stefansf at linux dot ibm.com gcc-bugzilla@gcc.gnu.org
Tue Jun 8 08:33:01 GMT 2021


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100960

            Bug ID: 100960
           Summary: var-tracking: parameter location in subregister not
                    tracked
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: stefansf at linux dot ibm.com
  Target Milestone: ---
            Target: s390x-*-*

Created attachment 50960
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50960&action=edit
var-tracking dump

On IBM Z we often have the case that debug information for a parameter points
to the entry value only although the value is held in a register, too.

__attribute__((noinline, noclone)) void
f1 (int x)
{
  __asm volatile ("" : "+r" (x) : : "memory");
}

__attribute__((noinline, noclone)) int
f2 (int x)
{
  f1 (x);
  return x;  // (*)
}

__attribute__((noinline, noclone)) int
f3 (int x)
{
  f2 (x);
  return 3;
}

int
main ()
{
  f3 (42);
  return 0;
}

0x1000600 <f2>          stmg    %r12,%r15,96(%r15)
0x1000606 <f2+6>        lay     %r15,-160(%r15)
0x100060c <f2+12>       lgr     %r12,%r2
0x1000610 <f2+16>       brasl   %r14,0x10005f8 <f1>
0x1000616 <f2+22>       lgr     %r2,%r12
0x100061a <f2+26>       lmg     %r12,%r15,256(%r15)
0x1000620 <f2+32>       br      %r14

At program point (*) debug information for parameter x points to the entry
value only. Thus it gets neglected that the value was moved to call-saved
register r12 prior function call f1.

Having a look at var-tracking this seems to boil down to the fact that register
r2 is saved (lgr %r12,%r2) and restored (lgr %r2,%r12) in DI mode whereas
parameter x has only SI mode and the relation is not tracked. In other words,
for parameter x var-tracking is looking after the function call f1 for an SI
value and doesn't find it although it is a subvalue held in register r12.

Is this a known deficiency or am I missing something?


More information about the Gcc-bugs mailing list