I suspect codes in prepare_decl_rtl: case VAR_DECL: case PARM_DECL: case RESULT_DECL: *ws = 0; obj = *expr_p;
if (DECL_RTL_SET_P (obj)) break; if (DECL_MODE (obj) == BLKmode) x = produce_memory_decl_rtl (obj, regno); else x = gen_raw_REG (DECL_MODE (obj), (*regno)++); It generates RTX_REG(regno) for an var_decl which is an array has DECL_MODE == OImode. Any suggestions? On Sun, Apr 28, 2013 at 3:15 PM, Bin.Cheng <amker.ch...@gmail.com> wrote: > Hi, > Currently tree-ssa-loop-ivopts.c doesn't calculate addr_expr's cost, > while uses target_spill_cost instead, as in function > force_expr_to_var_cost. When I experimented with ivopts by calling > computation_cost to calculate cost of ADDR_EXPR, I encountered assert > failure in expand_expr_addr_expr_1, because: > 0) The failure comes with (ADDR_EXPR (ARRAY_REF (local_var_decl))); > 1) computation_cost calls walk_tree/prepare_decl_rtl to prepare > RTX_REG for variables in ADDR_EXPR, which is the local_var_decl; > 2) computation_cost calls expand_expr to do the expanding work. > 3) function expand_expr_addr_expr_1 returns the RTX_REG as the result > of expanding, which violates the assertion "gcc_assert (MEM_P > (result))". The corresponding code in expand_expr_addr_expr_1 is like > : > > default: > /* If the object is a DECL, then expand it for its rtl. Don't bypass > expand_expr, as that can have various side effects; LABEL_DECLs for > example, may not have their DECL_RTL set yet. Expand the rtl of > CONSTRUCTORs too, which should yield a memory reference for the > constructor's contents. Assume language specific tree nodes can > be expanded in some interesting way. */ > gcc_assert (TREE_CODE (exp) < LAST_AND_UNUSED_TREE_CODE); > if (DECL_P (exp) > || TREE_CODE (exp) == CONSTRUCTOR > || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR) > { > result = expand_expr (exp, target, tmode, > modifier == EXPAND_INITIALIZER > ? EXPAND_INITIALIZER : EXPAND_CONST_ADDRESS); > > /* If the DECL isn't in memory, then the DECL wasn't properly > marked TREE_ADDRESSABLE, which will be either a front-end > or a tree optimizer bug. */ > > if (TREE_ADDRESSABLE (exp) > && ! MEM_P (result) > && ! targetm.calls.allocate_stack_slots_for_args()) > { > error ("local frame unavailable (naked function?)"); > return result; > } > else > gcc_assert (MEM_P (result)); > result = XEXP (result, 0); > > /* ??? Is this needed anymore? */ > if (DECL_P (exp)) > TREE_USED (exp) = 1; > > if (modifier != EXPAND_INITIALIZER > && modifier != EXPAND_CONST_ADDRESS > && modifier != EXPAND_SUM) > result = force_operand (result, target); > return result; > } > > So the question is > Is it as expected that cost of ADDR_EXPR cannot be calculated by > computation_cost? Or the assertion is because of immature > computation_cost/prepare_decl_rtl? > > I am not sure whether I described the problem clearly, please feel > free to ask for more information. Thanks for your patience. > > -- > Best Regards. -- Best Regards.