This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix VCE folding in forwprop


This fixes VCE folding to only apply if either it retains a VCE or
the whole rhs is replaced.  Otherwise we may force something into
a register that is not.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

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.

Index: gcc/tree-ssa-forwprop.c
===================================================================
*** gcc/tree-ssa-forwprop.c	(revision 141150)
--- gcc/tree-ssa-forwprop.c	(working copy)
*************** forward_propagate_addr_expr_1 (tree name
*** 767,774 ****
        && 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.  */
        && TREE_CODE (TREE_OPERAND (def_rhs, 0)) != FUNCTION_DECL
        /* We should not convert volatile loads to non volatile loads. */
        && !TYPE_VOLATILE (TREE_TYPE (rhs))
--- 767,774 ----
        && 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.  */
        && TREE_CODE (TREE_OPERAND (def_rhs, 0)) != FUNCTION_DECL
        /* We should not convert volatile loads to non volatile loads. */
        && !TYPE_VOLATILE (TREE_TYPE (rhs))
*************** forward_propagate_addr_expr_1 (tree name
*** 776,797 ****
        && 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;
     }
  
    /* If the use of the ADDR_EXPR is not a POINTER_PLUS_EXPR, there
--- 776,802 ----
        && operand_equal_p (TYPE_SIZE (TREE_TYPE (rhs)),
  			  TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0))), 0)) 
     {
!      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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]