]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c-typeck.c (tagged_types_tu_compatible_p): Speedup common case of the type values...
authorAndrew Pinski <apinski@apple.com>
Fri, 27 Feb 2004 22:33:02 +0000 (22:33 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Fri, 27 Feb 2004 22:33:02 +0000 (14:33 -0800)
* c-typeck.c (tagged_types_tu_compatible_p) <ENUMERAL_TYPE>:
Speedup common case of the type values being in the same order.

From-SVN: r78585

gcc/ChangeLog
gcc/c-typeck.c

index 4f88a8bd9f4e5b94503eac32bb04151ae8777c7c..e6a72d0a12170501ff19d789a00e6c7dcb9fc677 100644 (file)
@@ -1,3 +1,8 @@
+2004-02-27  Andrew Pinski  <apinski@apple.com>
+
+       * c-typeck.c (tagged_types_tu_compatible_p) <ENUMERAL_TYPE>:
+       Speedup common case of the type values being in the same order.
+
 2004-02-27  Steve Ellcey  <sje@cup.hp.com>
 
        * config/ia64/ia64.h (no-inline-float-divide): New option.
index c10d3e07e7f4c06c2d56a6c9a2d5b4d9b117446a..e44453af83295334275318d1fef215a5ac1f9bcf 100644 (file)
@@ -701,6 +701,27 @@ tagged_types_tu_compatible_p (tree t1, tree t2, int flags)
     {
     case ENUMERAL_TYPE:
       {
+      
+        /* Speed up the case where the type values are in the same order. */
+        tree tv1 = TYPE_VALUES (t1);
+        tree tv2 = TYPE_VALUES (t2);
+        
+        if (tv1 == tv2)
+          return 1;
+        
+        for (;tv1 && tv2; tv1 = TREE_CHAIN (tv2), tv2 = TREE_CHAIN (tv2))
+          {
+            if (TREE_PURPOSE (tv1) != TREE_PURPOSE (tv1))
+              break;
+            if (simple_cst_equal (TREE_VALUE (tv1), TREE_VALUE (tv2)) != 1)
+              return 0;
+          }
+        
+        if (tv1 == NULL_TREE && tv2 == NULL_TREE)
+          return 1;
+        if (tv1 == NULL_TREE || tv2 == NULL_TREE)
+          return 0;
+        
        if (list_length (TYPE_VALUES (t1)) != list_length (TYPE_VALUES (t2)))
          return 0;