c-typeck.c (convert_for_assignment): Use vector_targets_convertible_p.
authorDaniel Jacobowitz <dan@codesourcery.com>
Tue, 1 Jul 2008 20:48:59 +0000 (20:48 +0000)
committerDaniel Jacobowitz <drow@gcc.gnu.org>
Tue, 1 Jul 2008 20:48:59 +0000 (20:48 +0000)
* c-typeck.c (convert_for_assignment): Use
vector_targets_convertible_p.
* c-common.c (vector_targets_convertible_p): New.
* c-common.h (vector_targets_convertible_p): New prototype.
* config/rs6000/rs6000.c (rs6000_is_opaque_type): Do not check
opaque_p_V2SI_type_node.

* typeck.c (comp_ptr_ttypes_real): Use vector_targets_convertible_p.
(comp_ptr_ttypes_const): Likewise.

* g++.dg/other/opaque-1.C, g++.dg/other/opaque-2.C,
g++.dg/other/opaque-3.C: Also run on powerpc*-*-linux*spe*.

From-SVN: r137325

gcc/ChangeLog
gcc/c-common.c
gcc/c-common.h
gcc/c-typeck.c
gcc/config/rs6000/rs6000.c
gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/opaque-1.C
gcc/testsuite/g++.dg/other/opaque-2.C
gcc/testsuite/g++.dg/other/opaque-3.C

index 96c684b942b1d5a0c1d94e280411d91d33ab8735..1e258ac1739df40e1f3794e46d97c39510852b9e 100644 (file)
@@ -1,3 +1,12 @@
+2008-07-01  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * c-typeck.c (convert_for_assignment): Use
+       vector_targets_convertible_p.
+       * c-common.c (vector_targets_convertible_p): New.
+       * c-common.h (vector_targets_convertible_p): New prototype.
+       * config/rs6000/rs6000.c (rs6000_is_opaque_type): Do not check
+       opaque_p_V2SI_type_node.
+
 2008-07-01  Steve Ellcey  <sje@cup.hp.com>
 
        * config/ia64/ia64.c (ia64_cannot_force_const_mem): Do not allow
index 7bb614971d77c098cfd7181b20757ec318fb8033..31c778c88b4807dff9b1bec62e3b119ad5a006fa 100644 (file)
@@ -1207,6 +1207,20 @@ check_main_parameter_types (tree decl)
    pedwarn ("%q+D takes only zero or two arguments", decl);
 }
 
+/* True if pointers to distinct types T1 and T2 can be converted to
+   each other without an explicit cast.  Only returns true for opaque
+   vector types.  */
+bool
+vector_targets_convertible_p (const_tree t1, const_tree t2)
+{
+  if (TREE_CODE (t1) == VECTOR_TYPE && TREE_CODE (t2) == VECTOR_TYPE
+      && (targetm.vector_opaque_p (t1) || targetm.vector_opaque_p (t2))
+      && tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2)))
+    return true;
+
+  return false;
+}
+
 /* True if vector types T1 and T2 can be converted to each other
    without an explicit cast.  If EMIT_LAX_NOTE is true, and T1 and T2
    can only be converted with -flax-vector-conversions yet that is not
index 3ddb44bd8d665d7ea59984d4317494261515e28e..7fd2242c35220951e965ceb350e80de45d0061bc 100644 (file)
@@ -824,6 +824,7 @@ extern tree finish_label_address_expr (tree);
 extern tree lookup_label (tree);
 extern tree lookup_name (tree);
 
+extern bool vector_targets_convertible_p (const_tree t1, const_tree t2);
 extern bool vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note);
 
 extern rtx c_expand_expr (tree, rtx, enum machine_mode, int, rtx *);
index d5a549c94782a1ec6674fb34647f19bcd2e6a37e..6b7594e6a260bff6b63e33d6303bd1299bee95a9 100644 (file)
@@ -4196,10 +4196,7 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
       if (TREE_CODE (mvr) != ARRAY_TYPE)
        mvr = TYPE_MAIN_VARIANT (mvr);
       /* Opaque pointers are treated like void pointers.  */
