This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: API for callgraph and IPA passes for whole program optimization


Hi,
based on the discussion, this is change I would like to do to the
passmanager.  I am sending the header change only first, because the
actual change will need updating all PM datastructure initializers and
compensate testsuite and documentation for the removal of RTL dump
letters so I would rather do that just once.  Does this seem OK?

The patch include the read/write methods that will be just placeholders
on mainline.  Naturally I can remove them for time being at least as
long as we think the RTL_PASS/TREE_PASS macros are good idea.  I can
quite easilly see that those are stepping back from plan not making
passmanager poluted by ugly macros, but on the other hand since the PM
is now doing RTL/IPA/tree passes it needs at least a little of
flexibility to be able update API of one without affecting others.

Alternative would be some simple inheriatance scheme: have the common
fields in one structure and derrived tree/ipa/RTL pass structures.
It complicates passes.c somewhat but I can definitly do that.

Jan

Index: tree-pass.h
===================================================================
*** tree-pass.h	(revision 133036)
--- tree-pass.h	(working copy)
*************** extern const char *dump_file_name;
*** 88,93 ****
--- 88,97 ----
  /* Return the dump_file_info for the given phase.  */
  extern struct dump_file_info *get_dump_file_info (enum tree_dump_index);
  
+ /* Forward declare so we don't need to bring in cgraph and varpool include.  */
+ struct cgraph_node;
+ struct varpool_node;
+ 
  /* Describe one pass.  */
  struct tree_opt_pass
  {
*************** struct tree_opt_pass
*** 98,108 ****
--- 102,129 ----
       the function returns true.  */
    bool (*gate) (void);
  
+   /* IPA passes can analyze function body and variable initializers using this
+      hook and produce summary.  */
+   void (*function_generate_summary) (struct cgraph_node *);
+   void (*variable_generate_summary) (struct varpool_node *);
+ 
+   /* These hooks will be used to serialize IPA summaries on disk.  For a moment
+      they are just placeholders.  */
+   void (*function_write_summary) (struct cgraph_node *);
+   void (*variable_write_summary) (struct varpool_node *);
+   void (*function_read_summary) (struct cgraph_node *);
+   void (*variable_read_summary) (struct varpool_node *);
+ 
    /* This is the code to run.  If null, then there should be sub-passes
       otherwise this pass does nothing.  The return value contains
       TODOs to execute in addition to those in TODO_flags_finish.   */
    unsigned int (*execute) (void);
  
+   /* Results of interprocedural propagation of an IPA pass is applied to
+      function body via this hook.  */
+   void (*function_transform) (struct cgraph_node *);
+   void (*variable_transform) (struct varpool_node *);
+ 
    /* A list of sub-passes to run, dependent on gate predicate.  */
    struct tree_opt_pass *sub;
  
*************** struct tree_opt_pass
*** 124,134 ****
    /* Flags indicating common sets things to do before and after.  */
    unsigned int todo_flags_start;
    unsigned int todo_flags_finish;
- 
-   /* Letter for RTL dumps.  */
-   char letter;
  };
  
  /* Define a tree dump switch.  */
  struct dump_file_info
  {
--- 145,166 ----
    /* Flags indicating common sets things to do before and after.  */
    unsigned int todo_flags_start;
    unsigned int todo_flags_finish;
  };
  
+ /* RTL and tree passes are using just some of the hooks.  The macros makes
+    it easier to add more hooks for different passes in future.  */
+ #define RTL_PASS(execute) NULL, NULL, NULL, NULL, execute, NULL, NULL
+ #define TREE_PASS(execute) NULL, NULL, NULL, NULL, execute, NULL, NULL
+ /* IPA passes not using the generate_summary/execute/transform scheme and thus
+    not scalable for whole program optimization can use just execute hook.  */
+ #define SIMPLE_IPA_PASS(execute) NULL, NULL, NULL, NULL, execute, NULL, NULL
+ 
+ #define IPA_PASS_GENERATE_SUMMARY(fun,var) fun,var,
+ #define IPA_PASS_WRITE(fun,var) fun,var,
+ #define IPA_PASS_READ(fun,var) fun,var,
+ #define IPA_PASS_EXECUTE(execute) execute
+ #define IPA_PASS_TRANSFORM(fun,var) fun,var,
+ 
  /* Define a tree dump switch.  */
  struct dump_file_info
  {
*************** struct dump_file_info
*** 138,144 ****
    int flags;                    /* user flags */
    int state;                    /* state of play */
    int num;                      /* dump file number */
-   int letter;                   /* enabling letter for RTL dumps */
  };
  
  /* Pass properties.  */
--- 170,175 ----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]