re PR rtl-optimization/23454 (ICE in invert_exp_1, at jump.c:1719)

PR rtl-optimization/23454
	* reorg.c (relax_delay_slots): Update comment.

From-SVN: r116088
This commit is contained in:
Eric Botcazou 2006-08-11 21:01:45 +02:00 committed by Eric Botcazou
parent 4e571cd5ac
commit 105ebae827
4 changed files with 120 additions and 5 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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;
}
}