Re: valid_gimple_expression_p claims validity of invalid gimple

2007-07-15 Thread Daniel Berlin

On 7/14/07, Eric Botcazou [EMAIL PROTECTED] wrote:

 First is_gimple_min_invariant in try_to_simplify where it chooses
 DECL_INITIAL should be valid_gimple_expression_p instead.

That's a known problem, see tree-ssa-ccp.c:


I had forgotten about this because i hadn't done IPA in a while.  At
some point, we should just create special initializer functions and
gimplify these into them.


/* The regular is_gimple_min_invariant does a shallow test of the object.
   It assumes that full gimplification has happened, or will happen on the
   object.  For a value coming from DECL_INITIAL, this is not true, so we
   have to be more strict ourselves.  */

static bool
ccp_decl_initial_min_invariant (tree t)
{
  if (!is_gimple_min_invariant (t))
return false;
  if (TREE_CODE (t) == ADDR_EXPR)
{
  /* Inline and unroll is_gimple_addressable.  */
  while (1)
{
  t = TREE_OPERAND (t, 0);
  if (is_gimple_id (t))
return true;
  if (!handled_component_p (t))
return false;
}
}
  return true;
}

static tree
get_symbol_constant_value (tree sym)
{
  if (TREE_STATIC (sym)
   TREE_READONLY (sym)
   !MTAG_P (sym))
{
  tree val = DECL_INITIAL (sym);
  if (val
   ccp_decl_initial_min_invariant (val))
return val;
}

  return NULL_TREE;
}

You could turn ccp_decl_initial_min_invariant into a global predicate and
invoke it from tree-ssa-sccvn.c on the DECL_INITIAL.

 However, even if i fix this, the testcase still fails because
 valid_gimple_expression says something that is clearly invalid is
 valid.

 (gdb) p valid_gimple_expression_p ($2)
 $3 = 1 '\001'
 (gdb) p debug_generic_stmt ($2)
 ((struct RegisterLayout *) (char *) SimulatedRegisters)-intmask;

 This is not valid gimple by a longshot :)

Almost. :-)  The function was extracted unchanged from set_rhs but it looks
like it needs to be beefed up a bit if it is to become of general use.

 If you fix this part, i'll happily fix the bug report with the first part.

The problem is again the ADDR_EXPR case, because it drags lvalues into the
game.  This would be something like:


I'll try this and submit it as part of my patch if it works.

Thanks a ton!


Re: valid_gimple_expression_p claims validity of invalid gimple

2007-07-14 Thread Eric Botcazou
 First is_gimple_min_invariant in try_to_simplify where it chooses
 DECL_INITIAL should be valid_gimple_expression_p instead.

That's a known problem, see tree-ssa-ccp.c:

/* The regular is_gimple_min_invariant does a shallow test of the object.
   It assumes that full gimplification has happened, or will happen on the
   object.  For a value coming from DECL_INITIAL, this is not true, so we
   have to be more strict ourselves.  */

static bool
ccp_decl_initial_min_invariant (tree t)
{
  if (!is_gimple_min_invariant (t))
return false;
  if (TREE_CODE (t) == ADDR_EXPR)
{
  /* Inline and unroll is_gimple_addressable.  */
  while (1)
{
  t = TREE_OPERAND (t, 0);
  if (is_gimple_id (t))
return true;
  if (!handled_component_p (t))
return false;
}
}
  return true;
}

static tree
get_symbol_constant_value (tree sym)
{
  if (TREE_STATIC (sym)
   TREE_READONLY (sym)
   !MTAG_P (sym))
{
  tree val = DECL_INITIAL (sym);
  if (val
   ccp_decl_initial_min_invariant (val))
return val;
}

  return NULL_TREE;
}

You could turn ccp_decl_initial_min_invariant into a global predicate and 
invoke it from tree-ssa-sccvn.c on the DECL_INITIAL.

 However, even if i fix this, the testcase still fails because
 valid_gimple_expression says something that is clearly invalid is
 valid.

 (gdb) p valid_gimple_expression_p ($2)
 $3 = 1 '\001'
 (gdb) p debug_generic_stmt ($2)
 ((struct RegisterLayout *) (char *) SimulatedRegisters)-intmask;

 This is not valid gimple by a longshot :)

Almost. :-)  The function was extracted unchanged from set_rhs but it looks 
like it needs to be beefed up a bit if it is to become of general use.

 If you fix this part, i'll happily fix the bug report with the first part.

The problem is again the ADDR_EXPR case, because it drags lvalues into the 
game.  This would be something like:

Index: tree-ssa-propagate.c
===
--- tree-ssa-propagate.c(revision 126545)
+++ tree-ssa-propagate.c(working copy)
@@ -606,10 +606,21 @@ valid_gimple_expression_p (tree expr)
   switch (code)
{
case ADDR_EXPR:
-  if (TREE_CODE (TREE_OPERAND (expr, 0)) == ARRAY_REF
-  !is_gimple_val (TREE_OPERAND (TREE_OPERAND (expr, 0), 1)))
-   return false;
- break;
+ {
+   tree t = TREE_OPERAND (expr, 0);
+   while (handled_component_p (t))
+ {
+   /* ??? More checks needed, see the GIMPLE verifier.  */
+   if ((TREE_CODE (t) == ARRAY_REF
+|| TREE_CODE (t) == ARRAY_RANGE_REF)
+!is_gimple_val (TREE_OPERAND (t, 1)))
+ return false;
+   t = TREE_OPERAND (t, 0);
+ }
+   if (!is_gimple_addressable (t))
+ return false;
+   break;
+ }
 
case TRUTH_NOT_EXPR:
  if (!is_gimple_val (TREE_OPERAND (expr, 0)))

-- 
Eric Botcazou


valid_gimple_expression_p claims validity of invalid gimple

2007-07-13 Thread Daniel Berlin

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

is really caused by a combination of two things

First is_gimple_min_invariant in try_to_simplify where it chooses
DECL_INITIAL should be valid_gimple_expression_p instead.

However, even if i fix this, the testcase still fails because
valid_gimple_expression says something that is clearly invalid is
valid.

(gdb) p valid_gimple_expression_p ($2)
$3 = 1 '\001'
(gdb) p debug_generic_stmt ($2)
((struct RegisterLayout *) (char *) SimulatedRegisters)-intmask;

This is not valid gimple by a longshot :)

If you fix this part, i'll happily fix the bug report with the first part.