Alex Turjan wrote: > 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?
Here's part of the comment in alias.c: /* The alias sets assigned to MEMs assist the back-end in determining which MEMs can alias which other MEMs. In general, two MEMs in different alias sets cannot alias each other ... There's a lot more information in the comments there. Andrew.