]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/21850 (misscompiling comparision from vector to integer)
authorJakub Jelinek <jakub@redhat.com>
Thu, 16 Jun 2005 23:19:58 +0000 (01:19 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 16 Jun 2005 23:19:58 +0000 (01:19 +0200)
PR middle-end/21850
* tree.c (get_unwidened): Stop at NOP_EXPR/CONVERT_EXPR that convert
from vector types.

* gcc.c-torture/execute/20050607-1.c: New test.

From-SVN: r101111

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/tree.c

index 18acf7a6cef5ecc141e0ad45f3835c3bfd7d628e..cb96c060aeef0f0f24c7ff744efacc691d5b3688 100644 (file)
@@ -1,3 +1,9 @@
+2005-06-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/21850
+       * tree.c (get_unwidened): Stop at NOP_EXPR/CONVERT_EXPR that convert
+       from vector types.
+
 2005-06-14  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/22043
index 05961d06007a7166242c9c133b0b1d0d247fe340..eaaf133168d234e03750cbe97292cd9507ceefed 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/21850
+       * gcc.c-torture/execute/20050607-1.c: New test.
+
 2005-06-17  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR libfortran/19216
index 5603e7d1a3e5ada6fd3b59a0a9eb3e65d85705c9..b43277f0e287c99b7db0d8a622c49e78d82230d8 100644 (file)
@@ -4733,9 +4733,16 @@ get_unwidened (tree op, tree for_type)
   while (TREE_CODE (op) == NOP_EXPR
         || TREE_CODE (op) == CONVERT_EXPR)
     {
-      int bitschange
-       = TYPE_PRECISION (TREE_TYPE (op))
-         - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0)));
+      int bitschange;
+
+      /* TYPE_PRECISION on vector types has different meaning
+        (TYPE_VECTOR_SUBPARTS) and casts from vectors are view conversions,
+        so avoid them here.  */
+      if (TREE_CODE (TREE_TYPE (TREE_OPERAND (op, 0))) == VECTOR_TYPE)
+       break;
+
+      bitschange = TYPE_PRECISION (TREE_TYPE (op))
+                  - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0)));
 
       /* Truncations are many-one so cannot be removed.
         Unless we are later going to truncate down even farther.  */