http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44194
--- Comment #18 from rguenther at suse dot de <rguenther at suse dot de> 2011-04-21 08:36:14 UTC --- On Thu, 21 Apr 2011, eraman at google dot com wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44194 > > --- Comment #17 from Easwaran Raman <eraman at google dot com> 2011-04-21 > 00:20:51 UTC --- > On Sun, Apr 17, 2011 at 3:45 AM, rguenther at suse dot de > <gcc-bugzi...@gcc.gnu.org> wrote: > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44194 > > > > --- Comment #16 from rguenther at suse dot de <rguenther at suse dot de> > > 2011-04-17 10:44:02 UTC --- > > On Fri, 15 Apr 2011, eraman at google dot com wrote: > > > >> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44194 > >> > >> --- Comment #15 from Easwaran Raman <eraman at google dot com> 2011-04-15 > >> 22:22:15 UTC --- > >> (In reply to comment #14) > >> > On Fri, 15 Apr 2011, eraman at google dot com wrote: > >> > > >> > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44194 > >> > > > >> > > Easwaran Raman <eraman at google dot com> changed: > >> > > > >> > > What |Removed |Added > >> > > ---------------------------------------------------------------------------- > >> > > CC| |eraman at google dot > >> > > com > >> > > > >> > > --- Comment #13 from Easwaran Raman <eraman at google dot com> > >> > > 2011-04-15 19:18:25 UTC --- > >> > > Richard, did you mean to write > >> > > > >> > > static bool > >> > > can_escape (tree expr) > >> > > { > >> > > tree base; > >> > > if (!expr) > >> > > return true; > >> > > base = get_base_address (expr); > >> > > if (DECL_P (base) > >> > > && (!may_be_aliased (base) > >> > > && !pt_solution_includes (&cfun->gimple_df->escaped, base))) > >> > > return false; > >> > > return true; > >> > > } > >> > > > >> > > Only case when we know it doesn't escape is if bas is a DECL_P and is > >> > > not in > >> > > cfun->gimple_df->escaped and not aliased, right? Actually, I'm > >> > > wondering if it > >> > > is sufficient to test just > >> > > DECL_P (base) && !pt_solution_includes (&cfun->gimple_df->escaped, > >> > > base). > >> > > >> > No, because if the escaped solution for example includes ANYTHING then > >> > the test will return true. That !may-aliased variables are not > >> > contained in ANYTHING isn't known w/o context. > >> > > >> > Richard. > >> > >> Correct me if I am wrong. If I understand you right, just using DECL_P > >> (base) > >> && !pt_solution_includes is conservative since pt_solution_includes may > >> return > >> true if the escaped solution contains ANYTHING. To make it less > >> conservative, > >> you're suggesting > >> > >> if (DECL_P (base) > >> && (!may_be_aliased (base) > >> || !pt_solution_includes (&cfun->gimple_df->escaped, base))) > >> return false; > >> > >> I tried that and most Fortran tests are failing. One of the tests > >> (default_format_1.f90) has the following RTL sequence: > >> > >> > >> (insn 30 29 32 4 (set (mem/s/c:SI (plus:DI (reg/f:DI 20 frame) > >> (const_int -608 [0xfffffffffffffda0])) [2 > >> dt_parm.0.common.flags+0 S4 A64]) > >> (const_int 16512 [0x4080])) default_format_1.inc:56 64 > >> {*movsi_internal} > >> (nil)) > >> > >> (insn 32 30 33 4 (set (reg:DI 5 di) > >> (reg/f:DI 106)) default_format_1.inc:56 62 {*movdi_internal_rex64} > >> (expr_list:REG_EQUAL (plus:DI (reg/f:DI 20 frame) > >> (const_int -608 [0xfffffffffffffda0])) > >> (nil))) > >> > >> (call_insn 33 32 36 4 (call (mem:QI (symbol_ref:DI ("_gfortran_st_write") > >> [flags 0x41] <function_decl 0x7f301ed12e00 _gfortran_st_write>) [0 > >> _gfortran_st_write S1 A8]) > >> (const_int 0 [0])) default_format_1.inc:56 618 {*call_0} > >> (expr_list:REG_DEAD (reg:DI 5 di) > >> (nil)) > >> (expr_list:REG_DEP_TRUE (use (reg:DI 5 di)) > >> (nil))) > >> > >> For the DECL dt_parm, pt_solution_includes (&cfun->gimple_df->escaped, > >> base) > >> returns false, even though its location is passed as a parameter to > >> _gfortran_st_write. > >> > >> I did test with > >> if (DECL_P (base) > >> && (!may_be_aliased (base) > >> && !pt_solution_includes (&cfun->gimple_df->escaped, base))) > >> > >> which has no regressions. Is that what you suggest? > > > > No, the version with || should be ok. The dt_parm argument does > > not escape at the _gfortran_st_write call site because this > > intrinsic function has a ".wW" fnspec attribute which specifies > > the arguments do not escape. What you indeed need to do in > > addition to the escaped solution query is walk over all function > > arguments and see if there is one that aliases 'base'. That > > may not be easily possible on RTL though. On the tree level > > we have a separate points-to set for such call clobbers/uses > > but we do not preserve it for RTL. > > Is it ok to make calls whose arg(s) have EAF_NOESCAPE kill all > locations off the frame in addition to killing all locations that > potentially escape (using the || case you suggested)? Will it be > better or worse than just checking !may_be_aliased (base) alone? It's probably easiest and safest to just check !may_be_aliased for now. Richard.