From d9022390cd43f3fd58df12acc041460e34aef614 Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 4 Jul 2007 11:44:58 +0000 Subject: [PATCH] 2007-07-04 Richard Guenther PR tree-optimization/32482 * tree-ssa-ifcombine.c (recognize_single_bit_test): Use the original ssa name if we didn't find a shift expression. Fix shift constant for bit zero test. * gcc.c-torture/compile/pr32482.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@126314 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr32482.c | 23 +++++++++++++++++++++++ gcc/tree-ssa-ifcombine.c | 13 +++++++++---- 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr32482.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a0768d7a585..a2949209d04 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-07-04 Richard Guenther + + PR tree-optimization/32482 + * tree-ssa-ifcombine.c (recognize_single_bit_test): Use the + original ssa name if we didn't find a shift expression. + Fix shift constant for bit zero test. + 2007-07-04 Richard Sandiford * config/sh/lib1funcs.asm (ic_invalidate): Align constant pool. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0c96acb6cee..a0c07456ac6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-07-04 Richard Guenther + + PR tree-optimization/32482 + * gcc.c-torture/compile/pr32482.c: New testcase. + 2007-07-04 Richard Sandiford * gcc.c-torture/execute/ieee/compare-fp-4.x: Add an XFAIL for ARM diff --git a/gcc/testsuite/gcc.c-torture/compile/pr32482.c b/gcc/testsuite/gcc.c-torture/compile/pr32482.c new file mode 100644 index 00000000000..9f0e3bfeb9c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr32482.c @@ -0,0 +1,23 @@ +typedef struct { unsigned long bits[((((1 << 0))+32 -1)/32)]; } nodemask_t; +static inline __attribute__((always_inline)) +int bitmap_empty(const unsigned long *src, int nbits) +{ + return ! (*src & ( ((nbits) % 32) ? (1UL<<((nbits) % 32))-1 : ~0UL )); +} +static inline __attribute__((always_inline)) +int __nodes_empty(const nodemask_t *srcp, int nbits) +{ + return bitmap_empty(srcp->bits, nbits); +} +extern nodemask_t node_online_map; +void drain_array(void); +void drain_cpu_caches(void) +{ + int node; + if (!__nodes_empty(&(node_online_map), (1 << 0))) + for (((node)) = 0; ((node)) < 1; ((node))++) + { + } + if (!__nodes_empty(&(node_online_map), (1 << 0))) + drain_array(); +} diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c index 89fd61d2405..94038573165 100644 --- a/gcc/tree-ssa-ifcombine.c +++ b/gcc/tree-ssa-ifcombine.c @@ -167,17 +167,22 @@ recognize_single_bit_test (tree cond_expr, tree *name, tree *bit) && integer_onep (TREE_OPERAND (t, 1)) && TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME) { - t = TREE_OPERAND (t, 0); + tree orig_name = TREE_OPERAND (t, 0); + + /* Look through copies and conversions to eventually + find the stmt that computes the shift. */ + t = orig_name; do { t = SSA_NAME_DEF_STMT (t); if (TREE_CODE (t) != GIMPLE_MODIFY_STMT) - return false; + break; t = GIMPLE_STMT_OPERAND (t, 1); if (TREE_CODE (t) == NOP_EXPR || TREE_CODE (t) == CONVERT_EXPR) t = TREE_OPERAND (t, 0); } while (TREE_CODE (t) == SSA_NAME); + /* If we found such, decompose it. */ if (TREE_CODE (t) == RSHIFT_EXPR) { /* op0 & (1 << op1) */ @@ -187,8 +192,8 @@ recognize_single_bit_test (tree cond_expr, tree *name, tree *bit) else { /* t & 1 */ - *bit = integer_one_node; - *name = t; + *bit = integer_zero_node; + *name = orig_name; } return true; -- 2.11.0