> >     * ipa-inline-analysis.c (add_condition): Add conditions parameter;
> >     simplify obviously true clauses.
> >     (and_predicates, or_predicates): Add conditions parameter.
> >     (inline_duplication_hoook): Update.
> >     (mark_modified): New function.
> >     (unmodified_parm): New function.
> >     (eliminated_by_inlining_prob, (set_cond_stmt_execution_predicate,
> >     set_switch_stmt_execution_predicate, will_be_nonconstant_predicate):
> >     Use unmodified_parm.
> >     (estimate_function_body_sizes): Update.
> >     (remap_predicate): Update.
> 
> This breaks things in Ada:
> 
> Program received signal SIGSEGV, Segmentation fault.
> walk_aliased_vdefs_1 (ref=0xffffcbf4, vdef=0x0,
>     walker=0x873e3e0 <mark_modified>, data=0xffffcc1f, visited=0xffffcbc0,
>     cnt=0) at /home/eric/svn/gcc/gcc/tree-ssa-alias.c:1996
> 1996          gimple def_stmt = SSA_NAME_DEF_STMT (vdef);
> (gdb) bt
> #0  walk_aliased_vdefs_1 (ref=0xffffcbf4, vdef=0x0,
>     walker=0x873e3e0 <mark_modified>, data=0xffffcc1f, visited=0xffffcbc0,
>     cnt=0) at /home/eric/svn/gcc/gcc/tree-ssa-alias.c:1996
> #1  0x089c3a6d in walk_aliased_vdefs (ref=0xffffcbf4, vdef=0x0,
>     walker=0x873e3e0 <mark_modified>, data=0xffffcc1f, visited=0xffffcbc0)
>     at /home/eric/svn/gcc/gcc/tree-ssa-alias.c:2037
> #2  0x087456b5 in unmodified_parm (stmt=0xf7cf6ab0, op=0xf7cf77e0)
>     at /home/eric/svn/gcc/gcc/ipa-inline-analysis.c:1104
> #3  0x08748a99 in eliminated_by_inlining_prob (stmt=<optimized out>)
>     at /home/eric/svn/gcc/gcc/ipa-inline-analysis.c:1165

Hi,
the problem here is that we consider &param.foo to be a memory reference, while 
it is not.
The following patch should fix it, but because it changes the behaviour of 
inline heuristics,
I will run bechmarks tonight before committing it.

Index: ipa-inline-analysis.c
===================================================================
--- ipa-inline-analysis.c       (revision 179003)
+++ ipa-inline-analysis.c       (working copy)
@@ -1149,18 +1149,15 @@ eliminated_by_inlining_prob (gimple stmt
          {
            tree rhs = gimple_assign_rhs1 (stmt);
             tree lhs = gimple_assign_lhs (stmt);
-           tree inner_rhs = rhs;
-           tree inner_lhs = lhs;
+           tree inner_rhs = get_base_address (rhs);
+           tree inner_lhs = get_base_address (lhs);
            bool rhs_free = false;
            bool lhs_free = false;
 
-           while (handled_component_p (inner_lhs)
-                  || TREE_CODE (inner_lhs) == MEM_REF)
-             inner_lhs = TREE_OPERAND (inner_lhs, 0);
-           while (handled_component_p (inner_rhs)
-                  || TREE_CODE (inner_rhs) == ADDR_EXPR
-                  || TREE_CODE (inner_rhs) == MEM_REF)
-             inner_rhs = TREE_OPERAND (inner_rhs, 0);
+           if (!inner_rhs)
+             inner_rhs = rhs;
+           if (!inner_lhs)
+             inner_lhs = lhs;
 
            if (unmodified_parm (stmt, inner_rhs))
              rhs_free = true;

Reply via email to