This is the mail archive of the gcc-patches@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: [PATCH][RFC] Gimplify unit-at-a-time (again)


On Thu, 16 Jul 2009, Andrew Haley wrote:

> Basically OK, but:
> 
> > Index: gcc/java/java-gimplify.c
> > ===================================================================
> > *** gcc/java/java-gimplify.c.orig	2009-06-15 11:55:46.000000000 +0200
> > --- gcc/java/java-gimplify.c	2009-07-06 12:42:24.000000000 +0200
> > *************** java_gimplify_expr (tree *expr_p, gimple
> > *** 65,87 ****
> >         *expr_p = java_gimplify_block (*expr_p);
> >         break;
> >
> > -     case VAR_DECL:
> > -       *expr_p = java_replace_reference (*expr_p, /* want_lvalue */ false);
> > -       return GS_UNHANDLED;
> > -
> >       case MODIFY_EXPR:
> >         return java_gimplify_modify_expr (expr_p);
> >
> > -     case SAVE_EXPR:
> > -       /* Note that we can see <save_expr NULL> if the save_expr was
> > - 	 already handled by gimplify_save_expr.  */
> > -       if (TREE_OPERAND (*expr_p, 0) != NULL_TREE
> > - 	  && TREE_CODE (TREE_OPERAND (*expr_p, 0)) == VAR_DECL)
> 
> I take it that this is no longer necessary?

Correct.  This is now done during genericization.

> 
> > - 	TREE_OPERAND (*expr_p, 0)
> > - 	  = java_replace_reference (TREE_OPERAND (*expr_p, 0),
> > - 			       /* want_lvalue */ false);
> > -       return GS_UNHANDLED;
> > -
> >       case POSTINCREMENT_EXPR:
> >       case POSTDECREMENT_EXPR:
> >       case PREINCREMENT_EXPR:
> > --- 61,69 ----
> > Index: gcc/java/decl.c
> > ===================================================================
> > *** gcc/java/decl.c.orig	2009-06-15 11:55:46.000000000 +0200
> > --- gcc/java/decl.c	2009-07-06 12:42:24.000000000 +0200
> > *************** java_replace_reference (tree var_decl, b
> > *** 342,347 ****
> > --- 342,376 ----
> >   }
> >
> >
> > + tree
> > + java_replace_references (tree *tp, int *walk_subtrees,
> > + 			 void *data ATTRIBUTE_UNUSED)
> 
> In moving this code you deleted the explanatory comment.  Please put it
> back.

Ok, done.

> > + {
> > +   if (TREE_CODE (*tp) == MODIFY_EXPR)
> > +     {
> > +       tree lhs = TREE_OPERAND (*tp, 0);
> > +       if (TREE_CODE (lhs) == VAR_DECL
> > + 	  && DECL_LANG_SPECIFIC (lhs)
> > + 	  && LOCAL_SLOT_P (lhs)
> > + 	  && TREE_CODE (TREE_TYPE (lhs)) == POINTER_TYPE)
> > + 	{
> > + 	  tree new_lhs = java_replace_reference (lhs, /* want_lvalue */ true);
> > + 	  tree new_rhs = build1 (NOP_EXPR, TREE_TYPE (new_lhs),
> > + 				 TREE_OPERAND (*tp, 1));
> > + 	  *tp = build2 (MODIFY_EXPR, TREE_TYPE (new_lhs),
> > + 			new_lhs, new_rhs);
> > + 	  *tp = build1 (NOP_EXPR, TREE_TYPE (lhs), *tp);
> > + 	}
> > +     }
> > +   if (TREE_CODE (*tp) == VAR_DECL)
> > +     {
> > +       *tp = java_replace_reference (*tp, /* want_lvalue */ false);
> > +       *walk_subtrees = 0;
> > +     }
> > +
> > +   return NULL_TREE;
> > + }
> > +
> >   /* Same as find_local_index, except that INDEX is a stack index. */
> >
> >   tree
> 
> Also, I presume that this is a real regression:

I'll followup in the followup.

I'm re-testing the following (java/ only diff):


        java/
        * java-gimplify.c (java_genericize): Do not gimplify here.
        But replace all local references.
        (java_gimplify_expr): Do not replace local references here.
        (java_gimplify_modify_expr): Likewise.
        * jcf-parse.c (java_parse_file): Do not finalize the CU or
        optimize the cgraph here.
        * decl.c (java_replace_reference): Make static.
        (java_replace_references): New function.
        (end_java_method): Clear base_decl_map.
        * java-tree.h (java_replace_references): Declare.
        (java_replace_reference): Remove.

Index: java-gimplify.c
===================================================================
*** java-gimplify.c	(revision 149701)
--- java-gimplify.c	(working copy)
*************** static void dump_java_tree (enum tree_du
*** 44,55 ****
  void
  java_genericize (tree fndecl)
  {
    dump_java_tree (TDI_original, fndecl);
- 
-   /* Genericize with the gimplifier.  */
-   gimplify_function_tree (fndecl);
- 
-   dump_function (TDI_generic, fndecl);
  }
  
  /* Gimplify a Java tree.  */
--- 44,51 ----
  void
  java_genericize (tree fndecl)
  {
+   walk_tree (&DECL_SAVED_TREE (fndecl), java_replace_references, NULL, NULL);
    dump_java_tree (TDI_original, fndecl);
  }
  
  /* Gimplify a Java tree.  */
*************** java_gimplify_expr (tree *expr_p, gimple
*** 65,87 ****
        *expr_p = java_gimplify_block (*expr_p);
        break;
  
-     case VAR_DECL:
-       *expr_p = java_replace_reference (*expr_p, /* want_lvalue */ false);
-       return GS_UNHANDLED;
- 
      case MODIFY_EXPR:
        return java_gimplify_modify_expr (expr_p);
  
-     case SAVE_EXPR:
-       /* Note that we can see <save_expr NULL> if the save_expr was
- 	 already handled by gimplify_save_expr.  */
-       if (TREE_OPERAND (*expr_p, 0) != NULL_TREE
- 	  && TREE_CODE (TREE_OPERAND (*expr_p, 0)) == VAR_DECL)
- 	TREE_OPERAND (*expr_p, 0) 
- 	  = java_replace_reference (TREE_OPERAND (*expr_p, 0), 
- 			       /* want_lvalue */ false);
-       return GS_UNHANDLED;
- 
      case POSTINCREMENT_EXPR:
      case POSTDECREMENT_EXPR:
      case PREINCREMENT_EXPR:
--- 61,69 ----
*************** java_gimplify_modify_expr (tree *modify_
*** 110,136 ****
    tree rhs = TREE_OPERAND (modify_expr, 1);
    tree lhs_type = TREE_TYPE (lhs);
  
!   /* This is specific to the bytecode compiler.  If a variable has
!      LOCAL_SLOT_P set, replace an assignment to it with an assignment
!      to the corresponding variable that holds all its aliases.  */
!   if (TREE_CODE (lhs) == VAR_DECL
!       && DECL_LANG_SPECIFIC (lhs)
!       && LOCAL_SLOT_P (lhs)
!       && TREE_CODE (lhs_type) == POINTER_TYPE)
!     {
!       tree new_lhs = java_replace_reference (lhs, /* want_lvalue */ true);
!       tree new_rhs = build1 (NOP_EXPR, TREE_TYPE (new_lhs), rhs);
!       modify_expr = build2 (MODIFY_EXPR, TREE_TYPE (new_lhs),
! 			    new_lhs, new_rhs);
!       modify_expr = build1 (NOP_EXPR, lhs_type, modify_expr);
!     }
!   else if (lhs_type != TREE_TYPE (rhs))
      /* Fix up type mismatches to make legal GIMPLE.  These are
         generated in several places, in particular null pointer
         assignment and subclass assignment.  */
      TREE_OPERAND (modify_expr, 1) = convert (lhs_type, rhs);
  
-   *modify_expr_p = modify_expr;
    return GS_UNHANDLED;
  }
  
--- 92,103 ----
    tree rhs = TREE_OPERAND (modify_expr, 1);
    tree lhs_type = TREE_TYPE (lhs);
  
!   if (lhs_type != TREE_TYPE (rhs))
      /* Fix up type mismatches to make legal GIMPLE.  These are
         generated in several places, in particular null pointer
         assignment and subclass assignment.  */
      TREE_OPERAND (modify_expr, 1) = convert (lhs_type, rhs);
  
    return GS_UNHANDLED;
  }
  
Index: decl.c
===================================================================
*** decl.c	(revision 149701)
--- decl.c	(working copy)
*************** find_local_variable (int index, tree typ
*** 306,318 ****
    return decl;
  }
  
! /* Called during gimplification for every variable.  If the variable
     is a temporary of pointer type, replace it with a common variable
     thath is used to hold all pointer types that are ever stored in
     that slot.  Set WANT_LVALUE if you want a variable that is to be
     written to.  */
  
! tree 
  java_replace_reference (tree var_decl, bool want_lvalue)
  {
    tree decl_type;
--- 306,318 ----
    return decl;
  }
  
! /* Called during genericization for every variable.  If the variable
     is a temporary of pointer type, replace it with a common variable
     thath is used to hold all pointer types that are ever stored in
     that slot.  Set WANT_LVALUE if you want a variable that is to be
     written to.  */
  
! static tree 
  java_replace_reference (tree var_decl, bool want_lvalue)
  {
    tree decl_type;
*************** java_replace_reference (tree var_decl, b
*** 341,346 ****
--- 341,379 ----
    return var_decl;
  }
  
+ /* Helper for java_genericize.  */
+ 
+ tree
+ java_replace_references (tree *tp, int *walk_subtrees,
+ 			 void *data ATTRIBUTE_UNUSED)
+ {
+   if (TREE_CODE (*tp) == MODIFY_EXPR)
+     {
+       tree lhs = TREE_OPERAND (*tp, 0);
+       /* This is specific to the bytecode compiler.  If a variable has
+ 	 LOCAL_SLOT_P set, replace an assignment to it with an assignment
+ 	 to the corresponding variable that holds all its aliases.  */
+       if (TREE_CODE (lhs) == VAR_DECL
+ 	  && DECL_LANG_SPECIFIC (lhs)
+ 	  && LOCAL_SLOT_P (lhs)
+ 	  && TREE_CODE (TREE_TYPE (lhs)) == POINTER_TYPE)
+ 	{
+ 	  tree new_lhs = java_replace_reference (lhs, /* want_lvalue */ true);
+ 	  tree new_rhs = build1 (NOP_EXPR, TREE_TYPE (new_lhs),
+ 				 TREE_OPERAND (*tp, 1));
+ 	  *tp = build2 (MODIFY_EXPR, TREE_TYPE (new_lhs),
+ 			new_lhs, new_rhs);
+ 	  *tp = build1 (NOP_EXPR, TREE_TYPE (lhs), *tp);
+ 	}
+     }
+   if (TREE_CODE (*tp) == VAR_DECL)
+     {
+       *tp = java_replace_reference (*tp, /* want_lvalue */ false);
+       *walk_subtrees = 0;
+     }
+ 
+   return NULL_TREE;
+ }
  
  /* Same as find_local_index, except that INDEX is a stack index. */
  
*************** end_java_method (void)
*** 1877,1882 ****
--- 1910,1916 ----
    finish_method (fndecl);
  
    current_function_decl = NULL_TREE;
+   base_decl_map = NULL_TREE;
  }
  
  /* Prepare a method for expansion.  */
Index: jcf-parse.c
===================================================================
*** jcf-parse.c	(revision 149701)
--- jcf-parse.c	(working copy)
*************** java_parse_file (int set_yydebug ATTRIBU
*** 1982,1992 ****
    /* Arrange for any necessary initialization to happen.  */
    java_emit_static_constructor ();
    gcc_assert (global_bindings_p ());
- 
-   /* Only finalize the compilation unit after we've told cgraph which
-      functions have their addresses stored.  */
-   cgraph_finalize_compilation_unit ();
-   cgraph_optimize ();
  }
  
  
--- 1982,1987 ----
Index: java-tree.h
===================================================================
*** java-tree.h	(revision 149701)
--- java-tree.h	(working copy)
*************** extern int find_class_or_string_constant
*** 1119,1125 ****
  
  extern tree pushdecl_top_level (tree);
  extern tree pushdecl_function_level (tree);
! extern tree java_replace_reference (tree, bool);
  extern int alloc_class_constant (tree);
  extern void init_expr_processing (void);
  extern void push_super_field (tree, tree);
--- 1119,1125 ----
  
  extern tree pushdecl_top_level (tree);
  extern tree pushdecl_function_level (tree);
! extern tree java_replace_references (tree *, int *, void *);
  extern int alloc_class_constant (tree);
  extern void init_expr_processing (void);
  extern void push_super_field (tree, tree);


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