]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree.c (build_opaque_vector_type): Make opaque vectors variant types of the correspon...
authorRichard Guenther <rguenther@suse.de>
Thu, 29 Sep 2011 11:26:46 +0000 (11:26 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 29 Sep 2011 11:26:46 +0000 (11:26 +0000)
2011-09-29  Richard Guenther  <rguenther@suse.de>

* tree.c (build_opaque_vector_type): Make opaque vectors
variant types of the corresponding non-opaque type.  Make
sure to share opaque vector types properly.

From-SVN: r179341

gcc/ChangeLog
gcc/tree.c

index 972e1f9e337ff3308e5826e34229a0a54f3a9b4d..30fa460b1395ec16489635d6fb2173b0620f1df7 100644 (file)
@@ -1,3 +1,9 @@
+2011-09-29  Richard Guenther  <rguenther@suse.de>
+
+       * tree.c (build_opaque_vector_type): Make opaque vectors
+       variant types of the corresponding non-opaque type.  Make
+       sure to share opaque vector types properly.
+
 2011-09-29  David S. Miller  <davem@davemloft.net>
 
        * config/sparc/sparc.md (UNSPEC_ARRAY8, UNSPEC_ARRAY16,
index a53c9f432eef43805a00e41da99f18cf169e518c..bcdda5034aa7f4822cdd9a17afa665fb21e78b3d 100644 (file)
@@ -9752,17 +9752,29 @@ build_vector_type (tree innertype, int nunits)
   return make_vector_type (innertype, nunits, VOIDmode);
 }
 
-/* Similarly, but takes the inner type and number of units, which must be
-   a power of two.  */
+/* Similarly, but builds a variant type with TYPE_VECTOR_OPAQUE set.  */
 
 tree
 build_opaque_vector_type (tree innertype, int nunits)
 {
-  tree t;
-  innertype = build_distinct_type_copy (innertype);
-  t = make_vector_type (innertype, nunits, VOIDmode);
-  TYPE_VECTOR_OPAQUE (t) = true;
-  return t;
+  tree t = make_vector_type (innertype, nunits, VOIDmode);
+  tree cand;
+  /* We always build the non-opaque variant before the opaque one,
+     so if it already exists, it is TYPE_NEXT_VARIANT of this one.  */
+  cand = TYPE_NEXT_VARIANT (t);
+  if (cand
+      && TYPE_VECTOR_OPAQUE (cand)
+      && check_qualified_type (cand, t, TYPE_QUALS (t)))
+    return cand;
+  /* Othewise build a variant type and make sure to queue it after
+     the non-opaque type.  */
+  cand = build_distinct_type_copy (t);
+  TYPE_VECTOR_OPAQUE (cand) = true;
+  TYPE_CANONICAL (cand) = TYPE_CANONICAL (t);
+  TYPE_NEXT_VARIANT (cand) = TYPE_NEXT_VARIANT (t);
+  TYPE_NEXT_VARIANT (t) = cand;
+  TYPE_MAIN_VARIANT (cand) = TYPE_MAIN_VARIANT (t);
+  return cand;
 }