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>
* 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>
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,
default:
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;
}
......@@ -1740,15 +1743,16 @@ find_bswap (gimple stmt)
struct symbolic_number n;
tree source_expr;
int limit;
/* The last parameter determines the depth search limit. It usually
correlates directly to the number of bytes to be touched. We
increase that number by one here in order to also cover signed ->
unsigned conversions of the src operand as can be seen in
libgcc. */
source_expr = find_bswap_1 (stmt, &n,
TREE_INT_CST_LOW (
TYPE_SIZE_UNIT (gimple_expr_type (stmt))) + 1);
increase that number by three here in order to also
cover signed -> unsigned converions of the src operand as can be seen
in libgcc, and for initial shift/and operation of the src operand. */
limit = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (gimple_expr_type (stmt)));
limit += 1 + (int) ceil_log2 ((unsigned HOST_WIDE_INT) limit);
source_expr = find_bswap_1 (stmt, &n, limit);
if (!source_expr)
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