On Mon, Feb 25, 2013 at 5:39 PM, Richard Biener <richard.guent...@gmail.com> wrote: > On Fri, Feb 22, 2013 at 9:42 AM, Bin.Cheng <amker.ch...@gmail.com> wrote: >> Hi, >> Function get_address_cost in ivopt computes multiplied address cost >> with below code: >> >> First: >> rat = 1; >> for (i = 2; i <= MAX_RATIO; i++) >> if (multiplier_allowed_in_address_p (i, mem_mode, as)) >> { >> rat = i; >> break; >> } >> >> Then: >> if (rat_p) >> addr = gen_rtx_fmt_ee (MULT, address_mode, addr, >> gen_int_mode (rat, address_mode)); >> >> What's the purpose of first iteration? It just finds the first allowed >> ratio in address, causing the generated ADDR always has the minimal >> allowed ratio. Is it right? > > Looks like so. > >> For target doesn't support multiplied address, the generated ADDR is: >> (MULT reg, 1). The cost generally is equal to address with pure >> register. What's the meaning of this cost? > > Look at its uses.
Thanks, now I understand that it calculates representative cost for multiplied address, then uses it later. Doesn't matter which ratio is used generally. Another question about multiplied address is in function multiplier_allowed_in_address_p, it constructs rtx like "(MULT reg1, ratio)" and let backend determine whether multiplied address is allowed. I suspect the code is implemented/tested on x86, since machine like ARM only supports multiplied address with non-null base register, like "base + reg * index". The code causes multiplied address disabled totally for ARM machine. Any comments? Thanks -- Best Regards.