Commit 0f507a36 by Richard Biener Committed by Richard Biener

re PR tree-optimization/93040 (gcc doesn't optimize unaligned accesses to a…

re PR tree-optimization/93040 (gcc doesn't optimize unaligned accesses to a 16-bit value on the x86 as well as it does a 32-bit value (or clang))

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
parent ddc8786f
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> 2020-01-09 Georg-Johann Lay <avr@gjlay.de>
* common/config/avr/avr-common.c (avr_option_optimization_table) * common/config/avr/avr-common.c (avr_option_optimization_table)
......
...@@ -848,11 +848,11 @@ find_bswap_or_nop (gimple *stmt, struct symbolic_number *n, bool *bswap) ...@@ -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 /* The last parameter determines the depth search limit. It usually
correlates directly to the number n of bytes to be touched. We 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 cover signed -> unsigned conversions of the src operand as can be seen
in libgcc, and for initial shift/and operation of the src operand. */ 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))); 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); gimple *ins_stmt = find_bswap_or_nop_1 (stmt, n, limit);
if (!ins_stmt) if (!ins_stmt)
......
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> 2020-01-09 Jakub Jelinek <jakub@redhat.com>
PR inline-asm/93202 PR inline-asm/93202
......
...@@ -54,5 +54,11 @@ swap16 (HItype in) ...@@ -54,5 +54,11 @@ swap16 (HItype in)
| (((in >> 8) & 0xFF) << 0); | (((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" } } */ /* { dg-final { scan-tree-dump-times "16 bit bswap implementation found at" 4 "bswap" } } */
...@@ -44,5 +44,16 @@ uint32_t read_be32_3 (unsigned char *data) ...@@ -44,5 +44,16 @@ uint32_t read_be32_3 (unsigned char *data)
| (*data << 24); | (*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" } } */ /* { dg-final { scan-tree-dump-times "32 bit bswap implementation found at" 3 "bswap" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment