expr.c (copy_blkmode_to_reg): Fix bitsize for targets with fast unaligned access.
authorTamar Christina <tamar.christina@arm.com>
Fri, 17 Nov 2017 10:47:52 +0000 (10:47 +0000)
committerTamar Christina <tnfchris@gcc.gnu.org>
Fri, 17 Nov 2017 10:47:52 +0000 (10:47 +0000)
2017-11-17  Tamar Christina  <tamar.christina@arm.com>

* expr.c (copy_blkmode_to_reg): Fix bitsize for targets
with fast unaligned access.
* doc/sourcebuild.texi (word_mode_no_slow_unalign): New.

gcc/testsuite/
2017-11-17  Tamar Christina  <tamar.christina@arm.com>

* gcc.dg/struct-simple.c: New.
* lib/target-supports.exp
(check_effective_target_word_mode_no_slow_unalign): New.

From-SVN: r254862

gcc/ChangeLog
gcc/doc/sourcebuild.texi
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/struct-simple.c [new file with mode: 0644]
gcc/testsuite/lib/target-supports.exp

index e371bf761cc09a5578bbaeb00da51373688fc05b..b37fd6f12de6f45db5619a5d23fd3d3fe7bd7e98 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-17  Tamar Christina  <tamar.christina@arm.com>
+
+       * expr.c (copy_blkmode_to_reg): Fix bitsize for targets
+       with fast unaligned access.
+       * doc/sourcebuild.texi (word_mode_no_slow_unalign): New.
+
 2017-11-17  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * config/arm/arm.c (cmse_nonsecure_entry_clear_before_return): Allocate
index d5a90e518d67fb289c8caf2e8f2237970b6649ea..d1a3ec03431fa943d21c7951c239f4bbd042fcb2 100644 (file)
@@ -2240,8 +2240,12 @@ Target supports @code{wchar_t} that is compatible with @code{char32_t}.
 
 @item comdat_group
 Target uses comdat groups.
+
+@item word_mode_no_slow_unalign
+Target does not have slow unaligned access when doing word size accesses.
 @end table
 
+
 @subsubsection Local to tests in @code{gcc.target/i386}
 
 @table @code
index 76684c11cc3ee2c98f4ae73d11565c0a899bd6cf..c93d9f6754c6ddd0988ffc5c8173469af23be165 100644 (file)
@@ -2772,7 +2772,9 @@ copy_blkmode_to_reg (machine_mode mode_in, tree src)
 
   n_regs = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
   dst_words = XALLOCAVEC (rtx, n_regs);
-  bitsize = MIN (TYPE_ALIGN (TREE_TYPE (src)), BITS_PER_WORD);
+  bitsize = BITS_PER_WORD;
+  if (targetm.slow_unaligned_access (word_mode, TYPE_ALIGN (TREE_TYPE (src))))
+    bitsize = MIN (TYPE_ALIGN (TREE_TYPE (src)), BITS_PER_WORD);
 
   /* Copy the structure BITSIZE bits at a time.  */
   for (bitpos = 0, xbitpos = padding_correction;
index 652ddc876b61bff87c25a98eb96520ac57bf4f28..c3dc5f92ce9ed60a5b14b475eca367a3bae37017 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-17  Tamar Christina  <tamar.christina@arm.com>
+
+       * gcc.dg/struct-simple.c: New.
+       * lib/target-supports.exp
+       (check_effective_target_word_mode_no_slow_unalign): New.
+
 2017-11-17  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * gcc.target/arm/cmse/cmse-14.c: Change logic to match branch
diff --git a/gcc/testsuite/gcc.dg/struct-simple.c b/gcc/testsuite/gcc.dg/struct-simple.c
new file mode 100644 (file)
index 0000000..17b9560
--- /dev/null
@@ -0,0 +1,52 @@
+/* { dg-do-run } */
+/* { dg-require-effective-target word_mode_no_slow_unalign } */
+/* { dg-additional-options "-fdump-rtl-final" } */
+
+/* Copyright 1996, 1999, 2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.
+
+   Please email any bugs, comments, and/or additions to this file to:
+   bug-gdb@prep.ai.mit.edu  */
+
+#include <stdio.h>
+
+struct struct3 { char a, b, c; };
+struct struct3 foo3 = { 'A', 'B', 'C'},  L3;
+
+struct struct3  fun3()
+{
+  return foo3;
+}
+
+#ifdef PROTOTYPES
+void Fun3(struct struct3 foo3)
+#else
+void Fun3(foo3)
+     struct struct3 foo3;
+#endif
+{
+  L3 = foo3;
+}
+
+int main()
+{
+  struct struct3 x = fun3();
+
+  printf("a:%c, b:%c, c:%c\n", x.a, x.b, x.c);
+}
+
+/* { dg-final { scan-rtl-dump-not {zero_extract:.+\[\s*foo3\s*\]} "final" } } */
+
index 881f849a388dcbade83b30395e708b3910fe69da..d80da6900885001a69f7787f9f85e8173297bbf5 100644 (file)
@@ -6222,6 +6222,31 @@ proc check_effective_target_unaligned_stack { } {
     return $et_unaligned_stack_saved
 }
 
+# Return 1 if the target plus current options does not have
+# slow unaligned access when using word size accesses.
+#
+# This won't change for different subtargets so cache the result.
+
+proc check_effective_target_word_mode_no_slow_unalign { } {
+    global et_word_mode_no_slow_unalign_saved
+    global et_index
+
+    if [info exists et_word_mode_no_slow_unalign_saved($et_index)] {
+        verbose "check_effective_target_word_mode_no_slow_unalign: \
+                 using cached result" 2
+    } else {
+        set et_word_mode_no_slow_unalign_saved($et_index) 0
+        if { [is-effective-target non_strict_align]
+            && !([istarget arm*-*-*])
+           } {
+            set et_word_mode_no_slow_unalign_saved($et_index) 1
+        }
+    }
+    verbose "check_effective_target_word_mode_no_slow_unalign:\
+             returning $et_word_mode_no_slow_unalign_saved($et_index)" 2
+    return $et_word_mode_no_slow_unalign_saved($et_index)
+}
+
 # Return 1 if the target plus current options does not support a vector
 # alignment mechanism, 0 otherwise.
 #