aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2017-05-11 09:33:49 +0000
committerBin Cheng <amker@gcc.gnu.org>2017-05-11 09:33:49 +0000
commitc544114fdece1611ab623e71483118c962047b29 (patch)
tree47412381a6214a028c550420cdd32fd622066ecf
parentf9f69dd651b2f1031761312cc3d13aee40b46b5e (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/tree-ssa-loop-ivopts.c23
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 ();
}