aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2012-11-15 16:49:45 +0000
committerTom de Vries <vries@gcc.gnu.org>2012-11-15 16:49:45 +0000
commit0c604a61a3ea932bc4cf17f543d014c740c4a28a (patch)
tree018eecc9d64d2d8d0bfb03c5e3c4de2f6a450fcc
parentf0e10e243e96e55be6e10b91f554b20811d8f0fc (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-ssa-loop-ivopts.c31
2 files changed, 35 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 01bf6d3..cecf13e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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
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));