[PATCH] Improve folding of COND_EXPRs in tree-if-conv.c (PR tree-optimization/70916)
Jakub Jelinek
jakub@redhat.com
Tue May 3 11:32:00 GMT 2016
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.
--- 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
More information about the Gcc-patches
mailing list