fix gimplification of compound lvalues

Richard Henderson rth@twiddle.net
Wed Jul 21 03:29:00 GMT 2004


Using is_gimple_tmp_var here wasn't correct, since that doesn't mean
we don't have something that satisfies is_gimple_reg.  Indeed, we got
a TREE_ADDRESSABLE, DECL_ARTIFICIAL integer variable as the index of
an array from the Ada front end.

This is enough to complete a stage2 build of the Ada front end.  At
which point we hit

+===========================GNAT BUG DETECTED==============================+
| 3.5.0 20040720 (experimental) (i686-pc-linux-gnu) Assert_Failure atree.adb:746|
| Error detected at ali.adb:280:18                                         |

during stage3 build, which no doubt indicates miscompilation somewhere.
I'd prefer someone else track down the miscompilation.  I'll fix it if
it turns out to be middle-end related.


r~


        * gimplify.c (is_gimple_tmp_var): Move to tree-gimple.c.
        (gimplify_compound_lval): Use is_gimple_tmp_reg.
        * tree-gimple.c (is_gimple_tmp_var): Move from gimplify.c.
        (is_gimple_tmp_reg): New.
        * tree-gimple.h (is_gimple_tmp_reg): Declare.

Index: gimplify.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gimplify.c,v
retrieving revision 2.51
diff -u -p -r2.51 gimplify.c
--- gimplify.c	17 Jul 2004 00:31:06 -0000	2.51
+++ gimplify.c	20 Jul 2004 22:40:59 -0000
@@ -476,16 +476,6 @@ get_initialized_tmp_var (tree val, tree 
   return internal_get_tmp_var (val, pre_p, post_p, false);
 }
 
-/*  Returns true if T is a GIMPLE temporary variable, false otherwise.  */
-
-bool
-is_gimple_tmp_var (tree t)
-{
-  /* FIXME this could trigger for other local artificials, too.  */
-  return (TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t)
-	  && !TREE_STATIC (t) && !DECL_EXTERNAL (t));
-}
-
 /* Declares all the variables in VARS in SCOPE.  */
 
 void
@@ -1569,7 +1559,7 @@ gimplify_compound_lval (tree *expr_p, tr
 		{
 	          TREE_OPERAND (t, 2) = low;
 		  tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
-					is_gimple_tmp_var, fb_rvalue);
+					is_gimple_tmp_reg, fb_rvalue);
 		  ret = MIN (ret, tret);
 		}
 	    }
@@ -1588,7 +1578,7 @@ gimplify_compound_lval (tree *expr_p, tr
 		{
 	          TREE_OPERAND (t, 3) = elmt_size;
 		  tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p, post_p,
-					is_gimple_tmp_var, fb_rvalue);
+					is_gimple_tmp_reg, fb_rvalue);
 		  ret = MIN (ret, tret);
 		}
 	    }
@@ -1610,7 +1600,7 @@ gimplify_compound_lval (tree *expr_p, tr
 		{
 	          TREE_OPERAND (t, 2) = offset;
 		  tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
-					is_gimple_tmp_var, fb_rvalue);
+					is_gimple_tmp_reg, fb_rvalue);
 		  ret = MIN (ret, tret);
 		}
 	    }
@@ -1641,7 +1631,7 @@ gimplify_compound_lval (tree *expr_p, tr
 	  if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
 	    {
 	      tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
-				    is_gimple_tmp_var, fb_rvalue);
+				    is_gimple_tmp_reg, fb_rvalue);
 	      ret = MIN (ret, tret);
 	    }
 	}
Index: tree-gimple.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-gimple.c,v
retrieving revision 2.16
diff -u -p -r2.16 tree-gimple.c
--- tree-gimple.c	16 Jul 2004 23:25:38 -0000	2.16
+++ tree-gimple.c	20 Jul 2004 22:40:59 -0000
@@ -447,6 +447,34 @@ is_gimple_reg (tree t)
 	  && ! needs_to_live_in_memory (t));
 }
 
+/* Returns true if T is a GIMPLE temporary variable, false otherwise.  */
+
+bool
+is_gimple_tmp_var (tree t)
+{
+  /* FIXME this could trigger for other local artificials, too.  */
+  return (TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t)
+	  && !TREE_STATIC (t) && !DECL_EXTERNAL (t));
+}
+
+/* Returns true if T is a GIMPLE temporary register variable.  */
+
+bool
+is_gimple_tmp_reg (tree t)
+{
+  /* The intent of this is to get hold of a value that won't change.
+     An SSA_NAME qualifies no matter if its of a user variable or not.  */
+  if (TREE_CODE (t) == SSA_NAME)
+    return true;
+
+  /* We don't know the lifetime characteristics of user variables.  */
+  if (TREE_CODE (t) != VAR_DECL || !DECL_ARTIFICIAL (t))
+    return false;
+
+  /* Finally, it must be capable of being placed in a register.  */
+  return is_gimple_reg (t);
+}
+
 /* Return true if T is a GIMPLE variable whose address is not needed.  */
 
 bool
Index: tree-gimple.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-gimple.h,v
retrieving revision 2.13
diff -u -p -r2.13 tree-gimple.h
--- tree-gimple.h	14 Jul 2004 18:16:48 -0000	2.13
+++ tree-gimple.h	20 Jul 2004 22:40:59 -0000
@@ -28,7 +28,6 @@ Boston, MA 02111-1307, USA.  */
 extern tree create_tmp_var_raw (tree, const char *);
 extern tree create_tmp_var_name (const char *);
 extern tree create_tmp_var (tree, const char *);
-extern bool is_gimple_tmp_var (tree);
 extern tree get_initialized_tmp_var (tree, tree *, tree *);
 extern tree get_formal_tmp_var (tree, tree *);
 extern void declare_tmp_vars (tree, tree);
@@ -48,6 +47,10 @@ extern bool is_gimple_stmt (tree);
 extern bool is_gimple_reg_type (tree);
 /* Returns true iff T is a scalar register variable.  */
 extern bool is_gimple_reg (tree);
+/* Returns true if T is a GIMPLE temporary variable, false otherwise.  */
+extern bool is_gimple_tmp_var (tree);
+/* Returns true if T is a GIMPLE temporary register variable.  */
+extern bool is_gimple_tmp_reg (tree);
 /* Returns true iff T is any sort of variable.  */
 extern bool is_gimple_variable (tree);
 /* Returns true iff T is a variable or an INDIRECT_REF (of a variable).  */



More information about the Gcc-patches mailing list