OSDN Git Service

2007-07-04 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Jul 2007 11:44:58 +0000 (11:44 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Jul 2007 11:44:58 +0000 (11:44 +0000)
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
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr32482.c [new file with mode: 0644]
gcc/tree-ssa-ifcombine.c

index a0768d7..a294920 100644 (file)
@@ -1,3 +1,10 @@
+2007-07-04  Richard Guenther  <rguenther@suse.de>
+
+       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  <richard@codesourcery.com>
 
        * config/sh/lib1funcs.asm (ic_invalidate): Align constant pool.
index 0c96acb..a0c0745 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-04  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/32482
+       * gcc.c-torture/compile/pr32482.c: New testcase.
+
 2007-07-04  Richard Sandiford  <richard@codesourcery.com>
 
        * 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 (file)
index 0000000..9f0e3bf
--- /dev/null
@@ -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();
+}
index 89fd61d..9403857 100644 (file)
@@ -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;