diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 92fd1fe42f7..f90de87e9bc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2006-08-11 Eric Botcazou <ebotcazou@libertysurf.fr> + + PR rtl-optimization/23454 + * reorg.c (relax_delay_slots): Update comment. + 2006-08-11 Richard Guenther <rguenther@suse.de> PR middle-end/28651 diff --git a/gcc/reorg.c b/gcc/reorg.c index 7781d27606c..42ecda0db4c 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -3327,11 +3327,11 @@ relax_delay_slots (rtx first) continue; } - /* See if this jump (with its delay slots) branches around another - jump (without delay slots). If so, invert this jump and point - it to the target of the second jump. We cannot do this for - annulled jumps, though. Again, don't convert a jump to a RETURN - here. */ + /* See if this jump (with its delay slots) conditionally branches + around an unconditional jump (without delay slots). If so, invert + this jump and point it to the target of the second jump. We cannot + do this for annulled jumps, though. Again, don't convert a jump to + a RETURN here. */ if (! INSN_ANNULLED_BRANCH_P (delay_insn) && any_condjump_p (delay_insn) && next && JUMP_P (next) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3bc320f9690..07bd03df168 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-08-11 Eric Botcazou <ebotcazou@libertysurf.fr> + + * g++.dg/opt/pr23454-2.C: New test. + 2006-08-11 Richard Guenther <rguenther@suse.de> PR middle-end/28651 diff --git a/gcc/testsuite/g++.dg/opt/pr23454-2.C b/gcc/testsuite/g++.dg/opt/pr23454-2.C new file mode 100644 index 00000000000..bd5e9e99b14 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr23454-2.C @@ -0,0 +1,106 @@ +/* PR rtl-optimization/23454 */ +/* Submitted by Matthias Klose <doko@debian.org> */ + +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +typedef unsigned long long int ulonglong; +typedef long long int longlong; +typedef unsigned int uint32; +typedef unsigned int uint; +typedef unsigned long int ulong; + +class Item { +public: + bool null_value; + virtual longlong val_int()=0; +}; + +typedef struct st_tree_element { + struct st_tree_element *left,*right; + uint32 count; +} TREE_ELEMENT; + +typedef struct st_tree { + uint offset_to_key,elements_in_tree,size_of_element,memory_limit,allocated; + void *custom_arg; + bool with_delete; + uint flag; +} TREE; + +class field_info +{ +public: + ulong treemem, tree_elements, empty, nulls, min_length, max_length; + uint room_in_tree; + bool found; + TREE tree; + Item *item; +}; + +class field_ulonglong: public field_info +{ + ulonglong min_arg, max_arg; + ulonglong sum, sum_sqr; + void add(); +}; + +extern char *longlong10_to_str(longlong val,char *dst,int radix); +extern void delete_tree(TREE*); +extern TREE_ELEMENT *tree_insert(TREE *tree,void *custom_arg); + +static int compare_ulonglong(const ulonglong *s, const ulonglong *t) +{ + return ((*s < *t) ? -1 : *s > *t ? 1 : 0); +} + +void field_ulonglong::add() +{ + char buff[(255*3 +1)]; + longlong num = item->val_int(); + uint length = (uint) (longlong10_to_str(num, buff, 10) - buff); + TREE_ELEMENT *element; + + if (item->null_value) + { + nulls++; + return; + } + if (num == 0) + empty++; + + if (room_in_tree) + { + if (!(element = tree_insert(&tree, tree.custom_arg))) + { + room_in_tree = 0; + delete_tree(&tree); + } + else if (element->count == 1) + { + room_in_tree = 0; + delete_tree(&tree); + } + } + + if (!found) + { + found = 1; + min_arg = max_arg = sum = num; + sum_sqr = num * num; + min_length = max_length = length; + } + else if (num != 0) + { + sum += num; + sum_sqr += num * num; + if (length < min_length) + min_length = length; + if (length > max_length) + max_length = length; + if (compare_ulonglong((ulonglong*) &num, &min_arg) < 0) + min_arg = num; + if (compare_ulonglong((ulonglong*) &num, &max_arg) > 0) + max_arg = num; + } +}