re PR tree-optimization/93040 (gcc doesn't optimize unaligned accesses to a 16-bit...
authorRichard Biener <rguenther@suse.de>
Thu, 9 Jan 2020 10:29:54 +0000 (10:29 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 9 Jan 2020 10:29:54 +0000 (10:29 +0000)
2020-01-09  Richard Biener  <rguenther@suse.de>

PR tree-optimization/93040
* gimple-ssa-store-merging.c (find_bswap_or_nop): Raise search limit.

* gcc.dg/optimize-bswaphi-1.c: Amend.
* gcc.dg/optimize-bswapsi-2.c: Likewise.

From-SVN: r280034

gcc/ChangeLog
gcc/gimple-ssa-store-merging.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/optimize-bswaphi-1.c
gcc/testsuite/gcc.dg/optimize-bswapsi-2.c

index 4a8e897..dbac2a4 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-09  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/93040
+       * gimple-ssa-store-merging.c (find_bswap_or_nop): Raise search limit.
+
 2020-01-09  Georg-Johann Lay  <avr@gjlay.de>
 
        * common/config/avr/avr-common.c (avr_option_optimization_table)
index 0d7639c..741b1ec 100644 (file)
@@ -848,11 +848,11 @@ find_bswap_or_nop (gimple *stmt, struct symbolic_number *n, bool *bswap)
 {
   /* The last parameter determines the depth search limit.  It usually
      correlates directly to the number n of bytes to be touched.  We
-     increase that number by log2(n) + 1 here in order to also
+     increase that number by 2 * (log2(n) + 1) here in order to also
      cover signed -> unsigned conversions of the src operand as can be seen
      in libgcc, and for initial shift/and operation of the src operand.  */
   int limit = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (gimple_expr_type (stmt)));
-  limit += 1 + (int) ceil_log2 ((unsigned HOST_WIDE_INT) limit);
+  limit += 2 * (1 + (int) ceil_log2 ((unsigned HOST_WIDE_INT) limit));
   gimple *ins_stmt = find_bswap_or_nop_1 (stmt, n, limit);
 
   if (!ins_stmt)
index b4e4f83..0e18082 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-09  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/93040
+       * gcc.dg/optimize-bswaphi-1.c: Amend.
+       * gcc.dg/optimize-bswapsi-2.c: Likewise.
+
 2020-01-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR inline-asm/93202
index dcd3c28..e9338d6 100644 (file)
@@ -54,5 +54,11 @@ swap16 (HItype in)
                | (((in >> 8) & 0xFF) << 0);
 }
 
-/* { dg-final { scan-tree-dump-times "16 bit load in target endianness found at" 3 "bswap" } } */
+unsigned short
+get_unaligned_16 (unsigned char *p)
+{
+  return p[0] | (p[1] << 8);
+}
+
+/* { dg-final { scan-tree-dump-times "16 bit load in target endianness found at" 4 "bswap" } } */
 /* { dg-final { scan-tree-dump-times "16 bit bswap implementation found at" 4 "bswap" } } */
index 30e677b..f111553 100644 (file)
@@ -44,5 +44,16 @@ uint32_t read_be32_3 (unsigned char *data)
         | (*data << 24);
 }
 
-/* { dg-final { scan-tree-dump-times "32 bit load in target endianness found at" 3 "bswap" } } */
+static inline unsigned short
+get_unaligned_16 (unsigned char *p)
+{
+  return p[0] | (p[1] << 8);
+}
+unsigned int
+get_unaligned_32 (unsigned char *p)
+{
+  return get_unaligned_16 (p) | (get_unaligned_16 (p + 2) << 16);
+}
+
+/* { dg-final { scan-tree-dump-times "32 bit load in target endianness found at" 4 "bswap" } } */
 /* { dg-final { scan-tree-dump-times "32 bit bswap implementation found at" 3 "bswap" } } */