[PATCH][match-and-simplify] Fix call handling some more

Richard Biener rguenther@suse.de
Thu Mar 13 14:51:00 GMT 2014


Committed.

Richard.

2014-03-13  Richard Biener  <rguenther@suse.de>

	* gimple-match-head.c (gimple_resimplify2, gimple_resimplify3):
	Implement missing call handling.
	(gimple_match_and_simplify): Fix lhs gathering.

Index: gcc/gimple-match-head.c
===================================================================
*** gcc/gimple-match-head.c	(revision 208482)
--- gcc/gimple-match-head.c	(working copy)
*************** gimple_resimplify2 (gimple_seq *seq,
*** 121,133 ****
  		    code_helper *res_code, tree type, tree *res_ops,
  		    tree (*valueize)(tree))
  {
-   /* FIXME.  */
-   if (!res_code->is_tree_code ())
-     gcc_unreachable ();
    if (CONSTANT_CLASS_P (res_ops[0]) && CONSTANT_CLASS_P (res_ops[1]))
      {
!       tree tem = fold_binary_to_constant (*res_code, type,
! 					  res_ops[0], res_ops[1]);
        if (tem != NULL_TREE)
  	{
  	  res_ops[0] = tem;
--- 121,137 ----
  		    code_helper *res_code, tree type, tree *res_ops,
  		    tree (*valueize)(tree))
  {
    if (CONSTANT_CLASS_P (res_ops[0]) && CONSTANT_CLASS_P (res_ops[1]))
      {
!       tree tem;
!       if (res_code->is_tree_code ())
! 	tem = fold_binary_to_constant (*res_code, type,
! 				       res_ops[0], res_ops[1]);
!       else
! 	{
! 	  tree decl = builtin_decl_implicit (*res_code);
! 	  tem = fold_builtin_n (UNKNOWN_LOCATION, decl, res_ops, 2, false);
! 	}
        if (tem != NULL_TREE)
  	{
  	  res_ops[0] = tem;
*************** gimple_resimplify2 (gimple_seq *seq,
*** 137,143 ****
      }
  
    /* Canonicalize operand order.  */
!   if (commutative_tree_code (*res_code)
        && tree_swap_operands_p (res_ops[0], res_ops[1], false))
      {
        tree tem = res_ops[0];
--- 141,148 ----
      }
  
    /* Canonicalize operand order.  */
!   if (res_code->is_tree_code ()
!       && commutative_tree_code (*res_code)
        && tree_swap_operands_p (res_ops[0], res_ops[1], false))
      {
        tree tem = res_ops[0];
*************** gimple_resimplify3 (gimple_seq *seq,
*** 168,181 ****
  		    code_helper *res_code, tree type, tree *res_ops,
  		    tree (*valueize)(tree))
  {
-   /* FIXME.  */
-   if (!res_code->is_tree_code ())
-     gcc_unreachable ();
    if (CONSTANT_CLASS_P (res_ops[0]) && CONSTANT_CLASS_P (res_ops[1])
        && CONSTANT_CLASS_P (res_ops[2]))
      {
!       tree tem = fold_ternary/*_to_constant*/ (*res_code, type, res_ops[0],
! 					       res_ops[1], res_ops[2]);
        if (tem != NULL_TREE
  	  && CONSTANT_CLASS_P (tem))
  	{
--- 173,190 ----
  		    code_helper *res_code, tree type, tree *res_ops,
  		    tree (*valueize)(tree))
  {
    if (CONSTANT_CLASS_P (res_ops[0]) && CONSTANT_CLASS_P (res_ops[1])
        && CONSTANT_CLASS_P (res_ops[2]))
      {
!       tree tem;
!       if (res_code->is_tree_code ())
! 	tem = fold_ternary/*_to_constant*/ (*res_code, type, res_ops[0],
! 					    res_ops[1], res_ops[2]);
!       else
! 	{
! 	  tree decl = builtin_decl_implicit (*res_code);
! 	  tem = fold_builtin_n (UNKNOWN_LOCATION, decl, res_ops, 3, false);
! 	}
        if (tem != NULL_TREE
  	  && CONSTANT_CLASS_P (tem))
  	{
*************** gimple_resimplify3 (gimple_seq *seq,
*** 186,192 ****
      }
  
    /* Canonicalize operand order.  */
!   if (commutative_ternary_tree_code (*res_code)
        && tree_swap_operands_p (res_ops[0], res_ops[1], false))
      {
        tree tem = res_ops[0];
--- 195,202 ----
      }
  
    /* Canonicalize operand order.  */
!   if (res_code->is_tree_code ()
!       && commutative_ternary_tree_code (*res_code)
        && tree_swap_operands_p (res_ops[0], res_ops[1], false))
      {
        tree tem = res_ops[0];
*************** gimple_match_and_simplify (gimple stmt,
*** 483,490 ****
  	}
      }
  
-   /* ???  GIMPLE_CALL handling to be implemented.  */
- 
    return false;
  }
  
--- 493,498 ----
*************** gimple_match_and_simplify (gimple_stmt_i
*** 532,538 ****
    else if (gimple_has_lhs (stmt))
      {
        gimple_seq tail = NULL;
!       tree lhs = gimple_call_lhs (stmt);
        maybe_push_res_to_seq (rcode, TREE_TYPE (lhs),
  			     ops, &tail, lhs);
        gcc_assert (gimple_seq_singleton_p (tail));
--- 540,546 ----
    else if (gimple_has_lhs (stmt))
      {
        gimple_seq tail = NULL;
!       tree lhs = gimple_get_lhs (stmt);
        maybe_push_res_to_seq (rcode, TREE_TYPE (lhs),
  			     ops, &tail, lhs);
        gcc_assert (gimple_seq_singleton_p (tail));



More information about the Gcc-patches mailing list