annotate gcc/testsuite/g++.dg/opt/pr23454-2.C @ 131:84e7813d76e9

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