diff options
author | uweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-26 21:55:59 +0000 |
---|---|---|
committer | uweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-26 21:55:59 +0000 |
commit | bd1a81f7e1665d2e33cc824dd05dd7988da9f1a8 (patch) | |
tree | ea57b1c9bc1dc4b71890b4a10a89294179e3c5e6 /gcc/tree-ssa-loop-ivopts.c | |
parent | 8b501d3673e09b8e79f3492d13f417b2fba1daa6 (diff) | |
download | gcc-bd1a81f7e1665d2e33cc824dd05dd7988da9f1a8.tar.gz |
2009-10-26 Ben Elliston <bje@au.ibm.com>
Michael Meissner <meissner@linux.vnet.ibm.com>
Ulrich Weigand <uweigand@de.ibm.com>
* doc/extend.texi (Named Address Spaces): New section.
* coretypes.h (addr_space_t): New type.
(ADDR_SPACE_GENERIC): New define.
(ADDR_SPACE_GENERIC_P): New macro.
* doc/tm.texi (Named Address Spaces): New section.
(TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P): Document.
(TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS): Document.
(TARGET_ADDR_SPACE_SUBSET_P): Document.
(TARGET_ADDR_SPACE_CONVERT): Document.
* target.h (struct gcc_target): Add addr_space substructure.
* target-def.h (TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P): Define.
(TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS): Likewise.
(TARGET_ADDR_SPACE_SUBSET_P): Likewise.
(TARGET_ADDR_SPACE_CONVERT): Likewise.
(TARGET_ADDR_SPACE_HOOKS): Likewise.
(TARGET_INITIALIZER): Initialize addr_space hooks.
* targhooks.c (default_addr_space_legitimate_address_p): New function.
(default_addr_space_legitimize_address): Likewise.
(default_addr_space_subset_p): Likewise.
(default_addr_space_convert): Likewise.
* targhooks.h (default_addr_space_legitimate_address_p): Add prototype.
(default_addr_space_legitimize_address): Likewise.
(default_addr_space_subset_p): Likewise.
(default_addr_space_convert): Likewise.
* doc/rtl.texi (MEM_ADDR_SPACE): Document.
* rtl.h (mem_attrs): Add ADDRSPACE memory attribute.
(MEM_ADDR_SPACE): New macro.
* emit-rtl.c (get_mem_attrs): Add ADDRSPACE argument and set
address space memory attribute.
(mem_attrs_htab_hash): Handle address space memory attribute.
(mem_attrs_htab_eq): Likewise.
(set_mem_attributes_minus_bitpos): Likewise.
(set_mem_alias_set): Likewise.
(set_mem_align): Likewise.
(set_mem_expr): Likewise.
(set_mem_offset): Likewise.
(set_mem_size): Likewise.
(adjust_address_1): Likewise.
(offset_address): Likewise.
(widen_memoy_address): Likewise.
(get_spill_slot_decl): Likewise.
(set_mem_attrs_for_spill): Likewise.
(set_mem_addr_space): New function.
* emit-rtl.h (set_mem_addr_space): Add prototype.
* print-rtl.c (print_rtx): Print address space memory attribute.
* expr.c (expand_assignment): Set address space memory attribute
of generated MEM RTXes as appropriate.
(expand_expr_real_1): Likewise.
* cfgexpand.c (expand_debug_expr): Likewise.
* tree-ssa-loop-ivopts.c (produce_memory_decl_rtl): Likewise.
* tree.h (struct tree_base): Add address_space bitfield. Reduce
size of "spare" bitfield.
(TYPE_ADDR_SPACE): New macro.
(ENCODE_QUAL_ADDR_SPACE): Likewise.
(DECODE_QUAL_ADDR_SPACE): Likewise.
(CLEAR_QUAL_ADDR_SPACE): Likewise.
(KEEP_QUAL_ADDR_SPACE): Likewise.
(TYPE_QUALS): Encode type address space.
(TYPE_QUALS_NO_ADDR_SPACE): New macro.
* tree.c (set_type_quals): Set type address space.
(build_array_type): Inherit array address space from element type.
* print-tree.c (print_node_brief): Print type address space.
(print_node): Likewise.
* tree-pretty-print.c (dump_generic_node): Likewise.
* explow.c (memory_address): Rename to ...
(memory_address_addr_space): ... this. Add ADDRSPACE argument.
Use address-space aware variants of memory address routines.
* recog.c (memory_address_p): Rename to ...
(memory_address_addr_space_p): ... this. Add ADDSPACE argument.
Use address-space aware variants of memory address routines.
(offsettable_address_p): Rename to ...
(offsettable_address_addr_space_p): ... this. Add ADDRSPACE argument.
Use address-space aware variants of memory address routines.
* reload.c (strict_memory_address_p): Rename to ...
(strict_memory_address_addr_space_p): ... this. Add ADDSPACE argument.
Use address-space aware variants of memory address routines.
(maybe_memory_address_p): Rename to ...
(maybe_memory_address_addr_space_p): ... this. Add ADDSPACE argument.
Use address-space aware variants of memory address routines.
* expr.h (memory_address_addr_space): Add prototype.
(memory_address): Define as macro.
* recog.h (memory_address_addr_space_p): Add prototype.
(memory_address_p): Define as macro.
(offsettable_address_addr_space_p): Add prototype.
(offsettable_address_p): Define as macro.
(strict_memory_address_addr_space_p): Add prototype.
(strict_memory_address_p): Define as macro.
* combine.c (find_split_point): Use address-space aware variants
of memory address routines.
* emit-rtl.c (operand_subword): Likewise.
(change_address_1): Likewise.
(adjust_address_1): Likewise.
(offset_address): Likewise.
* expr.c (emit_move_insn): Likewise.
(expand_assignment): Likewise.
(expand_expr_real_1): Likewise.
* recog.c (verify_changes): Likewise.
(general_operand): Likewise.
(offsettable_memref_p): Likewise.
(offsettable_nonstrict_memref_p): Likewise.
(constrain_operands): Likewise.
* reload.c (get_secondary_mem): Likewise.
(find_reloads_toplev): Likewise.
(find_reloads_address): Likewise.
(find_reloads_subreg_address): Likewise.
* reload1.c (reload): Likewise.
* rtlhooks.c (gen_lowpart_if_possible): Likewise.
* rtl.h (address_cost): Add ADDRSPACE argument.
* rtlanal.c (address_cost): Add ADDRSPACE argument. Use address-space
aware variant of memory address routines.
* loop-invariant.c (create_new_invariant): Update address_cost call.
* tree-ssa-loop-ivopts.c (computation_cost): Likewise.
* fwprop.c (should_replace_address): Add ADDRSPACE argument.
Use address-space aware variant of memory address routines.
(propagate_rtx_1): Update call to should_replace_address.
* tree-flow.h (multiplier_allowed_in_address_p): Add ADDRSPACE
argument.
* tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p): Add
ADDRSPACE argument. Use per-address-space instead of global cache.
Use address-space aware variant of memory address routines.
(get_address_cost): Likewise.
(get_computation_cost_at): Update calls.
* tree-ssa-address.c (valid_mem_ref_p): Add ADDRSPACE argument.
Use address-space aware variant of memory address routines.
(create_mem_ref_raw): Update call to valid_mem_ref_p.
(most_expensive_mult_to_index): Update call to
multiplier_allowed_in_address_p.
* dwarf2out.c (modified_type_die): Output DW_AT_address_class
attribute to indicate named address spaces.
* varasm.c (get_variable_section): DECLs in named address spaces
cannot be "common".
* reload.c (find_reloads_address): Do not use LEGITIMIZE_RELOAD_ADDRESS
for addresses in a non-generic address space.
* expr.c (emit_block_move_hints): Do not use libcalls for
memory in non-generic address spaces.
(clear_storage_hints): Likewise.
(expand_assignment): Likewise.
* fold-const.c (operand_equal_p): Expressions refering to different
address spaces are not equivalent.
* rtl.c (rtx_equal_p_cb): MEMs refering to different address
spaces are not equivalent.
(rtx_equal_p): Likewise.
* cse.c (exp_equiv_p): Likewise.
* jump.c (rtx_renumbered_equal_p): Likewise.
* reload.c (operands_match_p): Likewise.
* alias.c (nonoverlapping_memrefs_p): MEMs refering to different
address spaces may alias.
(true_dependence): Likewise.
(canon_true_dependence): Likewise.
(write_dependence_p): Likewise.
* dse.c (canon_address): Handle named address spaces.
* ifcvt.c (noce_try_cmove_arith): Likewise.
* tree.def (ADDR_SPACE_CONVERT_EXPR): New tree code.
* expr.c (expand_expr_real_2): Expand ADDR_SPACE_CONVERT_EXPR.
* convert.c (convert_to_pointer): Generate ADDR_SPACE_CONVERT_EXPR
to handle conversions between different address spaces.
* fold-const.c (fold_convert_loc): Likewise.
(fold_unary_loc): Handle ADDR_SPACE_CONVERT_EXPR.
* tree-pretty-print.c (dump_generic_node): Likewise.
* gimple-pretty-print.c (dump_unary_rhs): Likewise.
* tree-cfg.c (verify_gimple_assign_unary): Likewise.
* tree-inline.c (estimate_operator_cost): Likewise.
* tree-ssa.c (useless_type_conversion_p): Conversions between pointers
to different address spaces are not useless.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153572 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 146 |
1 files changed, 93 insertions, 53 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 42b2ef36252..7e536136c80 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -2642,6 +2642,7 @@ seq_cost (rtx seq, bool speed) static rtx produce_memory_decl_rtl (tree obj, int *regno) { + addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (obj)); rtx x; gcc_assert (obj); @@ -2651,12 +2652,14 @@ produce_memory_decl_rtl (tree obj, int *regno) x = gen_rtx_SYMBOL_REF (Pmode, name); SET_SYMBOL_REF_DECL (x, obj); x = gen_rtx_MEM (DECL_MODE (obj), x); + set_mem_addr_space (x, as); targetm.encode_section_info (obj, x, true); } else { x = gen_raw_REG (Pmode, (*regno)++); x = gen_rtx_MEM (DECL_MODE (obj), x); + set_mem_addr_space (x, as); } return x; @@ -2744,7 +2747,8 @@ computation_cost (tree expr, bool speed) cost = seq_cost (seq, speed); if (MEM_P (rslt)) - cost += address_cost (XEXP (rslt, 0), TYPE_MODE (type), speed); + cost += address_cost (XEXP (rslt, 0), TYPE_MODE (type), + TYPE_ADDR_SPACE (type), speed); return cost; } @@ -3020,51 +3024,64 @@ multiply_by_cost (HOST_WIDE_INT cst, enum machine_mode mode, bool speed) } /* Returns true if multiplying by RATIO is allowed in an address. Test the - validity for a memory reference accessing memory of mode MODE. */ + validity for a memory reference accessing memory of mode MODE in + address space AS. */ + +DEF_VEC_P (sbitmap); +DEF_VEC_ALLOC_P (sbitmap, heap); bool -multiplier_allowed_in_address_p (HOST_WIDE_INT ratio, enum machine_mode mode) +multiplier_allowed_in_address_p (HOST_WIDE_INT ratio, enum machine_mode mode, + addr_space_t as) { #define MAX_RATIO 128 - static sbitmap valid_mult[MAX_MACHINE_MODE]; - - if (!valid_mult[mode]) + unsigned int data_index = (int) as * MAX_MACHINE_MODE + (int) mode; + static VEC (sbitmap, heap) *valid_mult_list; + sbitmap valid_mult; + + if (data_index >= VEC_length (sbitmap, valid_mult_list)) + VEC_safe_grow_cleared (sbitmap, heap, valid_mult_list, data_index + 1); + + valid_mult = VEC_index (sbitmap, valid_mult_list, data_index); + if (!valid_mult) { rtx reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1); rtx addr; HOST_WIDE_INT i; - valid_mult[mode] = sbitmap_alloc (2 * MAX_RATIO + 1); - sbitmap_zero (valid_mult[mode]); + valid_mult = sbitmap_alloc (2 * MAX_RATIO + 1); + sbitmap_zero (valid_mult); addr = gen_rtx_fmt_ee (MULT, Pmode, reg1, NULL_RTX); for (i = -MAX_RATIO; i <= MAX_RATIO; i++) { XEXP (addr, 1) = gen_int_mode (i, Pmode); - if (memory_address_p (mode, addr)) - SET_BIT (valid_mult[mode], i + MAX_RATIO); + if (memory_address_addr_space_p (mode, addr, as)) + SET_BIT (valid_mult, i + MAX_RATIO); } if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, " allowed multipliers:"); for (i = -MAX_RATIO; i <= MAX_RATIO; i++) - if (TEST_BIT (valid_mult[mode], i + MAX_RATIO)) + if (TEST_BIT (valid_mult, i + MAX_RATIO)) fprintf (dump_file, " %d", (int) i); fprintf (dump_file, "\n"); fprintf (dump_file, "\n"); } + + VEC_replace (sbitmap, valid_mult_list, data_index, valid_mult); } if (ratio > MAX_RATIO || ratio < -MAX_RATIO) return false; - return TEST_BIT (valid_mult[mode], ratio + MAX_RATIO); + return TEST_BIT (valid_mult, ratio + MAX_RATIO); } /* Returns cost of address in shape symbol + var + OFFSET + RATIO * index. If SYMBOL_PRESENT is false, symbol is omitted. If VAR_PRESENT is false, variable is omitted. Compute the cost for a memory reference that accesses - a memory location of mode MEM_MODE. + a memory location of mode MEM_MODE in address space AS. MAY_AUTOINC is set to true if the autoincrement (increasing index by size of MEM_MODE / RATIO) is available. To make this determination, we @@ -3075,16 +3092,25 @@ multiplier_allowed_in_address_p (HOST_WIDE_INT ratio, enum machine_mode mode) TODO -- there must be some better way. This all is quite crude. */ +typedef struct +{ + HOST_WIDE_INT min_offset, max_offset; + unsigned costs[2][2][2][2]; +} *address_cost_data; + +DEF_VEC_P (address_cost_data); +DEF_VEC_ALLOC_P (address_cost_data, heap); + static comp_cost get_address_cost (bool symbol_present, bool var_present, unsigned HOST_WIDE_INT offset, HOST_WIDE_INT ratio, - HOST_WIDE_INT cstep, enum machine_mode mem_mode, bool speed, + HOST_WIDE_INT cstep, enum machine_mode mem_mode, + addr_space_t as, bool speed, bool stmt_after_inc, bool *may_autoinc) { - static bool initialized[MAX_MACHINE_MODE]; - static HOST_WIDE_INT rat[MAX_MACHINE_MODE], off[MAX_MACHINE_MODE]; - static HOST_WIDE_INT min_offset[MAX_MACHINE_MODE], max_offset[MAX_MACHINE_MODE]; - static unsigned costs[MAX_MACHINE_MODE][2][2][2][2]; + static VEC(address_cost_data, heap) *address_cost_data_list; + unsigned int data_index = (int) as * MAX_MACHINE_MODE + (int) mem_mode; + address_cost_data data; static bool has_preinc[MAX_MACHINE_MODE], has_postinc[MAX_MACHINE_MODE]; static bool has_predec[MAX_MACHINE_MODE], has_postdec[MAX_MACHINE_MODE]; unsigned cost, acost, complexity; @@ -3093,16 +3119,22 @@ get_address_cost (bool symbol_present, bool var_present, unsigned HOST_WIDE_INT mask; unsigned bits; - if (!initialized[mem_mode]) + if (data_index >= VEC_length (address_cost_data, address_cost_data_list)) + VEC_safe_grow_cleared (address_cost_data, heap, address_cost_data_list, + data_index + 1); + + data = VEC_index (address_cost_data, address_cost_data_list, data_index); + if (!data) { HOST_WIDE_INT i; HOST_WIDE_INT start = BIGGEST_ALIGNMENT / BITS_PER_UNIT; + HOST_WIDE_INT rat, off; int old_cse_not_expected; unsigned sym_p, var_p, off_p, rat_p, add_c; rtx seq, addr, base; rtx reg0, reg1; - initialized[mem_mode] = true; + data = (address_cost_data) xcalloc (1, sizeof (*data)); reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1); @@ -3110,36 +3142,36 @@ get_address_cost (bool symbol_present, bool var_present, for (i = start; i <= 1 << 20; i <<= 1) { XEXP (addr, 1) = gen_int_mode (i, Pmode); - if (!memory_address_p (mem_mode, addr)) + if (!memory_address_addr_space_p (mem_mode, addr, as)) break; } - max_offset[mem_mode] = i == start ? 0 : i >> 1; - off[mem_mode] = max_offset[mem_mode]; + data->max_offset = i == start ? 0 : i >> 1; + off = data->max_offset; for (i = start; i <= 1 << 20; i <<= 1) { XEXP (addr, 1) = gen_int_mode (-i, Pmode); - if (!memory_address_p (mem_mode, addr)) + if (!memory_address_addr_space_p (mem_mode, addr, as)) break; } - min_offset[mem_mode] = i == start ? 0 : -(i >> 1); + data->min_offset = i == start ? 0 : -(i >> 1); if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, "get_address_cost:\n"); fprintf (dump_file, " min offset %s %d\n", GET_MODE_NAME (mem_mode), - (int) min_offset[mem_mode]); + (int) data->min_offset); fprintf (dump_file, " max offset %s %d\n", GET_MODE_NAME (mem_mode), - (int) max_offset[mem_mode]); + (int) data->max_offset); } - rat[mem_mode] = 1; + rat = 1; for (i = 2; i <= MAX_RATIO; i++) - if (multiplier_allowed_in_address_p (i, mem_mode)) + if (multiplier_allowed_in_address_p (i, mem_mode, as)) { - rat[mem_mode] = i; + rat = i; break; } @@ -3151,22 +3183,26 @@ get_address_cost (bool symbol_present, bool var_present, if (HAVE_PRE_DECREMENT) { addr = gen_rtx_PRE_DEC (Pmode, reg0); - has_predec[mem_mode] = memory_address_p (mem_mode, addr); + has_predec[mem_mode] + = memory_address_addr_space_p (mem_mode, addr, as); } if (HAVE_POST_DECREMENT) { addr = gen_rtx_POST_DEC (Pmode, reg0); - has_postdec[mem_mode] = memory_address_p (mem_mode, addr); + has_postdec[mem_mode] + = memory_address_addr_space_p (mem_mode, addr, as); } if (HAVE_PRE_INCREMENT) { addr = gen_rtx_PRE_INC (Pmode, reg0); - has_preinc[mem_mode] = memory_address_p (mem_mode, addr); + has_preinc[mem_mode] + = memory_address_addr_space_p (mem_mode, addr, as); } if (HAVE_POST_INCREMENT) { addr = gen_rtx_POST_INC (Pmode, reg0); - has_postinc[mem_mode] = memory_address_p (mem_mode, addr); + has_postinc[mem_mode] + = memory_address_addr_space_p (mem_mode, addr, as); } for (i = 0; i < 16; i++) { @@ -3178,7 +3214,7 @@ get_address_cost (bool symbol_present, bool var_present, addr = reg0; if (rat_p) addr = gen_rtx_fmt_ee (MULT, Pmode, addr, - gen_int_mode (rat[mem_mode], Pmode)); + gen_int_mode (rat, Pmode)); if (var_p) addr = gen_rtx_fmt_ee (PLUS, Pmode, addr, reg1); @@ -3194,13 +3230,12 @@ get_address_cost (bool symbol_present, bool var_present, if (off_p) base = gen_rtx_fmt_e (CONST, Pmode, - gen_rtx_fmt_ee (PLUS, Pmode, - base, - gen_int_mode (off[mem_mode], - Pmode))); + gen_rtx_fmt_ee + (PLUS, Pmode, base, + gen_int_mode (off, Pmode))); } else if (off_p) - base = gen_int_mode (off[mem_mode], Pmode); + base = gen_int_mode (off, Pmode); else base = NULL_RTX; @@ -3212,17 +3247,17 @@ get_address_cost (bool symbol_present, bool var_present, follow. */ old_cse_not_expected = cse_not_expected; cse_not_expected = true; - addr = memory_address (mem_mode, addr); + addr = memory_address_addr_space (mem_mode, addr, as); cse_not_expected = old_cse_not_expected; seq = get_insns (); end_sequence (); acost = seq_cost (seq, speed); - acost += address_cost (addr, mem_mode, speed); + acost += address_cost (addr, mem_mode, as, speed); if (!acost) acost = 1; - costs[mem_mode][sym_p][var_p][off_p][rat_p] = acost; + data->costs[sym_p][var_p][off_p][rat_p] = acost; } /* On some targets, it is quite expensive to load symbol to a register, @@ -3244,12 +3279,12 @@ get_address_cost (bool symbol_present, bool var_present, off_p = (i >> 1) & 1; rat_p = (i >> 2) & 1; - acost = costs[mem_mode][0][1][off_p][rat_p] + 1; + acost = data->costs[0][1][off_p][rat_p] + 1; if (var_p) acost += add_c; - if (acost < costs[mem_mode][1][var_p][off_p][rat_p]) - costs[mem_mode][1][var_p][off_p][rat_p] = acost; + if (acost < data->costs[1][var_p][off_p][rat_p]) + data->costs[1][var_p][off_p][rat_p] = acost; } if (dump_file && (dump_flags & TDF_DETAILS)) @@ -3273,7 +3308,7 @@ get_address_cost (bool symbol_present, bool var_present, if (rat_p) fprintf (dump_file, "rat * "); - acost = costs[mem_mode][sym_p][var_p][off_p][rat_p]; + acost = data->costs[sym_p][var_p][off_p][rat_p]; fprintf (dump_file, "index costs %d\n", acost); } if (has_predec[mem_mode] || has_postdec[mem_mode] @@ -3281,6 +3316,9 @@ get_address_cost (bool symbol_present, bool var_present, fprintf (dump_file, " May include autoinc/dec\n"); fprintf (dump_file, "\n"); } + + VEC_replace (address_cost_data, address_cost_data_list, + data_index, data); } bits = GET_MODE_BITSIZE (Pmode); @@ -3309,10 +3347,10 @@ get_address_cost (bool symbol_present, bool var_present, cost = 0; offset_p = (s_offset != 0 - && min_offset[mem_mode] <= s_offset - && s_offset <= max_offset[mem_mode]); + && data->min_offset <= s_offset + && s_offset <= data->max_offset); ratio_p = (ratio != 1 - && multiplier_allowed_in_address_p (ratio, mem_mode)); + && multiplier_allowed_in_address_p (ratio, mem_mode, as)); if (ratio != 1 && !ratio_p) cost += multiply_by_cost (ratio, Pmode, speed); @@ -3322,7 +3360,7 @@ get_address_cost (bool symbol_present, bool var_present, if (may_autoinc) *may_autoinc = autoinc; - acost = costs[mem_mode][symbol_present][var_present][offset_p][ratio_p]; + acost = data->costs[symbol_present][var_present][offset_p][ratio_p]; complexity = (symbol_present != 0) + (var_present != 0) + offset_p + ratio_p; return new_cost (cost + acost, complexity); } @@ -3742,8 +3780,9 @@ 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)))) + && multiplier_allowed_in_address_p + (ratio, TYPE_MODE (TREE_TYPE (utype)), + TYPE_ADDR_SPACE (TREE_TYPE (utype)))) { cbase = fold_build2 (MULT_EXPR, ctype, cbase, build_int_cst (ctype, ratio)); @@ -3777,6 +3816,7 @@ get_computation_cost_at (struct ivopts_data *data, get_address_cost (symbol_present, var_present, offset, ratio, cstepi, TYPE_MODE (TREE_TYPE (utype)), + TYPE_ADDR_SPACE (TREE_TYPE (utype)), speed, stmt_is_after_inc, can_autoinc)); |