OSDN Git Service

2008-09-09 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Sep 2008 10:05:49 +0000 (10:05 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Sep 2008 10:05:49 +0000 (10:05 +0000)
PR tree-optimization/37387
* tree-ssa-ifcombine.c (ifcombine_iforif): Convert the name
and bits to a common type.

* gcc.c-torture/compile/pr37387.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140142 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr37387.c [new file with mode: 0644]
gcc/tree-ssa-ifcombine.c

index 480ee53..c7848ff 100644 (file)
@@ -1,3 +1,9 @@
+2008-09-09  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/37387
+       * tree-ssa-ifcombine.c (ifcombine_iforif): Convert the name
+       and bits to a common type.
+
 2008-09-09  Nick Clifton  <nickc@redhat.com>
 
        * config/v850/v850.md (return): Restore frame size restriction.
index 02f9112..c83bb25 100644 (file)
@@ -1,3 +1,8 @@
+2008-09-09  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/37387
+       * gcc.c-torture/compile/pr37387.c: New testcase.
+
 2008-09-09  Daniel Kraft  <d@domob.eu>
 
        PR fortran/37411
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37387.c b/gcc/testsuite/gcc.c-torture/compile/pr37387.c
new file mode 100644 (file)
index 0000000..d338933
--- /dev/null
@@ -0,0 +1,11 @@
+typedef long int Int;
+void FuncMakeConsequencesPres (long *objDefs1)
+{
+  long a = (long)objDefs1;
+  int c = a & 0x01;
+  int b = 0;
+  if (!  ( 13 <= ( c ? 0 : (((int) objDefs1 & 0x02) ? 0 : *objDefs1  ))
+           && b <= 0))
+    ErrorQuit ();
+}
+
index a4a74ee..eedeb62 100644 (file)
@@ -440,6 +440,25 @@ ifcombine_iforif (basic_block inner_cond_bb, basic_block outer_cond_bb)
       else
        return false;
 
+      /* As we strip non-widening conversions in finding a common
+         name that is tested make sure to end up with an integral
+        type for building the bit operations.  */
+      if (TYPE_PRECISION (TREE_TYPE (bits1))
+         >= TYPE_PRECISION (TREE_TYPE (bits2)))
+       {
+         bits1 = fold_convert (unsigned_type_for (TREE_TYPE (bits1)), bits1);
+         name1 = fold_convert (TREE_TYPE (bits1), name1);
+         bits2 = fold_convert (unsigned_type_for (TREE_TYPE (bits2)), bits2);
+         bits2 = fold_convert (TREE_TYPE (bits1), bits2);
+       }
+      else
+       {
+         bits2 = fold_convert (unsigned_type_for (TREE_TYPE (bits2)), bits2);
+         name1 = fold_convert (TREE_TYPE (bits2), name1);
+         bits1 = fold_convert (unsigned_type_for (TREE_TYPE (bits1)), bits1);
+         bits1 = fold_convert (TREE_TYPE (bits2), bits1);
+       }
+
       /* Do it.  */
       gsi = gsi_for_stmt (inner_cond);
       t = fold_build2 (BIT_IOR_EXPR, TREE_TYPE (name1), bits1, bits2);