annotate gcc/tree-vector-builder.c @ 143:76e1cf5455ef

add cbc_gc test
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 19:24:05 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* A class for building vector tree constants.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 Copyright (C) 2017-2018 Free Software Foundation, Inc.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 This file is part of GCC.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 version.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 for more details.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 #include "config.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 #include "system.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 #include "coretypes.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 #include "tree.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 #include "fold-const.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 #include "tree-vector-builder.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 /* Try to start building a new vector of type TYPE that holds the result of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 a unary operation on VECTOR_CST T. ALLOW_STEPPED_P is true if the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 operation can handle stepped encodings directly, without having to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 expand the full sequence.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 Return true if the operation is possible, which it always is when
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 ALLOW_STEPPED_P is true. Leave the builder unchanged otherwise. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 bool
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 tree_vector_builder::new_unary_operation (tree type, tree t,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 bool allow_stepped_p)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 poly_uint64 full_nelts = TYPE_VECTOR_SUBPARTS (type);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 gcc_assert (known_eq (full_nelts, TYPE_VECTOR_SUBPARTS (TREE_TYPE (t))));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 unsigned int npatterns = VECTOR_CST_NPATTERNS (t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 unsigned int nelts_per_pattern = VECTOR_CST_NELTS_PER_PATTERN (t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 if (!allow_stepped_p && nelts_per_pattern > 2)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 if (!full_nelts.is_constant ())
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 return false;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 npatterns = full_nelts.to_constant ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 nelts_per_pattern = 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 new_vector (type, npatterns, nelts_per_pattern);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 return true;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 /* Try to start building a new vector of type TYPE that holds the result of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 a binary operation on VECTOR_CSTs T1 and T2. ALLOW_STEPPED_P is true if
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 the operation can handle stepped encodings directly, without having to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 expand the full sequence.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 Return true if the operation is possible. Leave the builder unchanged
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 otherwise. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 bool
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 tree_vector_builder::new_binary_operation (tree type, tree t1, tree t2,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 bool allow_stepped_p)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 poly_uint64 full_nelts = TYPE_VECTOR_SUBPARTS (type);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 gcc_assert (known_eq (full_nelts, TYPE_VECTOR_SUBPARTS (TREE_TYPE (t1)))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 && known_eq (full_nelts, TYPE_VECTOR_SUBPARTS (TREE_TYPE (t2))));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 /* Conceptually we split the patterns in T1 and T2 until we have
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 an equal number for both. Each split pattern requires the same
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 number of elements per pattern as the original. E.g. splitting:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 { 1, 2, 3, ... }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 into two gives:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 { 1, 3, 5, ... }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 { 2, 4, 6, ... }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 while splitting:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 { 1, 0, ... }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 into two gives:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 { 1, 0, ... }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 { 0, 0, ... }. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 unsigned int npatterns = least_common_multiple (VECTOR_CST_NPATTERNS (t1),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 VECTOR_CST_NPATTERNS (t2));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 unsigned int nelts_per_pattern = MAX (VECTOR_CST_NELTS_PER_PATTERN (t1),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 VECTOR_CST_NELTS_PER_PATTERN (t2));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 if (!allow_stepped_p && nelts_per_pattern > 2)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 if (!full_nelts.is_constant ())
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 return false;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 npatterns = full_nelts.to_constant ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 nelts_per_pattern = 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 new_vector (type, npatterns, nelts_per_pattern);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 return true;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 /* Return the number of elements that the caller needs to operate on in
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 order to handle a binary operation on VECTOR_CSTs T1 and T2. This static
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 function is used instead of new_binary_operation if the result of the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 operation is not a VECTOR_CST. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 unsigned int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 tree_vector_builder::binary_encoded_nelts (tree t1, tree t2)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 poly_uint64 nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (t1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 gcc_assert (known_eq (nelts, TYPE_VECTOR_SUBPARTS (TREE_TYPE (t2))));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 /* See new_binary_operation for details. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 unsigned int npatterns = least_common_multiple (VECTOR_CST_NPATTERNS (t1),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 VECTOR_CST_NPATTERNS (t2));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 unsigned int nelts_per_pattern = MAX (VECTOR_CST_NELTS_PER_PATTERN (t1),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 VECTOR_CST_NELTS_PER_PATTERN (t2));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 unsigned HOST_WIDE_INT const_nelts;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 if (nelts.is_constant (&const_nelts))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 return MIN (npatterns * nelts_per_pattern, const_nelts);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 return npatterns * nelts_per_pattern;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 /* Return a vector element with the value BASE + FACTOR * STEP. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 tree
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 tree_vector_builder::apply_step (tree base, unsigned int factor,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 const wide_int &step) const
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 return wide_int_to_tree (TREE_TYPE (base),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 wi::to_wide (base) + factor * step);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134 /* Return a VECTOR_CST for the current constant. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 tree
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 tree_vector_builder::build ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 finalize ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 gcc_assert (pow2p_hwi (npatterns ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 tree v = make_vector (exact_log2 (npatterns ()), nelts_per_pattern ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 TREE_TYPE (v) = m_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 memcpy (VECTOR_CST_ENCODED_ELTS (v), address (),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 encoded_nelts () * sizeof (tree));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 return v;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 }