------- Comment #4 from hubicka at ucw dot cz  2008-05-02 11:11 -------
Subject: Re:  [4.4 Regression] always_inline attribute is broken at -O0

Hi,
I am testing the following patch that restores inlining at -O0.

Index: tree-pass.h
===================================================================
*** tree-pass.h (revision 134885)
--- tree-pass.h (working copy)
*************** extern struct rtl_opt_pass pass_final;
*** 501,506 ****
--- 501,507 ----
  extern struct rtl_opt_pass pass_rtl_seqabstr;
  extern struct gimple_opt_pass pass_release_ssa_names;
  extern struct gimple_opt_pass pass_early_inline;
+ extern struct gimple_opt_pass pass_O0_always_inline;
  extern struct gimple_opt_pass pass_inline_parameters;
  extern struct gimple_opt_pass pass_all_early_optimizations;
  extern struct gimple_opt_pass pass_update_address_taken;
Index: ipa-inline.c
===================================================================
*** ipa-inline.c        (revision 134885)
--- ipa-inline.c        (working copy)
*************** inline_transform (struct cgraph_node *no
*** 1588,1601 ****
        todo = optimize_inline_calls (current_function_decl);
        timevar_pop (TV_INTEGRATION);
      }
-   /* In non-unit-at-a-time we must mark all referenced functions as needed. 
*/
-   if (!flag_unit_at_a_time)
-     {
-       struct cgraph_edge *e;
-       for (e = node->callees; e; e = e->next_callee)
-       if (e->callee->analyzed)
-           cgraph_mark_needed_node (e->callee);
-     }
    return todo | execute_fixup_cfg ();
  }

--- 1588,1593 ----
*************** struct ipa_opt_pass pass_ipa_inline = 
*** 1628,1631 ****
--- 1620,1681 ----
   NULL,                                        /* variable_transform */
  };

+ 
+ /* When inlining shall be performed.  */
+ static bool
+ cgraph_gate_O0_always_inline (void)
+ {
+   return !optimize || !flag_unit_at_a_time;
+ }
+ 
+ static unsigned int
+ cgraph_O0_always_inline (void)
+ {
+   struct cgraph_node *node = cgraph_node (current_function_decl);
+   unsigned int todo = 0;
+   bool inlined;
+ 
+   if (sorrycount || errorcount)
+     return 0;
+   /* We might need the body of this function so that we can expand
+      it inline somewhere else.  */
+   inlined = cgraph_decide_inlining_incrementally (node, INLINE_SPEED, 0);
+   if (cgraph_preserve_function_body_p (current_function_decl))
+     save_inline_function_body (node);
+   if (inlined || warn_inline)
+     {
+       timevar_push (TV_INTEGRATION);
+       todo = optimize_inline_calls (current_function_decl);
+       timevar_pop (TV_INTEGRATION);
+     }
+   /* In non-unit-at-a-time we must mark all referenced functions as needed. 
*/
+   if (!flag_unit_at_a_time)
+     {
+       struct cgraph_edge *e;
+       for (e = node->callees; e; e = e->next_callee)
+       if (e->callee->analyzed)
+           cgraph_mark_needed_node (e->callee);
+     }
+   return todo;
+ }
+ 
+ struct gimple_opt_pass pass_O0_always_inline = 
+ {
+  {
+   GIMPLE_PASS,
+   "always_inline",                    /* name */
+   cgraph_gate_O0_always_inline,               /* gate */
+   cgraph_O0_always_inline,            /* execute */
+   NULL,                                       /* sub */
+   NULL,                                       /* next */
+   0,                                  /* static_pass_number */
+   TV_INLINE_HEURISTICS,                       /* tv_id */
+   0,                                  /* properties_required */
+   PROP_cfg,                           /* properties_provided */
+   0,                                  /* properties_destroyed */
+   0,                                  /* todo_flags_start */
+   TODO_dump_func                      /* todo_flags_finish */
+  }
+ };
+ 
  #include "gt-ipa-inline.h"
Index: passes.c
===================================================================
*** passes.c    (revision 134885)
--- passes.c    (working copy)
*************** init_optimization_passes (void)
*** 553,558 ****
--- 553,559 ----
    /* These passes are run after IPA passes on every function that is being
       output to the assembler file.  */
    p = &all_passes;
+   NEXT_PASS (pass_O0_always_inline);
    NEXT_PASS (pass_all_optimizations);
      {
        struct opt_pass **p = &pass_all_optimizations.pass.sub;


-- 


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

Reply via email to