[Bug middle-end/36143] [4.4 Regression]: FAIL: g++.dg/tree-ssa/pr19637.C
pinskia at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Wed May 7 17:21:00 GMT 2008
------- Comment #8 from pinskia at gcc dot gnu dot org 2008-05-07 17:21 -------
Fix it:
[andrew-pinskis-computer:local/gcc/gcc] apinski% svn diff
Index: tree-ssa-forwprop.c
===================================================================
--- tree-ssa-forwprop.c (revision 135021)
+++ tree-ssa-forwprop.c (working copy)
@@ -132,6 +132,16 @@ along with GCC; see the file COPYING3.
res = VIEW_CONVERT_EXPR<type1>(type2var)
Or
+ ptr = (type1*)&type2var;
+ *ptr = res
+
+ Will get turned into (if type1 and type2 are the same size
+ and neither have volatile on them and is not a scalar):
+ VIEW_CONVERT_EXPR<type1>(type2var) = res
+ FIXME: The last constraint is not needed if DECL_GIMPLE_REG_P is expended
+ to all types
+
+ Or
ptr = &x[0];
ptr2 = ptr + <constant>;
@@ -573,6 +583,7 @@ forward_propagate_addr_expr_1 (tree name
{
tree lhs, rhs, array_ref;
tree *rhsp, *lhsp;
+ bool in_reference_lhs = false;
gcc_assert (TREE_CODE (def_rhs) == ADDR_EXPR);
@@ -602,7 +613,10 @@ forward_propagate_addr_expr_1 (tree name
ADDR_EXPR will not appear on the LHS. */
lhsp = &GIMPLE_STMT_OPERAND (use_stmt, 0);
while (handled_component_p (*lhsp))
- lhsp = &TREE_OPERAND (*lhsp, 0);
+ {
+ lhsp = &TREE_OPERAND (*lhsp, 0);
+ in_reference_lhs = true;
+ }
lhs = *lhsp;
/* Now see if the LHS node is an INDIRECT_REF using NAME. If so,
@@ -617,6 +631,43 @@ forward_propagate_addr_expr_1 (tree name
TREE_TYPE (TREE_OPERAND (def_rhs, 0))))
{
*lhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
+ lhs = *lhsp;
+ fold_stmt_inplace (use_stmt);
+ tidy_after_forward_propagate_addr (use_stmt);
+
+ /* Continue propagating into the RHS if this was not the only use. */
+ if (single_use_p)
+ return true;
+ }
+
+ /* Now see if the LHS node is an INDIRECT_REF using NAME. If so,
+ propagate the ADDR_EXPR into the use of NAME and try to
+ create a VCE for the result. */
+ if (TREE_CODE (lhs) == INDIRECT_REF
+ && TREE_OPERAND (lhs, 0) == name
+ && TYPE_SIZE (TREE_TYPE (lhs))
+ && TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0)))
+ /* Function decls should not be used for VCE either as it could be
+ a function descriptor that we want and not the actual function code.
*/
+ && TREE_CODE (TREE_OPERAND (def_rhs, 0)) != FUNCTION_DECL
+ /* We should not convert volatile loads to non volatile loads. */
+ && !TYPE_VOLATILE (TREE_TYPE (lhs))
+ && !TYPE_VOLATILE (TREE_TYPE (TREE_OPERAND (def_rhs, 0)))
+ && operand_equal_p (TYPE_SIZE (TREE_TYPE (lhs)),
+ TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0))), 0)
+ /* Check for aggregate types so we don't end up with a SSA_NAME inside
+ a VIEW_CONVERT_EXPR on the lhs.
+ FIXME: this can go away when DECL_GIMPLE_REG_P is extended for all
+ scalar types. */
+ && (AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (def_rhs, 0)))
+ || TREE_CODE (TREE_TYPE (TREE_OPERAND (def_rhs, 0))) == VECTOR_TYPE
+ || TREE_CODE (TREE_TYPE (TREE_OPERAND (def_rhs, 0))) ==
COMPLEX_TYPE))
+ {
+ tree new_lhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
+ /* Use build1 here as we not produce a right hand side so we need to
keep
+ around the VCE. */
+ new_lhs = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), new_lhs);
+ *lhsp = new_lhs;
fold_stmt_inplace (use_stmt);
tidy_after_forward_propagate_addr (use_stmt);
@@ -673,9 +724,10 @@ forward_propagate_addr_expr_1 (tree name
if (TREE_CODE (new_rhs) != VIEW_CONVERT_EXPR)
{
block_stmt_iterator bsi = bsi_for_stmt (use_stmt);
- new_rhs = force_gimple_operand_bsi (&bsi, new_rhs, true, NULL, true,
BSI_SAME_STMT);
- /* As we change the deference to a SSA_NAME, we need to return false
to make sure that
- the statement does not get removed. */
+ new_rhs = force_gimple_operand_bsi (&bsi, new_rhs, true, NULL, true,
+ BSI_SAME_STMT);
+ /* As we change the deference to a SSA_NAME, we need to return false
+ to make sure that the statement does not get removed. */
res = false;
}
*rhsp = new_rhs;
--
pinskia at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
AssignedTo|unassigned at gcc dot gnu |pinskia at gcc dot gnu dot
|dot org |org
Status|NEW |ASSIGNED
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36143
More information about the Gcc-bugs
mailing list