diff mbox

Improve folding of COND_EXPRs in tree-if-conv.c (PR tree-optimization/70916)

Message ID 20160503113235.GZ26501@tucnak.zalov.cz
State New
Headers show

Commit Message

Jakub Jelinek May 3, 2016, 11:32 a.m. UTC
Hi!

This allows us to better fold the COND_EXPR, so that _1 = 1 ? &foo : _2;
is folded to _1 = &foo.  There is another bug, the 1 in this case is wrong,
but it could appear on some other code too.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2016-05-03  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/70916
	* tree-if-conv.c (constant_or_ssa_name): Removed.
	(fold_build_cond_expr): Use is_gimple_val instead of
	constant_or_ssa_name.


	Jakub

Comments

Richard Biener May 3, 2016, 11:36 a.m. UTC | #1
On Tue, 3 May 2016, Jakub Jelinek wrote:

> Hi!
> 
> This allows us to better fold the COND_EXPR, so that _1 = 1 ? &foo : _2;
> is folded to _1 = &foo.  There is another bug, the 1 in this case is wrong,
> but it could appear on some other code too.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2016-05-03  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR tree-optimization/70916
> 	* tree-if-conv.c (constant_or_ssa_name): Removed.
> 	(fold_build_cond_expr): Use is_gimple_val instead of
> 	constant_or_ssa_name.
> 
> --- gcc/tree-if-conv.c.jj	2016-04-26 18:03:15.850034179 +0200
> +++ gcc/tree-if-conv.c	2016-05-03 11:04:19.378939463 +0200
> @@ -408,24 +408,6 @@ fold_or_predicates (location_t loc, tree
>    return fold_build2_loc (loc, TRUTH_OR_EXPR, boolean_type_node, c1, c2);
>  }
>  
> -/* Returns true if N is either a constant or a SSA_NAME.  */
> -
> -static bool
> -constant_or_ssa_name (tree n)
> -{
> -  switch (TREE_CODE (n))
> -    {
> -      case SSA_NAME:
> -      case INTEGER_CST:
> -      case REAL_CST:
> -      case COMPLEX_CST:
> -      case VECTOR_CST:
> -	return true;
> -      default:
> -	return false;
> -    }
> -}
> -
>  /* Returns either a COND_EXPR or the folded expression if the folded
>     expression is a MIN_EXPR, a MAX_EXPR, an ABS_EXPR,
>     a constant or a SSA_NAME. */
> @@ -446,22 +428,21 @@ fold_build_cond_expr (tree type, tree co
>  	  && (integer_zerop (op1)))
>  	cond = op0;
>      }
> -  cond_expr = fold_ternary (COND_EXPR, type, cond,
> -			    rhs, lhs);
> +  cond_expr = fold_ternary (COND_EXPR, type, cond, rhs, lhs);
>  
>    if (cond_expr == NULL_TREE)
>      return build3 (COND_EXPR, type, cond, rhs, lhs);
>  
>    STRIP_USELESS_TYPE_CONVERSION (cond_expr);
>  
> -  if (constant_or_ssa_name (cond_expr))
> +  if (is_gimple_val (cond_expr))
>      return cond_expr;
>  
>    if (TREE_CODE (cond_expr) == ABS_EXPR)
>      {
>        rhs1 = TREE_OPERAND (cond_expr, 1);
>        STRIP_USELESS_TYPE_CONVERSION (rhs1);
> -      if (constant_or_ssa_name (rhs1))
> +      if (is_gimple_val (rhs1))
>  	return build1 (ABS_EXPR, type, rhs1);
>      }
>  
> @@ -472,8 +453,7 @@ fold_build_cond_expr (tree type, tree co
>        STRIP_USELESS_TYPE_CONVERSION (lhs1);
>        rhs1 = TREE_OPERAND (cond_expr, 1);
>        STRIP_USELESS_TYPE_CONVERSION (rhs1);
> -      if (constant_or_ssa_name (rhs1)
> -	  && constant_or_ssa_name (lhs1))
> +      if (is_gimple_val (rhs1) && is_gimple_val (lhs1))
>  	return build2 (TREE_CODE (cond_expr), type, lhs1, rhs1);
>      }
>    return build3 (COND_EXPR, type, cond, rhs, lhs);
> 
> 	Jakub
> 
>
diff mbox

Patch

--- gcc/tree-if-conv.c.jj	2016-04-26 18:03:15.850034179 +0200
+++ gcc/tree-if-conv.c	2016-05-03 11:04:19.378939463 +0200
@@ -408,24 +408,6 @@  fold_or_predicates (location_t loc, tree
   return fold_build2_loc (loc, TRUTH_OR_EXPR, boolean_type_node, c1, c2);
 }
 
-/* Returns true if N is either a constant or a SSA_NAME.  */
-
-static bool
-constant_or_ssa_name (tree n)
-{
-  switch (TREE_CODE (n))
-    {
-      case SSA_NAME:
-      case INTEGER_CST:
-      case REAL_CST:
-      case COMPLEX_CST:
-      case VECTOR_CST:
-	return true;
-      default:
-	return false;
-    }
-}
-
 /* Returns either a COND_EXPR or the folded expression if the folded
    expression is a MIN_EXPR, a MAX_EXPR, an ABS_EXPR,
    a constant or a SSA_NAME. */
@@ -446,22 +428,21 @@  fold_build_cond_expr (tree type, tree co
 	  && (integer_zerop (op1)))
 	cond = op0;
     }
-  cond_expr = fold_ternary (COND_EXPR, type, cond,
-			    rhs, lhs);
+  cond_expr = fold_ternary (COND_EXPR, type, cond, rhs, lhs);
 
   if (cond_expr == NULL_TREE)
     return build3 (COND_EXPR, type, cond, rhs, lhs);
 
   STRIP_USELESS_TYPE_CONVERSION (cond_expr);
 
-  if (constant_or_ssa_name (cond_expr))
+  if (is_gimple_val (cond_expr))
     return cond_expr;
 
   if (TREE_CODE (cond_expr) == ABS_EXPR)
     {
       rhs1 = TREE_OPERAND (cond_expr, 1);
       STRIP_USELESS_TYPE_CONVERSION (rhs1);
-      if (constant_or_ssa_name (rhs1))
+      if (is_gimple_val (rhs1))
 	return build1 (ABS_EXPR, type, rhs1);
     }
 
@@ -472,8 +453,7 @@  fold_build_cond_expr (tree type, tree co
       STRIP_USELESS_TYPE_CONVERSION (lhs1);
       rhs1 = TREE_OPERAND (cond_expr, 1);
       STRIP_USELESS_TYPE_CONVERSION (rhs1);
-      if (constant_or_ssa_name (rhs1)
-	  && constant_or_ssa_name (lhs1))
+      if (is_gimple_val (rhs1) && is_gimple_val (lhs1))
 	return build2 (TREE_CODE (cond_expr), type, lhs1, rhs1);
     }
   return build3 (COND_EXPR, type, cond, rhs, lhs);