[Bug rtl-optimization/49429] [4.7 Regression] dse.c changes to fix PR44194 (r175063) cause execution failures

eraman at google dot com gcc-bugzilla@gcc.gnu.org
Fri Jun 17 20:44:00 GMT 2011


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

--- Comment #9 from Easwaran Raman <eraman at google dot com> 2011-06-17 20:43:04 UTC ---
(In reply to comment #8)
> Compiling x.c with a ia64-unknown-linux cross compiler, setting a breakpoint in
> can_escape(), I see that,
> 
> 
> (gdb) p debug_rtx (body)
> (set (mem/s/c:DI (reg/f:DI 341) [2 s1+0 S8 A64])
>     (reg:DI 112 in0))
> 
> This is part of an instruction that gets removed:
> (insn 4 3 6 2 (set (mem/s/c:DI (reg/f:DI 341) [2 s1+0 S8 A64])
>         (reg:DI 112 in0)) y.c:23 5 {movdi_internal}
>      (expr_list:REG_DEAD (reg:DI 112 in0)
>         (nil)))
> 
> (gdb) p expr->base.code 
> $24 = PARM_DECL
> (gdb) p may_be_aliased (expr)
> $23 = 0 '\000'
> 
> So can_escape() returns false. But later on, in the same BB, I see:
> 
> 
> (insn 36 30 37 2 (set (reg:DI 120 out0)
>         (reg/f:DI 357)) 5 {movdi_internal}
>      (expr_list:REG_EQUAL (plus:DI (reg/f:DI 328 sfp)
>             (const_int 62 [0x3e]))
>         (nil)))
> (insn 37 36 38 2 (set (reg:DI 121 out1)
>         (reg/f:DI 341)) 5 {movdi_internal}
>      (expr_list:REG_DEAD (reg/f:DI 341)
>         (expr_list:REG_EQUAL (plus:DI (reg/f:DI 328 sfp)
>                 (const_int 96 [0x60]))
>             (nil))))
> (insn 38 37 39 2 (set (reg:DI 122 out2)
>         (const_int 31 [0x1f])) 5 {movdi_internal}
>      (nil))
> (call_insn 39 38 42 2 (parallel [
>             (set (reg:DI 8 r8)
>                 (call (mem:DI (symbol_ref:DI ("memcpy") [flags 0x41] 
> <function_decl 0x7ffff70d2e00 memcpy>) [0 memcpy S8 A64])
>                     (const_int 1 [0x1])))
>             (clobber (reg:DI 320 b0))
>             (clobber (scratch:DI))
>             (clobber (scratch:DI))
>         ]) 332 {call_value_gp}
>      (expr_list:REG_DEAD (reg:DI 122 out2)
>         (expr_list:REG_DEAD (reg:DI 121 out1)
>             (expr_list:REG_DEAD (reg:DI 120 out0)
>                 (expr_list:REG_UNUSED (reg:DI 8 r8)
>                     (expr_list:REG_EH_REGION (const_int 0 [0])
>                         (nil))))))
>     (expr_list:REG_DEP_TRUE (use (reg:DI 1 r1))
>         (expr_list:REG_DEP_TRUE (use (reg:DI 122 out2))
>             (expr_list:REG_DEP_TRUE (use (reg:DI 121 out1))
>                 (expr_list:REG_DEP_TRUE (use (reg:DI 120 out0))
>                     (nil))))))
> 
> reg 341 is passed as source argument of a memcpy. Why does the expression
> return 0 for may_be_aliased()?

Could someone tell why may_be_aliased returns false in this case? I would
expect TREE_ADDRESSABLE to be true, but that's not the case. It seems to me
some other bug is exposed by the DSE patch.



More information about the Gcc-bugs mailing list