From 2ba5b7632104872ea0283683c8dba28be2458a7b Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Sun, 28 Jun 2009 18:17:47 +0000 Subject: [PATCH] * fold-const.c (contains_label_1): Fix comments. (contains_label_p): Do not walk trees multiple time. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149037 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 ++++ gcc/fold-const.c | 23 ++++++++-------- gcc/testsuite/ChangeLog | 7 +++++ gcc/testsuite/gnat.dg/namet.ads | 11 ++++++++ .../{test_overflow_sum.adb => overflow_sum.adb} | 6 ++-- gcc/testsuite/gnat.dg/overflow_sum2.adb | 32 ++++++++++++++++++++++ 6 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/namet.ads rename gcc/testsuite/gnat.dg/{test_overflow_sum.adb => overflow_sum.adb} (95%) create mode 100644 gcc/testsuite/gnat.dg/overflow_sum2.adb diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 436ea0d..1c9a1c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-06-28 Eric Botcazou + + * fold-const.c (contains_label_1): Fix comments. + (contains_label_p): Do not walk trees multiple time. + 2009-06-28 Paolo Bonzini * config/i386/i386.h (enum ix86_fpcmp_strategy): New. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 433ec60..39548e2 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -13225,35 +13225,36 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) } /* switch (code) */ } -/* Callback for walk_tree, looking for LABEL_EXPR. - Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE. - Do not check the sub-tree of GOTO_EXPR. */ +/* Callback for walk_tree, looking for LABEL_EXPR. Return *TP if it is + a LABEL_EXPR; otherwise return NULL_TREE. Do not check the subtrees + of GOTO_EXPR. */ static tree -contains_label_1 (tree *tp, - int *walk_subtrees, - void *data ATTRIBUTE_UNUSED) +contains_label_1 (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) { switch (TREE_CODE (*tp)) { case LABEL_EXPR: return *tp; + case GOTO_EXPR: *walk_subtrees = 0; - /* no break */ + + /* ... fall through ... */ + default: return NULL_TREE; } } -/* Checks whether the sub-tree ST contains a label LABEL_EXPR which is - accessible from outside the sub-tree. Returns NULL_TREE if no - addressable label is found. */ +/* Return whether the sub-tree ST contains a label which is accessible from + outside the sub-tree. */ static bool contains_label_p (tree st) { - return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE); + return + (walk_tree_without_duplicates (&st, contains_label_1 , NULL) != NULL_TREE); } /* Fold a ternary expression of code CODE and type TYPE with operands diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ce26ed9..32acab3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-06-28 Eric Botcazou + + * gnat.dg/overflow_sum2.adb: New test + * gnat.dg/namet.ads: New helper. + + * gnat.dg/test_overflow_sum.adb: Rename to overflow_sum.adb. + 2009-06-28 Tobias Burnus PR fortran/34112 diff --git a/gcc/testsuite/gnat.dg/namet.ads b/gcc/testsuite/gnat.dg/namet.ads new file mode 100644 index 0000000..01e4002 --- /dev/null +++ b/gcc/testsuite/gnat.dg/namet.ads @@ -0,0 +1,11 @@ +package Namet is + + Hash_Num : constant Integer := 2**12; + + subtype Hash_Index_Type is Integer range 0 .. Hash_Num - 1; + + Name_Buffer : String (1 .. 16*1024); + + Name_Len : Natural; + +end Namet; diff --git a/gcc/testsuite/gnat.dg/test_overflow_sum.adb b/gcc/testsuite/gnat.dg/overflow_sum.adb similarity index 95% rename from gcc/testsuite/gnat.dg/test_overflow_sum.adb rename to gcc/testsuite/gnat.dg/overflow_sum.adb index fc70ac7..56d8fe9 100644 --- a/gcc/testsuite/gnat.dg/test_overflow_sum.adb +++ b/gcc/testsuite/gnat.dg/overflow_sum.adb @@ -1,8 +1,8 @@ -- { dg-do run } -- { dg-options "-gnato" } -procedure test_overflow_sum is - pragma Unsuppress (Overflow_Check); +procedure Overflow_Sum is + function sum (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z : Integer) return Integer @@ -42,4 +42,4 @@ begin exception when Constraint_Error => null; end; -end test_overflow_sum; +end; diff --git a/gcc/testsuite/gnat.dg/overflow_sum2.adb b/gcc/testsuite/gnat.dg/overflow_sum2.adb new file mode 100644 index 0000000..8374eee --- /dev/null +++ b/gcc/testsuite/gnat.dg/overflow_sum2.adb @@ -0,0 +1,32 @@ +-- { dg-do compile } +-- { dg-options "-gnato" } + +with Namet; use Namet; + +function Overflow_Sum2 return Hash_Index_Type is + + Even_Name_Len : Integer; + +begin + + if Name_Len > 12 then + Even_Name_Len := (Name_Len) / 2 * 2; + + return (((((((((((( + Character'Pos (Name_Buffer (01))) * 2 + + Character'Pos (Name_Buffer (Even_Name_Len - 10))) * 2 + + Character'Pos (Name_Buffer (03))) * 2 + + Character'Pos (Name_Buffer (Even_Name_Len - 08))) * 2 + + Character'Pos (Name_Buffer (05))) * 2 + + Character'Pos (Name_Buffer (Even_Name_Len - 06))) * 2 + + Character'Pos (Name_Buffer (07))) * 2 + + Character'Pos (Name_Buffer (Even_Name_Len - 04))) * 2 + + Character'Pos (Name_Buffer (09))) * 2 + + Character'Pos (Name_Buffer (Even_Name_Len - 02))) * 2 + + Character'Pos (Name_Buffer (11))) * 2 + + Character'Pos (Name_Buffer (Even_Name_Len))) mod Hash_Num; + end if; + + return 0; + +end; -- 2.7.4