diff options
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 326c4db..7337d02 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -755,7 +755,7 @@ static tree determine_base_object (tree expr) { enum tree_code code = TREE_CODE (expr); - tree base, obj, op0, op1; + tree base, obj; /* If this is a pointer casted to any type, we need to determine the base object for the pointer; so handle conversions before @@ -785,20 +785,13 @@ determine_base_object (tree expr) return fold_convert (ptr_type_node, build_fold_addr_expr (base)); + case POINTER_PLUS_EXPR: + return determine_base_object (TREE_OPERAND (expr, 0)); + case PLUS_EXPR: case MINUS_EXPR: - op0 = determine_base_object (TREE_OPERAND (expr, 0)); - op1 = determine_base_object (TREE_OPERAND (expr, 1)); - - if (!op1) - return op0; - - if (!op0) - return (code == PLUS_EXPR - ? op1 - : fold_build1 (NEGATE_EXPR, ptr_type_node, op1)); - - return fold_build2 (code, ptr_type_node, op0, op1); + /* Pointer addition is done solely using POINTER_PLUS_EXPR. */ + gcc_unreachable (); default: return fold_convert (ptr_type_node, expr); @@ -3100,9 +3093,9 @@ force_expr_to_var_cost (tree expr) symbol_cost = computation_cost (addr) + 1; address_cost - = computation_cost (build2 (PLUS_EXPR, type, + = computation_cost (build2 (POINTER_PLUS_EXPR, type, addr, - build_int_cst (type, 2000))) + 1; + build_int_cst (sizetype, 2000))) + 1; if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, "force_expr_to_var_cost:\n"); @@ -3141,6 +3134,7 @@ force_expr_to_var_cost (tree expr) switch (TREE_CODE (expr)) { + case POINTER_PLUS_EXPR: case PLUS_EXPR: case MINUS_EXPR: case MULT_EXPR: @@ -3169,6 +3163,7 @@ force_expr_to_var_cost (tree expr) mode = TYPE_MODE (TREE_TYPE (expr)); switch (TREE_CODE (expr)) { + case POINTER_PLUS_EXPR: case PLUS_EXPR: case MINUS_EXPR: cost = add_cost (mode); |