1 /* PR rtl-optimization/23454 */
2 /* Submitted by Matthias Klose <doko@debian.org> */
3 
4 /* { dg-do compile } */
5 /* { dg-options "-O3" } */
6 
7 typedef unsigned long long int ulonglong;
8 typedef long long int longlong;
9 typedef unsigned int uint32;
10 typedef unsigned int uint;
11 typedef unsigned long int ulong;
12 
13 class Item {
14 public:
15   bool null_value;
16   virtual longlong val_int()=0;
17 };
18 
19 typedef struct st_tree_element {
20   struct st_tree_element *left,*right;
21   uint32 count;
22 } TREE_ELEMENT;
23 
24 typedef struct st_tree {
25   uint offset_to_key,elements_in_tree,size_of_element,memory_limit,allocated;
26   void *custom_arg;
27   bool with_delete;
28   uint flag;
29 } TREE;
30 
31 class field_info
32 {
33 public:
34   ulong treemem, tree_elements, empty, nulls, min_length, max_length;
35   uint room_in_tree;
36   bool found;
37   TREE tree;
38   Item *item;
39 };
40 
41 class field_ulonglong: public field_info
42 {
43   ulonglong min_arg, max_arg;
44   ulonglong sum, sum_sqr;
45   void add();
46 };
47 
48 extern char *longlong10_to_str(longlong val,char *dst,int radix);
49 extern void delete_tree(TREE*);
50 extern TREE_ELEMENT *tree_insert(TREE *tree,void *custom_arg);
51 
compare_ulonglong(const ulonglong * s,const ulonglong * t)52 static int compare_ulonglong(const ulonglong *s, const ulonglong *t)
53 {
54   return ((*s < *t) ? -1 : *s > *t ? 1 : 0);
55 }
56 
add()57 void field_ulonglong::add()
58 {
59   char buff[(255*3 +1)];
60   longlong num = item->val_int();
61   uint length = (uint) (longlong10_to_str(num, buff, 10) - buff);
62   TREE_ELEMENT *element;
63 
64   if (item->null_value)
65   {
66     nulls++;
67     return;
68   }
69   if (num == 0)
70     empty++;
71 
72   if (room_in_tree)
73   {
74     if (!(element = tree_insert(&tree, tree.custom_arg)))
75     {
76       room_in_tree = 0;
77       delete_tree(&tree);
78     }
79     else if (element->count == 1)
80     {
81       room_in_tree = 0;
82       delete_tree(&tree);
83     }
84   }
85 
86   if (!found)
87   {
88     found = 1;
89     min_arg = max_arg = sum = num;
90     sum_sqr = num * num;
91     min_length = max_length = length;
92   }
93   else if (num != 0)
94   {
95     sum += num;
96     sum_sqr += num * num;
97     if (length < min_length)
98       min_length = length;
99     if (length > max_length)
100       max_length = length;
101     if (compare_ulonglong((ulonglong*) &num, &min_arg) < 0)
102       min_arg = num;
103     if (compare_ulonglong((ulonglong*) &num, &max_arg) > 0)
104       max_arg = num;
105   }
106 }
107