Commit 105ebae8 by Eric Botcazou Committed by Eric Botcazou

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
parent 4e571cd5
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> 2006-08-11 Richard Guenther <rguenther@suse.de>
PR middle-end/28651 PR middle-end/28651
......
...@@ -3327,11 +3327,11 @@ relax_delay_slots (rtx first) ...@@ -3327,11 +3327,11 @@ relax_delay_slots (rtx first)
continue; continue;
} }
/* See if this jump (with its delay slots) branches around another /* See if this jump (with its delay slots) conditionally branches
jump (without delay slots). If so, invert this jump and point around an unconditional jump (without delay slots). If so, invert
it to the target of the second jump. We cannot do this for this jump and point it to the target of the second jump. We cannot
annulled jumps, though. Again, don't convert a jump to a RETURN do this for annulled jumps, though. Again, don't convert a jump to
here. */ a RETURN here. */
if (! INSN_ANNULLED_BRANCH_P (delay_insn) if (! INSN_ANNULLED_BRANCH_P (delay_insn)
&& any_condjump_p (delay_insn) && any_condjump_p (delay_insn)
&& next && JUMP_P (next) && next && JUMP_P (next)
......
2006-08-11 Eric Botcazou <ebotcazou@libertysurf.fr>
* g++.dg/opt/pr23454-2.C: New test.
2006-08-11 Richard Guenther <rguenther@suse.de> 2006-08-11 Richard Guenther <rguenther@suse.de>
PR middle-end/28651 PR middle-end/28651
/* 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;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment