Commit 359bea1d by Alexandre Oliva Committed by Alexandre Oliva

re PR debug/45419 (-fcompare-debug failure at -O3)

PR debug/45419
PR debug/45408
* tree-pretty-print.c (dump_generic_node): Disregard top-level
qualifiers in otherwise equal MEM_REF pointer types.
* fold-const.c (operand_equal_p): Compare pointer type of MEM_REFs.
* tree.c (iterative_hash_expr): Hash the pointer type of MEM_REFs.

From-SVN: r164031
parent 0a7822a3
2010-09-08 Alexandre Oliva <aoliva@redhat.com>
PR debug/45419
PR debug/45408
* tree-pretty-print.c (dump_generic_node): Disregard top-level
qualifiers in otherwise equal MEM_REF pointer types.
* fold-const.c (operand_equal_p): Compare pointer type of MEM_REFs.
* tree.c (iterative_hash_expr): Hash the pointer type of MEM_REFs.
2010-09-08 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> 2010-09-08 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR target/44392 PR target/44392
......
...@@ -2591,14 +2591,17 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) ...@@ -2591,14 +2591,17 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
return OP_SAME (0); return OP_SAME (0);
case MEM_REF: case MEM_REF:
/* Require equal access sizes. We can have incomplete types /* Require equal access sizes, and similar pointer types.
for array references of variable-sized arrays from the We can have incomplete types for array references of
Fortran frontent though. */ variable-sized arrays from the Fortran frontent
though. */
return ((TYPE_SIZE (TREE_TYPE (arg0)) == TYPE_SIZE (TREE_TYPE (arg1)) return ((TYPE_SIZE (TREE_TYPE (arg0)) == TYPE_SIZE (TREE_TYPE (arg1))
|| (TYPE_SIZE (TREE_TYPE (arg0)) || (TYPE_SIZE (TREE_TYPE (arg0))
&& TYPE_SIZE (TREE_TYPE (arg1)) && TYPE_SIZE (TREE_TYPE (arg1))
&& operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0)), && operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0)),
TYPE_SIZE (TREE_TYPE (arg1)), flags))) TYPE_SIZE (TREE_TYPE (arg1)), flags)))
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg0, 1)))
== TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg1, 1))))
&& OP_SAME (0) && OP_SAME (1)); && OP_SAME (0) && OP_SAME (1));
case ARRAY_REF: case ARRAY_REF:
......
...@@ -809,8 +809,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, ...@@ -809,8 +809,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
== TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 1)))) == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 1))))
&& (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 0))) && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 0)))
== TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 1)))) == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 1))))
&& (TYPE_QUALS (TREE_TYPE (TREE_OPERAND (node, 0))) && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node, 0)))
== TYPE_QUALS (TREE_TYPE (TREE_OPERAND (node, 1)))) == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node, 1))))
/* Same value types ignoring qualifiers. */ /* Same value types ignoring qualifiers. */
&& (TYPE_MAIN_VARIANT (TREE_TYPE (node)) && (TYPE_MAIN_VARIANT (TREE_TYPE (node))
== TYPE_MAIN_VARIANT == TYPE_MAIN_VARIANT
...@@ -829,9 +829,12 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, ...@@ -829,9 +829,12 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
} }
else else
{ {
tree ptype;
pp_string (buffer, "MEM["); pp_string (buffer, "MEM[");
pp_string (buffer, "("); pp_string (buffer, "(");
dump_generic_node (buffer, TREE_TYPE (TREE_OPERAND (node, 1)), ptype = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node, 1)));
dump_generic_node (buffer, ptype,
spc, flags | TDF_SLIM, false); spc, flags | TDF_SLIM, false);
pp_string (buffer, ")"); pp_string (buffer, ")");
dump_generic_node (buffer, TREE_OPERAND (node, 0), dump_generic_node (buffer, TREE_OPERAND (node, 0),
...@@ -1170,8 +1173,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, ...@@ -1170,8 +1173,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
== TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 1)))) == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 1))))
&& (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 0))) && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 0)))
== TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 1)))) == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 1))))
&& (TYPE_QUALS (TREE_TYPE (TREE_OPERAND (op0, 0))) && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (op0, 0)))
== TYPE_QUALS (TREE_TYPE (TREE_OPERAND (op0, 1)))) == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (op0, 1))))
/* Same value types ignoring qualifiers. */ /* Same value types ignoring qualifiers. */
&& (TYPE_MAIN_VARIANT (TREE_TYPE (op0)) && (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
== TYPE_MAIN_VARIANT == TYPE_MAIN_VARIANT
......
...@@ -6768,6 +6768,21 @@ iterative_hash_expr (const_tree t, hashval_t val) ...@@ -6768,6 +6768,21 @@ iterative_hash_expr (const_tree t, hashval_t val)
} }
return val; return val;
} }
case MEM_REF:
{
/* The type of the second operand is relevant, except for
its top-level qualifiers. */
tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (t, 1)));
val = iterative_hash_object (TYPE_HASH (type), val);
/* We could use the standard hash computation from this point
on. */
val = iterative_hash_object (code, val);
val = iterative_hash_expr (TREE_OPERAND (t, 1), val);
val = iterative_hash_expr (TREE_OPERAND (t, 0), val);
return val;
}
case FUNCTION_DECL: case FUNCTION_DECL:
/* When referring to a built-in FUNCTION_DECL, use the __builtin__ form. /* When referring to a built-in FUNCTION_DECL, use the __builtin__ form.
Otherwise nodes that compare equal according to operand_equal_p might Otherwise nodes that compare equal according to operand_equal_p might
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment