summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimple-fold.c2
-rw-r--r--gcc/gimple-fold.h1
-rw-r--r--gcc/tree-ssa-ccp.c97
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);