From 637a765fcbbd824efd438cc4a6476a52d66a4ede Mon Sep 17 00:00:00 2001 From: rguenth Date: Mon, 14 Apr 2014 11:48:22 +0000 Subject: [PATCH] 2014-04-14 Richard Biener * tree-switch-conversion.c (lshift_cheap_p): Get speed_p as argument. (expand_switch_using_bit_tests_p): Likewise. (process_switch): Compute and pass on speed_p based on the switch stmt. * tree-ssa-math-opts.c (gimple_expand_builtin_pow): Use optimize_bb_for_speed_p. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@209364 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 10 ++++++++++ gcc/tree-ssa-math-opts.c | 2 +- gcc/tree-switch-conversion.c | 13 ++++++------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e3e418036d0..61e0e215125 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2014-04-14 Richard Biener + + * tree-switch-conversion.c (lshift_cheap_p): Get speed_p + as argument. + (expand_switch_using_bit_tests_p): Likewise. + (process_switch): Compute and pass on speed_p based on the + switch stmt. + * tree-ssa-math-opts.c (gimple_expand_builtin_pow): Use + optimize_bb_for_speed_p. + 2014-04-14 Eric Botcazou * cfgloop.h (struct loop): Rename force_vect into force_vectorize. diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 9ff857cd657..63aba8e5468 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -1162,7 +1162,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc, if (c_is_int && ((n >= -1 && n <= 2) || (flag_unsafe_math_optimizations - && optimize_insn_for_speed_p () + && optimize_bb_for_speed_p (gsi_bb (*gsi)) && powi_cost (n) <= POWI_MAX_MULTS))) return gimple_expand_builtin_powi (gsi, loc, arg0, n); diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c index 547ac9e3b58..5540ed38a85 100644 --- a/gcc/tree-switch-conversion.c +++ b/gcc/tree-switch-conversion.c @@ -130,21 +130,18 @@ hoist_edge_and_branch_if_true (gimple_stmt_iterator *gsip, This function (and similar RTL-related cost code in e.g. IVOPTS) should be moved to some kind of interface file for GIMPLE/RTL interactions. */ static bool -lshift_cheap_p (void) +lshift_cheap_p (bool speed_p) { /* FIXME: This should be made target dependent via this "this_target" mechanism, similar to e.g. can_copy_init_p in gcse.c. */ static bool init[2] = {false, false}; static bool cheap[2] = {true, true}; - bool speed_p; /* If the targer has no lshift in word_mode, the operation will most probably not be cheap. ??? Does GCC even work for such targets? */ if (optab_handler (ashl_optab, word_mode) == CODE_FOR_nothing) return false; - speed_p = optimize_insn_for_speed_p (); - if (!init[speed_p]) { rtx reg = gen_raw_REG (word_mode, 10000); @@ -165,12 +162,12 @@ lshift_cheap_p (void) static bool expand_switch_using_bit_tests_p (tree range, unsigned int uniq, - unsigned int count) + unsigned int count, bool speed_p) { return (((uniq == 1 && count >= 3) || (uniq == 2 && count >= 5) || (uniq == 3 && count >= 6)) - && lshift_cheap_p () + && lshift_cheap_p (speed_p) && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0 && compare_tree_int (range, 0) > 0); } @@ -1357,7 +1354,9 @@ process_switch (gimple swtch) if (info.uniq <= MAX_CASE_BIT_TESTS) { if (expand_switch_using_bit_tests_p (info.range_size, - info.uniq, info.count)) + info.uniq, info.count, + optimize_bb_for_speed_p + (gimple_bb (swtch)))) { if (dump_file) fputs (" expanding as bit test is preferable\n", dump_file); -- 2.11.4.GIT