On Fri, Sep 20, 2013 at 12:00 PM, bin.cheng <bin.ch...@arm.com> wrote:
> Hi,
> For now IVOPT constructs scaled address expression in the form of
> "scaled*index" and checks whether backend supports it. The problem is the
> address expression is invalid on ARM, causing scaled expression disabled in
> IVOPT on ARM.  This patch fixes the IVOPT part by constructing rtl address
> expression like "index*scaled+base".

-      addr = gen_rtx_fmt_ee (MULT, address_mode, reg1, NULL_RTX);
+      /* Construct address expression in the canonical form of
+ "base+index*scale" and call memory_address_addr_space_p
+ to see whether it is allowed by target processors.  */
+      index = gen_rtx_fmt_ee (MULT, address_mode, reg1, NULL_RTX);
       for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
  {
-  XEXP (addr, 1) = gen_int_mode (i, address_mode);
+  if (i == 1)
+    continue;
+
+  XEXP (index, 1) = gen_int_mode (i, address_mode);
+  addr = gen_rtx_fmt_ee (PLUS, address_mode, index, reg1);
   if (memory_address_addr_space_p (mode, addr, as))
     bitmap_set_bit (valid_mult, i + MAX_RATIO);

so you now build reg1*scale+reg1 - which checks if offset and scale
work at the same time (and with the same value - given this is
really reg1*(scale+1)).  It might be that this was implicitely assumed
(or that no targets allow scale but no offset), but it's a change that
requires audit of behavior on more targets.

The above also builds more RTX waste which you can fix by re-using
the PLUS by building it up-front similar to the multiplication.  You also
miss the opportunity to have scale == 1 denote as to whether reg1 + reg2
is valid.  I would expect that many targets support reg1 * scale +
constant-offset
but not many reg1 * scale + reg2.

So no, the helper now checks sth completely different.  What's the problem
with arm supporting reg1 * scale?  Why shouldn't it being able to handle
the implicit zero offset?

Richard.

> Hi Richard,
> I thought about the suggestion constructing TARGET_MEM[.] and adding new
> target hook to check whether backend supports such target memory accesses,
> but still want to give this patch a try because:
> 1) RTL pattern "index*scaled+base" is some kind of canonical form of scaled
> address expression and it works fine.
> 2) It won't save us any inconvenience by constructing TARGET_MEM node, on
> contrary, we have to add new target hook checking whether scaled addressing
> mode is supported, which in essence is nothing else than current
> implementation.
>
> Also "base+index*scaled" is re-structured to canonical form
> "index*scaled+base", I constructed the latter form in patch.
> Bootstrapped and tested on x86_64 and arm_a15. Is it OK?
>
> Thanks.
> bin
>
>
> 2013-09-20  Bin Cheng  <bin.ch...@arm.com>
>
>         * tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p):
>         Construct canonical scaled rtl address expression.

Reply via email to