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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|                            |2019-10-14
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
     Ever confirmed|0                           |1

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
Created attachment 47029
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47029&action=edit
patch for PRE

So GCC emits

.L40:
        .loc 12 4459 13 is_stmt 0 view .LVU116
        pxor    %xmm0, %xmm0
        addl    $3, %ebx
        movq    48(%rsp), %r13
        cvtsi2sdl       %r12d, %xmm0
        call    sin
.LVL39:
        movsd   %xmm0, 8(%rsp)
        pxor    %xmm0, %xmm0
        cvtsi2sdl       %ebx, %xmm0
        movl    %r12d, %ebx
        call    cos
.LVL40:
        movsd   8(%rsp), %xmm2
        movapd  %xmm0, %xmm1
        movapd  %xmm2, %xmm0
        call    cabs
.LVL41:
.L23:
.LBB577:
.LBI577:
        .loc 9 12 52 is_stmt 1 view .LVU117

where the surrounding locations are not exactly helpful (9 refers to t.C
while 12 refers to bits/stl_algo.h), but matches your observation.

GCC-wise I don't see a very good way to address this in an "exact" manner.
We'd somehow have to tell the debug consumer the stmts are from two
(multiple in general) different locations at the same time.  Alternatively
we could pick one but the way PRE is implemented this could mean jumping
between one of the two (or many) alternatives for each stmt since consistency
here cannot be guaranteed.

The attached achieves that, it ends up accumulating the locations to the
end of the lambda.

(gdb) bt
#0  __cos_avx (x=3) at ../sysdeps/ieee754/dbl-64/s_sin.c:267
#1  0x0000000000400862 in std::cos<int> (__x=<optimized out>)
    at
/home/space/rguenther/install/gcc-9.2/include/c++/9.2.0/bits/stl_algo.h:4459
#2  operator() (__closure=<optimized out>) at t.C:14
#3  std::generate_n<std::back_insert_iterator<std::vector<double> >, int,
main()::<lambda()> > (__n=100000, __gen=..., __first=...)
    at
/home/space/rguenther/install/gcc-9.2/include/c++/9.2.0/bits/stl_algo.h:4460
#4  main () at t.C:16

Reply via email to