diff options
author | Bin Cheng <bin.cheng@arm.com> | 2017-05-11 09:33:49 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2017-05-11 09:33:49 +0000 |
commit | c544114fdece1611ab623e71483118c962047b29 (patch) | |
tree | 47412381a6214a028c550420cdd32fd622066ecf | |
parent | f9f69dd651b2f1031761312cc3d13aee40b46b5e (diff) | |
download | gcc-c544114fdece1611ab623e71483118c962047b29.zip gcc-c544114fdece1611ab623e71483118c962047b29.tar.gz gcc-c544114fdece1611ab623e71483118c962047b29.tar.bz2 |
tree-ssa-loop-ivopts.c (force_expr_to_var_cost): Handle more operators...
* tree-ssa-loop-ivopts.c (force_expr_to_var_cost): Handle more
operators: TRUNC_DIV_EXPR, BIT_AND_EXPR, BIT_IOR_EXPR, LSHIFT_EXPR,
RSHIFT_EXPR and BIT_NOT_EXPR.
From-SVN: r247886
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 23 |
2 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2004b24..e39c09d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2017-05-11 Bin Cheng <bin.cheng@arm.com> + * tree-ssa-loop-ivopts.c (force_expr_to_var_cost): Handle more + operators: TRUNC_DIV_EXPR, BIT_AND_EXPR, BIT_IOR_EXPR, LSHIFT_EXPR, + RSHIFT_EXPR and BIT_NOT_EXPR. + +2017-05-11 Bin Cheng <bin.cheng@arm.com> + * tree-ssa-loop-ivopts.c (get_loop_invariant_expr): Simplify. (adjust_setup_cost): New parameter supporting round up adjustment. (struct address_cost_data): Delete. diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 43cab30..4fc0ba4 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -4080,6 +4080,11 @@ force_expr_to_var_cost (tree expr, bool speed) case PLUS_EXPR: case MINUS_EXPR: case MULT_EXPR: + case TRUNC_DIV_EXPR: + case BIT_AND_EXPR: + case BIT_IOR_EXPR: + case LSHIFT_EXPR: + case RSHIFT_EXPR: op0 = TREE_OPERAND (expr, 0); op1 = TREE_OPERAND (expr, 1); STRIP_NOPS (op0); @@ -4088,6 +4093,7 @@ force_expr_to_var_cost (tree expr, bool speed) CASE_CONVERT: case NEGATE_EXPR: + case BIT_NOT_EXPR: op0 = TREE_OPERAND (expr, 0); STRIP_NOPS (op0); op1 = NULL_TREE; @@ -4156,6 +4162,23 @@ force_expr_to_var_cost (tree expr, bool speed) return comp_cost (target_spill_cost [speed], 0); break; + case TRUNC_DIV_EXPR: + /* Division by power of two is usually cheap, so we allow it. Forbid + anything else. */ + if (integer_pow2p (TREE_OPERAND (expr, 1))) + cost = comp_cost (add_cost (speed, mode), 0); + else + cost = comp_cost (target_spill_cost[speed], 0); + break; + + case BIT_AND_EXPR: + case BIT_IOR_EXPR: + case BIT_NOT_EXPR: + case LSHIFT_EXPR: + case RSHIFT_EXPR: + cost = comp_cost (add_cost (speed, mode), 0); + break; + default: gcc_unreachable (); } |