diff options
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/tree-ssa-forwprop.c | 41 | 
2 files changed, 28 insertions, 18 deletions
| diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 80b318f..12a9f52 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-10-18  Richard Guenther  <rguenther@suse.de> + +	* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Guard +	VIEW_CONVERT_EXPR case against invalid gimple. +  2008-10-17  Andreas Krebbel  <krebbel1@de.ibm.com>  	* c-parser.c (c_parser_binary_expression): Silence the diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index 3513ee0..7a5233b 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -767,8 +767,8 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,        && TREE_OPERAND (rhs, 0) == name        && TYPE_SIZE (TREE_TYPE (rhs))        && 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.  */ +      /* 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 (rhs)) @@ -776,22 +776,27 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,        && operand_equal_p (TYPE_SIZE (TREE_TYPE (rhs)),  			  TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0))), 0))      { -      bool res = true; -      tree new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0)); -      new_rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (rhs), new_rhs); -      /* If we have folded the VCE, then we have to create a new statement.  */ -      if (TREE_CODE (new_rhs) != VIEW_CONVERT_EXPR) -	{ -	  gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt); -	  new_rhs = force_gimple_operand_gsi (&gsi, new_rhs, true, NULL, true, GSI_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; -      fold_stmt_inplace (use_stmt); -      tidy_after_forward_propagate_addr (use_stmt); -      return res; +     tree new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0)); +     new_rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (rhs), new_rhs); +     if (TREE_CODE (new_rhs) != VIEW_CONVERT_EXPR) +       { +	 /* If we have folded the VIEW_CONVERT_EXPR then the result is only +	    valid if we can replace the whole rhs of the use statement.  */ +	 if (rhs != gimple_assign_rhs1 (use_stmt)) +	   return false; +	 new_rhs = force_gimple_operand_gsi (use_stmt_gsi, new_rhs, true, NULL, +					     true, GSI_NEW_STMT); +	 gimple_assign_set_rhs1 (use_stmt, new_rhs); +       } +     else +       { +	 /* We may have arbitrary VIEW_CONVERT_EXPRs in a nested component +	    reference.  Place it there and fold the thing.  */ +	 *rhsp = new_rhs; +	 fold_stmt_inplace (use_stmt); +       } +     tidy_after_forward_propagate_addr (use_stmt); +     return true;     }    /* If the use of the ADDR_EXPR is not a POINTER_PLUS_EXPR, there | 
