When auto-inc-dec creates a new mem to compute the cost of doing some
transform, it forgets to copy over the alignment of the original mem.
This gives wrong costs, for example, for rs6000 a floating point load
or store is hugely expensive if unaligned.  This patch fixes it.

This doesn't fix any test case I'm aware of, but it is a very simple
patch.  Is it okay for trunk?


Segher


2019-04-17  Segher Boessenkool  <seg...@kernel.crashing.org>

        * auto-inc-dec.c (attempt_change): Set the alignment of the
        temporary memory to that of the original.

---
 gcc/auto-inc-dec.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/gcc/auto-inc-dec.c b/gcc/auto-inc-dec.c
index 43400cc..bdb6efa 100644
--- a/gcc/auto-inc-dec.c
+++ b/gcc/auto-inc-dec.c
@@ -471,6 +471,7 @@ attempt_change (rtx new_addr, rtx inc_reg)
   int regno;
   rtx mem = *mem_insn.mem_loc;
   machine_mode mode = GET_MODE (mem);
+  int align = MEM_ALIGN (mem);
   rtx new_mem;
   int old_cost = 0;
   int new_cost = 0;
@@ -478,6 +479,7 @@ attempt_change (rtx new_addr, rtx inc_reg)
 
   PUT_MODE (mem_tmp, mode);
   XEXP (mem_tmp, 0) = new_addr;
+  set_mem_align (mem_tmp, align);
 
   old_cost = (set_src_cost (mem, mode, speed)
              + set_rtx_cost (PATTERN (inc_insn.insn), speed));
-- 
1.8.3.1

Reply via email to