diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f88a8bd9f4..e6a72d0a121 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-02-27 Andrew Pinski + + * c-typeck.c (tagged_types_tu_compatible_p) : + Speedup common case of the type values being in the same order. + 2004-02-27 Steve Ellcey * config/ia64/ia64.h (no-inline-float-divide): New option. diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index c10d3e07e7f..e44453af832 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -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;