+2012-11-15 Tom de Vries <tom@codesourcery.com>
+
+ PR tree-optimization/54619
+ * tree-ssa-loop-ivopts.c (get_use_type): New function.
+ (get_computation_at): Use get_use_type.
+ (get_computation_cost_at): Declare and set mem_mode. Use mem_mode.
+
2012-11-15 Jakub Jelinek <jakub@redhat.com>
* asan.c (report_error_func): Set DECL_IGNORED_P, don't touch
return true;
}
+/* Return the type of USE. */
+
+static tree
+get_use_type (struct iv_use *use)
+{
+ tree base_type = TREE_TYPE (use->iv->base);
+ tree type;
+
+ if (use->type == USE_ADDRESS)
+ {
+ /* The base_type may be a void pointer. Create a pointer type based on
+ the mem_ref instead. */
+ type = build_pointer_type (TREE_TYPE (*use->op_p));
+ gcc_assert (TYPE_ADDR_SPACE (TREE_TYPE (type))
+ == TYPE_ADDR_SPACE (TREE_TYPE (base_type)));
+ }
+ else
+ type = base_type;
+
+ return type;
+}
+
/* Determines the expression by that USE is expressed from induction variable
CAND at statement AT in LOOP. The computation is unshared. */
struct iv_use *use, struct iv_cand *cand, gimple at)
{
aff_tree aff;
- tree type = TREE_TYPE (use->iv->base);
+ tree type = get_use_type (use);
if (!get_computation_aff (loop, use, cand, at, &aff))
return NULL_TREE;
comp_cost cost;
double_int rat;
bool speed = optimize_bb_for_speed_p (gimple_bb (at));
+ enum machine_mode mem_mode = (address_p
+ ? TYPE_MODE (TREE_TYPE (*use->op_p))
+ : VOIDmode);
*depends_on = NULL;
else if (address_p
&& !POINTER_TYPE_P (ctype)
&& multiplier_allowed_in_address_p
- (ratio, TYPE_MODE (TREE_TYPE (utype)),
+ (ratio, mem_mode,
TYPE_ADDR_SPACE (TREE_TYPE (utype))))
{
cbase
return add_costs (cost,
get_address_cost (symbol_present, var_present,
offset, ratio, cstepi,
- TYPE_MODE (TREE_TYPE (utype)),
+ mem_mode,
TYPE_ADDR_SPACE (TREE_TYPE (utype)),
speed, stmt_is_after_inc,
can_autoinc));