Commit 5da49a9d by Kai Tietz Committed by Kai Tietz

tree-ssa-math-opts.c (do_shift_rotate): Zero bits out of type precision after operation.

2011-06-27  Kai Tietz  <ktietz@redhat.com>

        * tree-ssa-math-opts.c (do_shift_rotate): Zero bits
        out of type precision after operation.
        (find_bswap): Take for limit value the integer auto-
        promotion into account.

ChangeLog

2011-06-27  Kai Tietz  <ktietz@redhat.com>

        * gcc.dg/optimize-bswapdi-2.c: New test.

From-SVN: r175528
parent 9242213f
2011-06-27 Kai Tietz <ktietz@redhat.com>
* tree-ssa-math-opts.c (do_shift_rotate): Zero bits
out of type precision after operation.
(find_bswap): Take for limit value the integer auto-
promotion into account.
2011-06-27 Eric Botcazou <ebotcazou@adacore.com> 2011-06-27 Eric Botcazou <ebotcazou@adacore.com>
* reorg.c (fill_simple_delay_slots): Use stop_search_p to stop the * reorg.c (fill_simple_delay_slots): Use stop_search_p to stop the
......
2011-06-27 Kai Tietz <ktietz@redhat.com>
* gcc.dg/optimize-bswapdi-2.c: New test.
2011-06-27 Michael Hope <michael.hope@linaro.org> 2011-06-27 Michael Hope <michael.hope@linaro.org>
Richard Sandiford <richard.sandiford@linaro.org> Richard Sandiford <richard.sandiford@linaro.org>
......
/* { dg-do compile { target arm*-*-* alpha*-*-* ia64*-*-* x86_64-*-* s390x-*-* powerpc*-*-* rs6000-*-* } } */
/* { dg-require-effective-target stdint_types } */
/* { dg-require-effective-target lp64 } */
/* { dg-options "-O2 -fdump-tree-bswap" } */
#include <stdint.h>
/* A variant via unsigned short. */
uint64_t
swap64_c (uint64_t x)
{
uint16_t a0 = x >> 48;
uint16_t a1 = x >> 32;
uint16_t a2 = x >> 16;
uint16_t a3 = x;
return ((uint64_t) (((a0 >> 8) & 0xff) | ((a0 << 8) & 0xff00)))
| ((uint64_t) (((a1 >> 8) & 0xff) | ((a1 << 8) & 0xff00)) << 16)
| ((uint64_t) (((a2 >> 8) & 0xff) | ((a2 << 8) & 0xff00)) << 32)
| ((uint64_t) (((a3 >> 8) & 0xff) | ((a3 << 8) & 0xff00)) << 48);
}
/* { dg-final { scan-tree-dump-times "64 bit bswap implementation found at" 1 "bswap" } } */
/* { dg-final { cleanup-tree-dump "bswap" } } */
...@@ -1543,6 +1543,9 @@ do_shift_rotate (enum tree_code code, ...@@ -1543,6 +1543,9 @@ do_shift_rotate (enum tree_code code,
default: default:
return false; return false;
} }
/* Zero unused bits for size. */
if (n->size < (int)sizeof (HOST_WIDEST_INT))
n->n &= ((unsigned HOST_WIDEST_INT)1 << (n->size * BITS_PER_UNIT)) - 1;
return true; return true;
} }
...@@ -1740,15 +1743,16 @@ find_bswap (gimple stmt) ...@@ -1740,15 +1743,16 @@ find_bswap (gimple stmt)
struct symbolic_number n; struct symbolic_number n;
tree source_expr; tree source_expr;
int limit;
/* 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 of bytes to be touched. We correlates directly to the number of bytes to be touched. We
increase that number by one here in order to also cover signed -> increase that number by three here in order to also
unsigned conversions of the src operand as can be seen in cover signed -> unsigned converions of the src operand as can be seen
libgcc. */ in libgcc, and for initial shift/and operation of the src operand. */
source_expr = find_bswap_1 (stmt, &n, limit = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (gimple_expr_type (stmt)));
TREE_INT_CST_LOW ( limit += 1 + (int) ceil_log2 ((unsigned HOST_WIDE_INT) limit);
TYPE_SIZE_UNIT (gimple_expr_type (stmt))) + 1); source_expr = find_bswap_1 (stmt, &n, limit);
if (!source_expr) if (!source_expr)
return NULL_TREE; return NULL_TREE;
......
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