Dear all,
Im writing to you regarding the dead store elimination (dse) which runs after 
register allocation. Apparently dse removes wrongly the following store 
(present in bb2):

(insn 374 47 52 2 test.c:107 (set (mem/c:SI (plus:PSI (reg/f:PSI 55 ptr15)
                (const_int 96 [0x60])) [19 fac_iter+0 S4 A32])
        (reg/v:SI 16 r16 [orig:161 step109 ] [161])) 48  
{si_indexed_store_incl_ra} (nil))

despite being consumed (in bb3) by the following 2 loads:
(insn 380 71 64 3 test.c:112 (set (reg:HI 1 r1)
        (mem:HI (plus:PSI (reg/f:PSI 55 ptr15)
                (const_int 96 [0x60])) [0 S2 A16])) 12 {load} (nil))

(insn 382 346 65 3 test.c:112 (set (reg:HI 5 r5)
        (mem:HI (plus:PSI (reg/f:PSI 55 ptr15)
                (const_int 98 [0x62])) [0 S2 A16])) 12 {load} (nil))


Can anyone point what may be the problem?

As you can see the store is SI while the loads are HI. While looking to the 
comments from dse.c I get to the following remark:

" There are three cases where dse falls short:
     a) Reload sometimes creates the slot for one mode of access, and
     then inserts loads and/or stores for a smaller mode. "

Does it mean that such cases are not treated properly by dse?

I observed that if I run with the flag -fno-strict-aliasing the wrongly removed 
store is no longer removed and the code is runs correctly. 
Im wondering does the dse after register allocation make use of type based 
alias analysis? 

reagards,
Alex






      

Reply via email to