Hi,
This patch handles more cheap cases in function force_expr_to_var_cost,
specifically,
TRUNC_DIV_EXPR, BIT_AND_EXPR, BIT_IOR_EXPR, RSHIFT_EXPR and BIT_NOT_EXPR.
Is it OK?
Thanks,
bin
2017-04-11 Bin Cheng <bin.ch...@arm.com>
* tree-ssa-loop-ivopts.c (force_expr_to_var_cost): Handle more
operators: TRUNC_DIV_EXPR, BIT_AND_EXPR, BIT_IOR_EXPR, RSHIFT_EXPR
and BIT_NOT_EXPR.
From 83045d32b974cb657e1d471c15f67a5b190f2534 Mon Sep 17 00:00:00 2001
From: Bin Cheng <binch...@e108451-lin.cambridge.arm.com>
Date: Fri, 17 Mar 2017 10:04:29 +0000
Subject: [PATCH 14/33] cheap-arith_op-in-force_expr-20170225.txt
---
gcc/tree-ssa-loop-ivopts.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 6f64d71..c9cf9cf 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -4087,6 +4087,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);
@@ -4095,6 +4100,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;
@@ -4163,6 +4169,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 ();
}
--
1.9.1