+++ /dev/null
- * tree-ssa-dom.c (find_equivalent_equality_comparison): Do not
- a eliminate type conversion which feeds an equality comparison
- if the original type or either operand in the comparison is a
- function pointer.
-
-*** gcc/gcc/tree-ssa-dom.c 24 Feb 2005 21:47:26 -0000 2.94
---- gcc/gcc/tree-ssa-dom.c 30 Jun 2005 23:07:18 -0000
-*************** find_equivalent_equality_comparison (tre
-*** 1929,1934 ****
---- 1929,1946 ----
- {
- tree def_rhs = TREE_OPERAND (def_stmt, 1);
-
-+
-+ /* If either operand to the comparison is a pointer to
-+ a function, then we can not apply this optimization
-+ as some targets require function pointers to be
-+ canonicalized and in this case this optimization would
-+ eliminate a necessary canonicalization. */
-+ if ((POINTER_TYPE_P (TREE_TYPE (op0))
-+ && TREE_CODE (TREE_TYPE (TREE_TYPE (op0))) == FUNCTION_TYPE)
-+ || (POINTER_TYPE_P (TREE_TYPE (op1))
-+ && TREE_CODE (TREE_TYPE (TREE_TYPE (op1))) == FUNCTION_TYPE))
-+ return NULL;
-+
- /* Now make sure the RHS of the MODIFY_EXPR is a typecast. */
- if ((TREE_CODE (def_rhs) == NOP_EXPR
- || TREE_CODE (def_rhs) == CONVERT_EXPR)
-*************** find_equivalent_equality_comparison (tre
-*** 1942,1947 ****
---- 1954,1969 ----
- > TYPE_PRECISION (TREE_TYPE (def_rhs)))
- return NULL;
-
-+ /* If the inner type of the conversion is a pointer to
-+ a function, then we can not apply this optimization
-+ as some targets require function pointers to be
-+ canonicalized. This optimization would result in
-+ canonicalization of the pointer when it was not originally
-+ needed/intended. */
-+ if (POINTER_TYPE_P (def_rhs_inner_type)
-+ && TREE_CODE (TREE_TYPE (def_rhs_inner_type)) == FUNCTION_TYPE)
-+ return NULL;
-+
- /* What we want to prove is that if we convert OP1 to
- the type of the object inside the NOP_EXPR that the
- result is still equivalent to SRC.
+++ /dev/null
---- gcc/gcc/tree-ssa-structalias.c 2005/06/30 22:18:35 2.8
-+++ gcc/gcc/tree-ssa-structalias.c 2005/07/01 19:45:23 2.9
-@@ -1940,6 +1940,25 @@
- }
-
-
-+/* Return true if an access to [ACCESSPOS, ACCESSSIZE]
-+ overlaps with a field at [FIELDPOS, FIELDSIZE] */
-+
-+static bool
-+offset_overlaps_with_access (const unsigned HOST_WIDE_INT fieldpos,
-+ const unsigned HOST_WIDE_INT fieldsize,
-+ const unsigned HOST_WIDE_INT accesspos,
-+ const unsigned HOST_WIDE_INT accesssize)
-+{
-+ if (fieldpos == accesspos && fieldsize == accesssize)
-+ return true;
-+ if (accesspos >= fieldpos && accesspos <= (fieldpos + fieldsize))
-+ return true;
-+ if (accesspos < fieldpos && (accesspos + accesssize > fieldpos))
-+ return true;
-+
-+ return false;
-+}
-+
- /* Given a COMPONENT_REF T, return the constraint_expr for it. */
-
- static struct constraint_expr
-@@ -2000,8 +2019,27 @@
- we may have to do something cute here. */
-
- if (result.offset < get_varinfo (result.var)->fullsize)
-- result.var = first_vi_for_offset (get_varinfo (result.var),
-- result.offset)->id;
-+ {
-+ /* It's also not true that the constraint will actually start at the
-+ right offset, it may start in some padding. We only care about
-+ setting the constraint to the first actual field it touches, so
-+ walk to find it. */
-+ varinfo_t curr;
-+ for (curr = get_varinfo (result.var); curr; curr = curr->next)
-+ {
-+ if (offset_overlaps_with_access (curr->offset, curr->size,
-+ result.offset, bitsize))
-+ {
-+ result.var = curr->id;
-+ break;
-+
-+ }
-+ }
-+ /* assert that we found *some* field there. The user couldn't be
-+ accessing *only* padding. */
-+
-+ gcc_assert (curr);
-+ }
- else
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, "Access to past the end of variable, ignoring\n");