re PR tree-optimization/32586 (New VN misses FRE opportunities)
2007-09-06 Richard Guenther <rguenther@suse.de> PR tree-optimization/32586 * tree-ssa-sccvn.c (simplify_binary_expression): Avoid folding if nothing changed. (simplify_unary_expression): New function. Do tree combining on conversion like codes. (try_to_simplify): Call it. * builtins.c (fold_builtin_cexp): Fold the built expressions. * fold-const.c (fold_unary): Test result of get_callee_fndecl(). * g++.dg/tree-ssa/pr27090.C: Remove XFAILs. * gcc.dg/tree-ssa/ssa-fre-1.c: Likewise. * gcc.dg/tree-ssa/ssa-fre-3.c: Likewise. * gcc.dg/tree-ssa/ssa-fre-5.c: Likewise. * gcc.dg/tree-ssa/ssa-fre-4.c: Likewise, remove scan for now obsolete simplification. From-SVN: r128189
This commit is contained in:
parent
1f5a6b84ab
commit
111f1fca4d
10 changed files with 90 additions and 28 deletions
|
@ -1,3 +1,14 @@
|
|||
2007-09-06 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/32586
|
||||
* tree-ssa-sccvn.c (simplify_binary_expression): Avoid
|
||||
folding if nothing changed.
|
||||
(simplify_unary_expression): New function. Do tree combining
|
||||
on conversion like codes.
|
||||
(try_to_simplify): Call it.
|
||||
* builtins.c (fold_builtin_cexp): Fold the built expressions.
|
||||
* fold-const.c (fold_unary): Test result of get_callee_fndecl().
|
||||
|
||||
2007-09-06 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
PR target/33318
|
||||
|
|
|
@ -7799,13 +7799,13 @@ fold_builtin_cexp (tree arg0, tree type)
|
|||
icall = builtin_save_expr (icall);
|
||||
rcall = build_call_expr (rfn, 1, realp);
|
||||
rcall = builtin_save_expr (rcall);
|
||||
return build2 (COMPLEX_EXPR, type,
|
||||
build2 (MULT_EXPR, rtype,
|
||||
rcall,
|
||||
build1 (REALPART_EXPR, rtype, icall)),
|
||||
build2 (MULT_EXPR, rtype,
|
||||
rcall,
|
||||
build1 (IMAGPART_EXPR, rtype, icall)));
|
||||
return fold_build2 (COMPLEX_EXPR, type,
|
||||
fold_build2 (MULT_EXPR, rtype,
|
||||
rcall,
|
||||
fold_build1 (REALPART_EXPR, rtype, icall)),
|
||||
fold_build2 (MULT_EXPR, rtype,
|
||||
rcall,
|
||||
fold_build1 (IMAGPART_EXPR, rtype, icall)));
|
||||
}
|
||||
|
||||
return NULL_TREE;
|
||||
|
|
|
@ -8464,7 +8464,7 @@ fold_unary (enum tree_code code, tree type, tree op0)
|
|||
if (TREE_CODE (arg0) == CALL_EXPR)
|
||||
{
|
||||
tree fn = get_callee_fndecl (arg0);
|
||||
if (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
|
||||
if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
|
||||
switch (DECL_FUNCTION_CODE (fn))
|
||||
{
|
||||
CASE_FLT_FN (BUILT_IN_CEXPI):
|
||||
|
@ -8506,7 +8506,7 @@ fold_unary (enum tree_code code, tree type, tree op0)
|
|||
if (TREE_CODE (arg0) == CALL_EXPR)
|
||||
{
|
||||
tree fn = get_callee_fndecl (arg0);
|
||||
if (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
|
||||
if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
|
||||
switch (DECL_FUNCTION_CODE (fn))
|
||||
{
|
||||
CASE_FLT_FN (BUILT_IN_CEXPI):
|
||||
|
|
|
@ -1,3 +1,13 @@
|
|||
2007-09-06 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/32586
|
||||
* g++.dg/tree-ssa/pr27090.C: Remove XFAILs.
|
||||
* gcc.dg/tree-ssa/ssa-fre-1.c: Likewise.
|
||||
* gcc.dg/tree-ssa/ssa-fre-3.c: Likewise.
|
||||
* gcc.dg/tree-ssa/ssa-fre-5.c: Likewise.
|
||||
* gcc.dg/tree-ssa/ssa-fre-4.c: Likewise, remove scan for
|
||||
now obsolete simplification.
|
||||
|
||||
2007-09-06 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* gcc.target/i386/sse3-addsubpd.c: Add -mfpmath=sse to dg-options.
|
||||
|
|
|
@ -17,5 +17,5 @@ int foo(Foo& f)
|
|||
return f.get();
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "return f->x;" "optimized" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-tree-dump "return f->x;" "optimized" } } */
|
||||
/* { dg-final { cleanup-tree-dump "optimized" } } */
|
||||
|
|
|
@ -11,6 +11,6 @@ int f(int *a)
|
|||
return *c + t;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\(int \\\*\\\) b_.*with a_" "fre" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\*c_.*with t_" "fre" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\(int \\\*\\\) b_.*with a_" "fre" } } */
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\*c_.*with t_" "fre" } } */
|
||||
/* { dg-final { cleanup-tree-dump "fre" } } */
|
||||
|
|
|
@ -11,5 +11,5 @@ foo (int a, int b)
|
|||
return aa + bb;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\(int\\\) aa_.*with a_" "fre" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\(int\\\) aa_.*with a_" "fre" } } */
|
||||
/* { dg-final { cleanup-tree-dump "fre" } } */
|
||||
|
|
|
@ -9,6 +9,5 @@ char bar(char f)
|
|||
return wrap(f);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\(char\\\) .*with " "fre" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\(int\\\) .*with " "fre" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\(char\\\) .*with " "fre" } } */
|
||||
/* { dg-final { cleanup-tree-dump "fre" } } */
|
||||
|
|
|
@ -10,5 +10,5 @@ bar (unsigned int t)
|
|||
return a == t;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\(unsigned int\\\) a_.*with t_" "fre" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-tree-dump "Replaced \\\(unsigned int\\\) a_.*with t_" "fre" } } */
|
||||
/* { dg-final { cleanup-tree-dump "fre" } } */
|
||||
|
|
|
@ -1411,6 +1411,11 @@ simplify_binary_expression (tree rhs)
|
|||
op1 = SSA_VAL (op1);
|
||||
}
|
||||
|
||||
/* Avoid folding if nothing changed. */
|
||||
if (op0 == TREE_OPERAND (rhs, 0)
|
||||
&& op1 == TREE_OPERAND (rhs, 1))
|
||||
return NULL_TREE;
|
||||
|
||||
result = fold_binary (TREE_CODE (rhs), TREE_TYPE (rhs), op0, op1);
|
||||
|
||||
/* Make sure result is not a complex expression consisting
|
||||
|
@ -1423,6 +1428,50 @@ simplify_binary_expression (tree rhs)
|
|||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Simplify the unary expression RHS, and return the result if
|
||||
simplified. */
|
||||
|
||||
static tree
|
||||
simplify_unary_expression (tree rhs)
|
||||
{
|
||||
tree result = NULL_TREE;
|
||||
tree op0 = TREE_OPERAND (rhs, 0);
|
||||
|
||||
if (TREE_CODE (op0) != SSA_NAME)
|
||||
return NULL_TREE;
|
||||
|
||||
if (VN_INFO (op0)->has_constants)
|
||||
op0 = valueize_expr (VN_INFO (op0)->expr);
|
||||
else if (TREE_CODE (rhs) == NOP_EXPR
|
||||
|| TREE_CODE (rhs) == CONVERT_EXPR
|
||||
|| TREE_CODE (rhs) == REALPART_EXPR
|
||||
|| TREE_CODE (rhs) == IMAGPART_EXPR)
|
||||
{
|
||||
/* We want to do tree-combining on conversion-like expressions.
|
||||
Make sure we feed only SSA_NAMEs or constants to fold though. */
|
||||
tree tem = valueize_expr (VN_INFO (op0)->expr);
|
||||
if (UNARY_CLASS_P (tem)
|
||||
|| BINARY_CLASS_P (tem)
|
||||
|| TREE_CODE (tem) == SSA_NAME
|
||||
|| is_gimple_min_invariant (tem))
|
||||
op0 = tem;
|
||||
}
|
||||
|
||||
/* Avoid folding if nothing changed, but remember the expression. */
|
||||
if (op0 == TREE_OPERAND (rhs, 0))
|
||||
return rhs;
|
||||
|
||||
result = fold_unary (TREE_CODE (rhs), TREE_TYPE (rhs), op0);
|
||||
if (result)
|
||||
{
|
||||
STRIP_USELESS_TYPE_CONVERSION (result);
|
||||
if (valid_gimple_expression_p (result))
|
||||
return result;
|
||||
}
|
||||
|
||||
return rhs;
|
||||
}
|
||||
|
||||
/* Try to simplify RHS using equivalences and constant folding. */
|
||||
|
||||
static tree
|
||||
|
@ -1457,21 +1506,14 @@ try_to_simplify (tree stmt, tree rhs)
|
|||
if (result)
|
||||
return result;
|
||||
}
|
||||
break;
|
||||
/* Fallthrough for some codes. */
|
||||
if (!(TREE_CODE (rhs) == REALPART_EXPR
|
||||
|| TREE_CODE (rhs) == IMAGPART_EXPR))
|
||||
break;
|
||||
/* We could do a little more with unary ops, if they expand
|
||||
into binary ops, but it's debatable whether it is worth it. */
|
||||
case tcc_unary:
|
||||
{
|
||||
tree result = NULL_TREE;
|
||||
tree op0 = TREE_OPERAND (rhs, 0);
|
||||
if (TREE_CODE (op0) == SSA_NAME && VN_INFO (op0)->has_constants)
|
||||
op0 = VN_INFO (op0)->expr;
|
||||
else if (TREE_CODE (op0) == SSA_NAME && SSA_VAL (op0) != op0)
|
||||
op0 = SSA_VAL (op0);
|
||||
result = fold_unary (TREE_CODE (rhs), TREE_TYPE (rhs), op0);
|
||||
if (result)
|
||||
return result;
|
||||
}
|
||||
return simplify_unary_expression (rhs);
|
||||
break;
|
||||
case tcc_comparison:
|
||||
case tcc_binary:
|
||||
|
|
Loading…
Add table
Reference in a new issue