diff options
author | Tom de Vries <tom@codesourcery.com> | 2012-11-15 16:49:45 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2012-11-15 16:49:45 +0000 |
commit | 0c604a61a3ea932bc4cf17f543d014c740c4a28a (patch) | |
tree | 018eecc9d64d2d8d0bfb03c5e3c4de2f6a450fcc /gcc/tree-ssa-loop-ivopts.c | |
parent | f0e10e243e96e55be6e10b91f554b20811d8f0fc (diff) | |
download | gcc-0c604a61a3ea932bc4cf17f543d014c740c4a28a.zip gcc-0c604a61a3ea932bc4cf17f543d014c740c4a28a.tar.gz gcc-0c604a61a3ea932bc4cf17f543d014c740c4a28a.tar.bz2 |
re PR tree-optimization/54619 (GCC aborts during compilation with '-O2 -mips16')
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.
From-SVN: r193537
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 4837fc6..040885f 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -3009,6 +3009,28 @@ get_computation_aff (struct loop *loop, 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. */ @@ -3017,7 +3039,7 @@ get_computation_at (struct loop *loop, 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; @@ -3934,6 +3956,9 @@ get_computation_cost_at (struct ivopts_data *data, 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; @@ -4041,7 +4066,7 @@ get_computation_cost_at (struct ivopts_data *data, 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 @@ -4085,7 +4110,7 @@ get_computation_cost_at (struct ivopts_data *data, 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)); |