re PR rtl-optimization/78355 (LRA generates unaligned accesses when SLOW_UNALIGNED_AC...
authorPip Cet <pipcet@gmail.com>
Thu, 17 Nov 2016 16:16:38 +0000 (16:16 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 17 Nov 2016 16:16:38 +0000 (16:16 +0000)
PR rtl-optimization/78355
* doc/tm.texi.in (SLOW_UNALIGNED_ACCESS): Document that the macro only
needs to deal with unaligned accesses.
* doc/tm.texi: Regenerate.
* lra-constraints.c (simplify_operand_subreg): Only invoke
SLOW_UNALIGNED_ACCESS on innermode if the MEM is not aligned enough.

Co-Authored-By: Eric Botcazou <ebotcazou@adacore.com>
From-SVN: r242554

gcc/ChangeLog
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/lra-constraints.c

index 1bb29c0ab03a535d396c1bbd6e47655c031ad676..bc2b86c5070b2545d7374a175e7a4643001ec259 100644 (file)
@@ -1,3 +1,13 @@
+2016-11-17  Pip Cet  <pipcet@gmail.com>
+            Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR rtl-optimization/78355
+       * doc/tm.texi.in (SLOW_UNALIGNED_ACCESS): Document that the macro only
+       needs to deal with unaligned accesses.
+       * doc/tm.texi: Regenerate.
+       * lra-constraints.c (simplify_operand_subreg): Only invoke
+       SLOW_UNALIGNED_ACCESS on innermode if the MEM is not aligned enough.
+
 2016-11-17  David Malcolm  <dmalcolm@redhat.com>
 
        * input.c (selftest::test_lexer_string_locations_long_line): New
index 84bba07de270019b1cea4ba2a60ceb870a1a6c92..7bf09d1544f79a343d183037573355e1d0b29a36 100644 (file)
@@ -6368,7 +6368,8 @@ other fields in the same word of the structure, but to different bytes.
 Define this macro to be the value 1 if memory accesses described by the
 @var{mode} and @var{alignment} parameters have a cost many times greater
 than aligned accesses, for example if they are emulated in a trap
-handler.
+handler.  This macro is invoked only for unaligned accesses, i.e. when
+@code{@var{alignment} < GET_MODE_ALIGNMENT (@var{mode})}.
 
 When this macro is nonzero, the compiler will act as if
 @code{STRICT_ALIGNMENT} were nonzero when generating code for block
index 9afd5daa65bc107a68a147201caf60c3ce903780..58d1e638aff7adc3046309a32d97ae7c2610c34d 100644 (file)
@@ -4656,7 +4656,8 @@ other fields in the same word of the structure, but to different bytes.
 Define this macro to be the value 1 if memory accesses described by the
 @var{mode} and @var{alignment} parameters have a cost many times greater
 than aligned accesses, for example if they are emulated in a trap
-handler.
+handler.  This macro is invoked only for unaligned accesses, i.e. when
+@code{@var{alignment} < GET_MODE_ALIGNMENT (@var{mode})}.
 
 When this macro is nonzero, the compiler will act as if
 @code{STRICT_ALIGNMENT} were nonzero when generating code for block
index b592168f00104a5b9649e3eb47e4544e78a59f8e..56b65ef81af79e4ccea6d9072ee4e9bc2fe24b21 100644 (file)
@@ -1486,9 +1486,10 @@ simplify_operand_subreg (int nop, machine_mode reg_mode)
             equivalences in function lra_constraints) and because for spilled
             pseudos we allocate stack memory enough for the biggest
             corresponding paradoxical subreg.  */
-         if (!SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (reg))
-             || SLOW_UNALIGNED_ACCESS (innermode, MEM_ALIGN (reg))
-             || MEM_ALIGN (reg) >= GET_MODE_ALIGNMENT (mode))
+         if (!(MEM_ALIGN (reg) < GET_MODE_ALIGNMENT (mode)
+               && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (reg)))
+             || (MEM_ALIGN (reg) < GET_MODE_ALIGNMENT (innermode)
+                 && SLOW_UNALIGNED_ACCESS (innermode, MEM_ALIGN (reg))))
            return true;
 
          /* INNERMODE is fast, MODE slow.  Reload the mem in INNERMODE.  */