diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/gimple-fold.c | 2 | ||||
-rw-r--r-- | gcc/gimple-fold.h | 1 | ||||
-rw-r--r-- | gcc/tree-ssa-ccp.c | 97 |
4 files changed, 57 insertions, 50 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ea4c5cb7145..8dba640be32 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-08-04 Richard Biener <rguenther@suse.de> + + * gimple-fold.h (gimple_fold_builtin): Remove. + * gimple-fold.c (gimple_fold_builtin): Make static. + * tree-ssa-ccp.c (pass_fold_builtins::execute): Use + fold_stmt, not gimple_fold_builtin. + 2014-08-04 Martin Liska <mliska@suse.cz> * cgraph.h (csi_end_p): Removed. diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 2e0f2bff438..fa5681040ed 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -873,7 +873,7 @@ get_maxval_strlen (tree arg, tree *length, bitmap visited, int type) Note that some builtins expand into inline code that may not be valid in GIMPLE. Callers must take care. */ -tree +static tree gimple_fold_builtin (gimple stmt) { tree result, val[3]; diff --git a/gcc/gimple-fold.h b/gcc/gimple-fold.h index 6b430668528..9b4e4566a12 100644 --- a/gcc/gimple-fold.h +++ b/gcc/gimple-fold.h @@ -25,7 +25,6 @@ along with GCC; see the file COPYING3. If not see extern tree canonicalize_constructor_val (tree, tree); extern tree get_symbol_constant_value (tree); extern void gimplify_and_update_call_from_tree (gimple_stmt_iterator *, tree); -extern tree gimple_fold_builtin (gimple); extern bool fold_stmt (gimple_stmt_iterator *); extern bool fold_stmt_inplace (gimple_stmt_iterator *); extern tree maybe_fold_and_comparisons (enum tree_code, tree, tree, diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 283bb1283e8..a90f7089190 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -2655,7 +2655,7 @@ pass_fold_builtins::execute (function *fun) for (i = gsi_start_bb (bb); !gsi_end_p (i); ) { gimple stmt, old_stmt; - tree callee, result; + tree callee; enum built_in_function fcode; stmt = gsi_stmt (i); @@ -2680,62 +2680,69 @@ pass_fold_builtins::execute (function *fun) gsi_next (&i); continue; } + callee = gimple_call_fndecl (stmt); if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL) { gsi_next (&i); continue; } - fcode = DECL_FUNCTION_CODE (callee); - - result = gimple_fold_builtin (stmt); - if (result) - gimple_remove_stmt_histograms (fun, stmt); + fcode = DECL_FUNCTION_CODE (callee); + if (fold_stmt (&i)) + ; + else + { + tree result = NULL_TREE; + switch (DECL_FUNCTION_CODE (callee)) + { + case BUILT_IN_CONSTANT_P: + /* Resolve __builtin_constant_p. If it hasn't been + folded to integer_one_node by now, it's fairly + certain that the value simply isn't constant. */ + result = integer_zero_node; + break; - if (!result) - switch (DECL_FUNCTION_CODE (callee)) - { - case BUILT_IN_CONSTANT_P: - /* Resolve __builtin_constant_p. If it hasn't been - folded to integer_one_node by now, it's fairly - certain that the value simply isn't constant. */ - result = integer_zero_node; - break; + case BUILT_IN_ASSUME_ALIGNED: + /* Remove __builtin_assume_aligned. */ + result = gimple_call_arg (stmt, 0); + break; - case BUILT_IN_ASSUME_ALIGNED: - /* Remove __builtin_assume_aligned. */ - result = gimple_call_arg (stmt, 0); - break; + case BUILT_IN_STACK_RESTORE: + result = optimize_stack_restore (i); + if (result) + break; + gsi_next (&i); + continue; - case BUILT_IN_STACK_RESTORE: - result = optimize_stack_restore (i); - if (result) + case BUILT_IN_UNREACHABLE: + if (optimize_unreachable (i)) + cfg_changed = true; break; - gsi_next (&i); - continue; - case BUILT_IN_UNREACHABLE: - if (optimize_unreachable (i)) - cfg_changed = true; - break; + case BUILT_IN_VA_START: + case BUILT_IN_VA_END: + case BUILT_IN_VA_COPY: + /* These shouldn't be folded before pass_stdarg. */ + result = optimize_stdarg_builtin (stmt); + if (result) + break; + /* FALLTHRU */ - case BUILT_IN_VA_START: - case BUILT_IN_VA_END: - case BUILT_IN_VA_COPY: - /* These shouldn't be folded before pass_stdarg. */ - result = optimize_stdarg_builtin (stmt); - if (result) - break; - /* FALLTHRU */ + default:; + } - default: - gsi_next (&i); - continue; - } + if (!result) + { + gsi_next (&i); + continue; + } - if (result == NULL_TREE) - break; + if (!update_call_from_tree (&i, result)) + gimplify_and_update_call_from_tree (&i, result); + } + + todoflags |= TODO_update_address_taken; if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -2744,12 +2751,6 @@ pass_fold_builtins::execute (function *fun) } old_stmt = stmt; - if (!update_call_from_tree (&i, result)) - { - gimplify_and_update_call_from_tree (&i, result); - todoflags |= TODO_update_address_taken; - } - stmt = gsi_stmt (i); update_stmt (stmt); |