[PATCH] Make SCCVN constant-fold calls
Richard Biener
rguenther@suse.de
Fri May 16 07:54:00 GMT 2014
On Thu, 15 May 2014, Richard Biener wrote:
>
> For some odd reason I didn't implement this earlier. This is one
> major source of 2nd-stage opportunities that come up when running
> two adjacent FRE passes.
>
> Bootstrap and regtest ongoing on x86_64-unknown-linux-gnu.
The following is what I have applied (with also properly
value-numbering VDEFs if there).
Bootstrapped and tested on x86_64-unknown-linux-gnu.
Richard.
2014-05-16 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.c (visit_use): Also constant-fold calls.
* gcc.dg/tree-ssa/ssa-fre-41.c: New testcase.
Index: gcc/tree-ssa-sccvn.c
===================================================================
*** gcc/tree-ssa-sccvn.c (revision 210418)
--- gcc/tree-ssa-sccvn.c (working copy)
*************** visit_use (tree use)
*** 3566,3593 ****
else if (is_gimple_call (stmt))
{
tree lhs = gimple_call_lhs (stmt);
-
- /* ??? We could try to simplify calls. */
-
if (lhs && TREE_CODE (lhs) == SSA_NAME)
{
! if (stmt_has_constants (stmt))
! VN_INFO (lhs)->has_constants = true;
! else
{
! /* We reset expr and constantness here because we may
! have been value numbering optimistically, and
! iterating. They may become non-constant in this case,
! even if they were optimistically constant. */
! VN_INFO (lhs)->has_constants = false;
! VN_INFO (lhs)->expr = NULL_TREE;
}
!
! if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
{
! changed = defs_to_varying (stmt);
goto done;
}
}
if (!gimple_call_internal_p (stmt)
--- 3566,3635 ----
else if (is_gimple_call (stmt))
{
tree lhs = gimple_call_lhs (stmt);
if (lhs && TREE_CODE (lhs) == SSA_NAME)
{
! /* Try constant folding based on our current lattice. */
! tree simplified = gimple_fold_stmt_to_constant_1 (stmt,
! vn_valueize);
! if (simplified)
{
! if (dump_file && (dump_flags & TDF_DETAILS))
! {
! fprintf (dump_file, "call ");
! print_gimple_expr (dump_file, stmt, 0, 0);
! fprintf (dump_file, " simplified to ");
! print_generic_expr (dump_file, simplified, 0);
! if (TREE_CODE (lhs) == SSA_NAME)
! fprintf (dump_file, " has constants %d\n",
! expr_has_constants (simplified));
! else
! fprintf (dump_file, "\n");
! }
}
! /* Setting value numbers to constants will occasionally
! screw up phi congruence because constants are not
! uniquely associated with a single ssa name that can be
! looked up. */
! if (simplified
! && is_gimple_min_invariant (simplified))
{
! VN_INFO (lhs)->expr = simplified;
! VN_INFO (lhs)->has_constants = true;
! changed = set_ssa_val_to (lhs, simplified);
! if (gimple_vdef (stmt))
! changed |= set_ssa_val_to (gimple_vdef (stmt),
! gimple_vuse (stmt));
goto done;
}
+ else if (simplified
+ && TREE_CODE (simplified) == SSA_NAME)
+ {
+ changed = visit_copy (lhs, simplified);
+ if (gimple_vdef (stmt))
+ changed |= set_ssa_val_to (gimple_vdef (stmt),
+ gimple_vuse (stmt));
+ goto done;
+ }
+ else
+ {
+ if (stmt_has_constants (stmt))
+ VN_INFO (lhs)->has_constants = true;
+ else
+ {
+ /* We reset expr and constantness here because we may
+ have been value numbering optimistically, and
+ iterating. They may become non-constant in this case,
+ even if they were optimistically constant. */
+ VN_INFO (lhs)->has_constants = false;
+ VN_INFO (lhs)->expr = NULL_TREE;
+ }
+
+ if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
+ {
+ changed = defs_to_varying (stmt);
+ goto done;
+ }
+ }
}
if (!gimple_call_internal_p (stmt)
Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-41.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-41.c (revision 0)
--- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-41.c (working copy)
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O -fdump-tree-fre1" } */
+
+ int x;
+ int foo (void)
+ {
+ x = 1;
+ return __builtin_ffs (x);
+ }
+
+ /* { dg-final { scan-tree-dump-not "ffs" "fre1" } } */
+ /* { dg-final { cleanup-tree-dump "fre1" } } */
More information about the Gcc-patches
mailing list