summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-11 19:01:45 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-11 19:01:45 +0000
commit8ce4be4f28eca025a154ab9f7cb0e7abf0428063 (patch)
tree8bbc42670a63b0e73732b6709a797d2a1c9b26a6
parenteedf016898325a97549b655f00e211e35bea49fd (diff)
downloadgcc-8ce4be4f28eca025a154ab9f7cb0e7abf0428063.tar.gz
PR rtl-optimization/23454
* reorg.c (relax_delay_slots): Update comment. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116088 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/reorg.c10
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/opt/pr23454-2.C106
4 files changed, 120 insertions, 5 deletions
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;
+ }
+}