http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49676

           Summary: inefficiency: DW_AT_GNU_call_site_value calculates
                    everything << 32
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: trivial
          Priority: P3
         Component: debug
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: jan.kratoch...@redhat.com
                CC: ja...@redhat.com
            Target: x86_64-unknown-linux-gnu


It works but it is a bit size-inefficient/overcomplicated.

extern void d (int);
void __attribute__((noinline, noclone))
self (int i)
{
  if (i == 200)
    self (i + 1);
  else
    d (i + 2);
}

-g -O2
gcc (GCC) 4.7.0 20110708 (experimental)

DW_AT_GNU_call_site_value: 26 byte block: f3 1 55 23 2 8 cb f3 1 55 8 20 24 10
80 80 80 80 80 19 2e 28 1 0 16 13    (DW_OP_GNU_entry_value: (DW_OP_reg5
(rdi)); DW_OP_plus_uconst: 2; DW_OP_const1u: 203; DW_OP_GNU_entry_value:
(DW_OP_reg5 (rdi)); DW_OP_const1u: 32; DW_OP_shl; DW_OP_constu: 858993459200;
DW_OP_ne; DW_OP_bra: 1; DW_OP_swap; DW_OP_drop)

this is:

DW_OP_GNU_entry_value: (DW_OP_reg5 (rdi))
DW_OP_plus_uconst: 2
 = 202
DW_OP_const1u: 203
DW_OP_GNU_entry_value: (DW_OP_reg5 (rdi))
DW_OP_const1u: 32
  32, 200, 203, 202
DW_OP_shl
  200 << 32, 203, 202
DW_OP_constu: 858993459200
  200 << 32, 200 << 32, 203, 202
DW_OP_ne
DW_OP_bra: 1
DW_OP_swap
DW_OP_drop

858993459200 = 200 << 32

There should not be a need to shl by 32 and calculate it everything << 32.

unrelated: function was inlined by `cmovne' despite there is `noinline'.

Reply via email to