-      is_opaque_pointer = (targetm.vector_opaque_p (type)
-                          || targetm.vector_opaque_p (rhstype))
-       && TREE_CODE (ttl) == VECTOR_TYPE
-       && TREE_CODE (ttr) == VECTOR_TYPE;
+      is_opaque_pointer = vector_targets_convertible_p (ttl, ttr);
 
       /* C++ does not allow the implicit conversion void* -> T*.  However,
         for the purpose of reducing the number of false positives, we
index 4833ad76d9144888580ad41778d02a791210b0f9..214b6922b5cbc4a693266a0f6ddae42734f387a4 100644 (file)
@@ -22332,7 +22332,6 @@ rs6000_is_opaque_type (const_tree type)
 {
   return (type == opaque_V2SI_type_node
              || type == opaque_V2SF_type_node
-             || type == opaque_p_V2SI_type_node
              || type == opaque_V4SI_type_node);
 }
 
index c9b04e3e2f287a6a788ddb14e104e552857dbd1e..8aff706f9db9318f754995f93565cec8468dec74 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-01  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * typeck.c (comp_ptr_ttypes_real): Use vector_targets_convertible_p.
+       (comp_ptr_ttypes_const): Likewise.
+
 2008-07-01  Andrew Haley  <aph@redhat.com>
 
        * decl.c (finish_constructor_body): Don't set the return value of
index e34fa675b9f7e55a51411b0d77ce20642e54daa0..14cbd9d8dd2731484c9241aaec8ff7abc0d0840d 100644 (file)
@@ -7164,6 +7164,7 @@ static int
 comp_ptr_ttypes_real (tree to, tree from, int constp)
 {
   bool to_more_cv_qualified = false;
+  bool is_opaque_pointer = false;
 
   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
     {
@@ -7198,9 +7199,13 @@ comp_ptr_ttypes_real (tree to, tree from, int constp)
            constp &= TYPE_READONLY (to);
        }
 
+      if (TREE_CODE (to) == VECTOR_TYPE)
+       is_opaque_pointer = vector_targets_convertible_p (to, from);
+
       if (TREE_CODE (to) != POINTER_TYPE && !TYPE_PTRMEM_P (to))
        return ((constp >= 0 || to_more_cv_qualified)
-               && same_type_ignoring_top_level_qualifiers_p (to, from));
+               && (is_opaque_pointer
+                   || same_type_ignoring_top_level_qualifiers_p (to, from)));
     }
 }
 
@@ -7261,6 +7266,8 @@ ptr_reasonably_similar (const_tree to, const_tree from)
 bool
 comp_ptr_ttypes_const (tree to, tree from)
 {
+  bool is_opaque_pointer = false;
+
   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
     {
       if (TREE_CODE (to) != TREE_CODE (from))
@@ -7271,8 +7278,12 @@ comp_ptr_ttypes_const (tree to, tree from)
                          TYPE_OFFSET_BASETYPE (to)))
          continue;
 
+      if (TREE_CODE (to) == VECTOR_TYPE)
+       is_opaque_pointer = vector_targets_convertible_p (to, from);
+
       if (TREE_CODE (to) != POINTER_TYPE)
-       return same_type_ignoring_top_level_qualifiers_p (to, from);
+       return (is_opaque_pointer
+               || same_type_ignoring_top_level_qualifiers_p (to, from));
     }
 }
 
index 0d48ea94e89c6da02fbf7ceb5dd3b8025c5d9d74..d52e4737b78b2f3cc3fba93532a6496d25904095 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-01  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * g++.dg/other/opaque-1.C, g++.dg/other/opaque-2.C,
+       g++.dg/other/opaque-3.C: Also run on powerpc*-*-linux*spe*.
+
 2008-07-01  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.target/i386/quad-sse.c: New test.
index ad79bfa21b6f4cdde3475edc09468100de84de26..ae1d76f3f7f07902f944a07786fc7ae627b04ce0 100644 (file)
@@ -1,4 +1,4 @@
-/* { dg-do run { target powerpc-*-eabispe* } } */
+/* { dg-do run { target powerpc-*-eabispe* powerpc*-*-linux*spe* } } */
 
 #define __vector __attribute__((vector_size(8)))
 typedef float __vector __ev64_fs__;
index efe04e3df1bc946c03b5cb3f30c5f5cd5ea584ae..9a9b1b464043d77e1eacdcb339a5bd3e2d26fa9f 100644 (file)
@@ -1,4 +1,4 @@
-/* { dg-do compile { target powerpc-*-eabi* } } */
+/* { dg-do compile { target powerpc-*-eabi* powerpc*-*-linux*spe* } } */
 /* { dg-options "-mcpu=8540 -mabi=spe" } */
 
 #define __vector __attribute__((vector_size(8)))
index 18ed0bee5363abb63bc87d4e95ef2dcdea12316d..8cba875fd9b0b8692ff4cb8022d504f015969c5d 100644 (file)
@@ -1,4 +1,4 @@
-/* { dg-do compile { target powerpc-*-eabi* } } */
+/* { dg-do compile { target powerpc-*-eabi* powerpc*-*-linux*spe* } } */
 /* { dg-options "-mcpu=8540 -mabi=spe" } */
 
 __ev64_opaque__ o;