On Sun, Apr 28, 2013 at 8:15 PM, Richard Biener
<richard.guent...@gmail.com> wrote:
> "Bin.Cheng" <amker.ch...@gmail.com> wrote:
>
>>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?
>
> Addr_expr cost should be computed by
> Looking at the cost for the address computation. Not by simply expanding the 
> address_expr. Look at get_inner_reference and handle the returned base 
> specially.
>
Sorry for missing the message and late reply.

I think the addr_expr should be expanded in some cases, for example,
computing the base cost of iv candidate.
Considering below candidate:

candidate 22
  var_before ivtmp.27
  var_after ivtmp.27
  incremented before use 1
  type unsigned int
  base (unsigned int) ((long unsigned int *) &GasmanStatAlive + 4294967292)
  step 4
  base object (void *) &GasmanStatAlive
Candidate 22 is related to use 1
candidate 23
  var_before ivtmp.28
  var_after ivtmp.28
  incremented after use 1
  type unsigned int
  base (unsigned int) &GasmanStatAlive
  step 4
  base object (void *) &GasmanStatAlive
Candidate 23 is related to use 1

the cost of computing base_22 in loop preheader is more expensive than
base_23. It's not computed as an address, so expanding would be
necessary.

Is it true, or something missed?

Thanks again.


--- Best Regards.

Reply via email to