annotate gcc/value-prof.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Transformations based on profile information for values.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2003-2020 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "coretypes.h"
111
kono
parents: 67
diff changeset
23 #include "backend.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "rtl.h"
111
kono
parents: 67
diff changeset
25 #include "tree.h"
kono
parents: 67
diff changeset
26 #include "gimple.h"
kono
parents: 67
diff changeset
27 #include "cfghooks.h"
kono
parents: 67
diff changeset
28 #include "ssa.h"
kono
parents: 67
diff changeset
29 #include "cgraph.h"
kono
parents: 67
diff changeset
30 #include "coverage.h"
kono
parents: 67
diff changeset
31 #include "data-streamer.h"
kono
parents: 67
diff changeset
32 #include "diagnostic.h"
kono
parents: 67
diff changeset
33 #include "fold-const.h"
kono
parents: 67
diff changeset
34 #include "tree-nested.h"
kono
parents: 67
diff changeset
35 #include "calls.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 #include "expr.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 #include "value-prof.h"
111
kono
parents: 67
diff changeset
38 #include "tree-eh.h"
kono
parents: 67
diff changeset
39 #include "gimplify.h"
kono
parents: 67
diff changeset
40 #include "gimple-iterator.h"
kono
parents: 67
diff changeset
41 #include "tree-cfg.h"
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
42 #include "gimple-pretty-print.h"
111
kono
parents: 67
diff changeset
43 #include "dumpfile.h"
kono
parents: 67
diff changeset
44 #include "builtins.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 /* In this file value profile based optimizations are placed. Currently the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 following optimizations are implemented (for more detailed descriptions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 see comments at value_profile_transformations):
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 1) Division/modulo specialization. Provided that we can determine that the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 operands of the division have some special properties, we may use it to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 produce more effective code.
111
kono
parents: 67
diff changeset
53
kono
parents: 67
diff changeset
54 2) Indirect/virtual call specialization. If we can determine most
kono
parents: 67
diff changeset
55 common function callee in indirect/virtual call. We can use this
kono
parents: 67
diff changeset
56 information to improve code effectiveness (especially info for
kono
parents: 67
diff changeset
57 the inliner).
kono
parents: 67
diff changeset
58
kono
parents: 67
diff changeset
59 3) Speculative prefetching. If we are able to determine that the difference
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 between addresses accessed by a memory reference is usually constant, we
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 may add the prefetch instructions.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 FIXME: This transformation was removed together with RTL based value
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 profiling.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
111
kono
parents: 67
diff changeset
65
kono
parents: 67
diff changeset
66 Value profiling internals
kono
parents: 67
diff changeset
67 ==========================
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
111
kono
parents: 67
diff changeset
69 Every value profiling transformation starts with defining what values
kono
parents: 67
diff changeset
70 to profile. There are different histogram types (see HIST_TYPE_* in
kono
parents: 67
diff changeset
71 value-prof.h) and each transformation can request one or more histogram
kono
parents: 67
diff changeset
72 types per GIMPLE statement. The function gimple_find_values_to_profile()
kono
parents: 67
diff changeset
73 collects the values to profile in a vec, and adds the number of counters
kono
parents: 67
diff changeset
74 required for the different histogram types.
kono
parents: 67
diff changeset
75
kono
parents: 67
diff changeset
76 For a -fprofile-generate run, the statements for which values should be
kono
parents: 67
diff changeset
77 recorded, are instrumented in instrument_values(). The instrumentation
kono
parents: 67
diff changeset
78 is done by helper functions that can be found in tree-profile.c, where
kono
parents: 67
diff changeset
79 new types of histograms can be added if necessary.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
111
kono
parents: 67
diff changeset
81 After a -fprofile-use, the value profiling data is read back in by
kono
parents: 67
diff changeset
82 compute_value_histograms() that translates the collected data to
kono
parents: 67
diff changeset
83 histograms and attaches them to the profiled statements via
kono
parents: 67
diff changeset
84 gimple_add_histogram_value(). Histograms are stored in a hash table
kono
parents: 67
diff changeset
85 that is attached to every intrumented function, see VALUE_HISTOGRAMS
kono
parents: 67
diff changeset
86 in function.h.
kono
parents: 67
diff changeset
87
kono
parents: 67
diff changeset
88 The value-profile transformations driver is the function
kono
parents: 67
diff changeset
89 gimple_value_profile_transformations(). It traverses all statements in
kono
parents: 67
diff changeset
90 the to-be-transformed function, and looks for statements with one or
kono
parents: 67
diff changeset
91 more histograms attached to it. If a statement has histograms, the
kono
parents: 67
diff changeset
92 transformation functions are called on the statement.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93
111
kono
parents: 67
diff changeset
94 Limitations / FIXME / TODO:
kono
parents: 67
diff changeset
95 * Only one histogram of each type can be associated with a statement.
kono
parents: 67
diff changeset
96 * Some value profile transformations are done in builtins.c (?!)
kono
parents: 67
diff changeset
97 * Updating of histograms needs some TLC.
kono
parents: 67
diff changeset
98 * The value profiling code could be used to record analysis results
kono
parents: 67
diff changeset
99 from non-profiling (e.g. VRP).
kono
parents: 67
diff changeset
100 * Adding new profilers should be simplified, starting with a cleanup
kono
parents: 67
diff changeset
101 of what-happens-where and with making gimple_find_values_to_profile
kono
parents: 67
diff changeset
102 and gimple_value_profile_transformations table-driven, perhaps...
kono
parents: 67
diff changeset
103 */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 static bool gimple_mod_subtract_transform (gimple_stmt_iterator *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 static bool gimple_stringops_transform (gimple_stmt_iterator *);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
109 static void dump_ic_profile (gimple_stmt_iterator *gsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 /* Allocate histogram value. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
111
kono
parents: 67
diff changeset
113 histogram_value
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 gimple_alloc_histogram_value (struct function *fun ATTRIBUTE_UNUSED,
111
kono
parents: 67
diff changeset
115 enum hist_type type, gimple *stmt, tree value)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 histogram_value hist = (histogram_value) xcalloc (1, sizeof (*hist));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 hist->hvalue.value = value;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 hist->hvalue.stmt = stmt;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 hist->type = type;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 return hist;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 /* Hash value for histogram. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 static hashval_t
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 histogram_hash (const void *x)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 return htab_hash_pointer (((const_histogram_value)x)->hvalue.stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
111
kono
parents: 67
diff changeset
132 /* Return nonzero if statement for histogram_value X is Y. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 static int
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 histogram_eq (const void *x, const void *y)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 {
111
kono
parents: 67
diff changeset
137 return ((const_histogram_value) x)->hvalue.stmt == (const gimple *) y;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 /* Set histogram for STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 static void
111
kono
parents: 67
diff changeset
143 set_histogram_value (struct function *fun, gimple *stmt, histogram_value hist)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 void **loc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 if (!hist && !VALUE_HISTOGRAMS (fun))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 if (!VALUE_HISTOGRAMS (fun))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 VALUE_HISTOGRAMS (fun) = htab_create (1, histogram_hash,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 histogram_eq, NULL);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 loc = htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun), stmt,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 htab_hash_pointer (stmt),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 hist ? INSERT : NO_INSERT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 if (!hist)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 if (loc)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 htab_clear_slot (VALUE_HISTOGRAMS (fun), loc);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 *loc = hist;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 /* Get histogram list for STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 histogram_value
111
kono
parents: 67
diff changeset
166 gimple_histogram_value (struct function *fun, gimple *stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 if (!VALUE_HISTOGRAMS (fun))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 return (histogram_value) htab_find_with_hash (VALUE_HISTOGRAMS (fun), stmt,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 htab_hash_pointer (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 /* Add histogram for STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 void
111
kono
parents: 67
diff changeset
177 gimple_add_histogram_value (struct function *fun, gimple *stmt,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 histogram_value hist)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 hist->hvalue.next = gimple_histogram_value (fun, stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 set_histogram_value (fun, stmt, hist);
111
kono
parents: 67
diff changeset
182 hist->fun = fun;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 /* Remove histogram HIST from STMT's histogram list. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 void
111
kono
parents: 67
diff changeset
188 gimple_remove_histogram_value (struct function *fun, gimple *stmt,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 histogram_value hist)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 histogram_value hist2 = gimple_histogram_value (fun, stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 if (hist == hist2)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 set_histogram_value (fun, stmt, hist->hvalue.next);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 while (hist2->hvalue.next != hist)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 hist2 = hist2->hvalue.next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 hist2->hvalue.next = hist->hvalue.next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 free (hist->hvalue.counters);
111
kono
parents: 67
diff changeset
203 if (flag_checking)
kono
parents: 67
diff changeset
204 memset (hist, 0xab, sizeof (*hist));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 free (hist);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 /* Lookup histogram of type TYPE in the STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 histogram_value
111
kono
parents: 67
diff changeset
211 gimple_histogram_value_of_type (struct function *fun, gimple *stmt,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 enum hist_type type)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 histogram_value hist;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 for (hist = gimple_histogram_value (fun, stmt); hist;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 hist = hist->hvalue.next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 if (hist->type == type)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 return hist;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 /* Dump information about HIST to DUMP_FILE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 dump_histogram_value (FILE *dump_file, histogram_value hist)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 switch (hist->type)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 case HIST_TYPE_INTERVAL:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 if (hist->hvalue.counters)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
232 fprintf (dump_file, "Interval counter range [%d,%d]: [",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
233 hist->hdata.intvl.int_start,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
234 (hist->hdata.intvl.int_start
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
235 + hist->hdata.intvl.steps - 1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
236
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
237 unsigned int i;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
238 for (i = 0; i < hist->hdata.intvl.steps; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
239 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
240 fprintf (dump_file, "%d:%" PRId64,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
241 hist->hdata.intvl.int_start + i,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
242 (int64_t) hist->hvalue.counters[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
243 if (i != hist->hdata.intvl.steps - 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
244 fprintf (dump_file, ", ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
245 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
246 fprintf (dump_file, "] outside range: %" PRId64 ".\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
247 (int64_t) hist->hvalue.counters[i]);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 case HIST_TYPE_POW2:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 if (hist->hvalue.counters)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
253 fprintf (dump_file, "Pow2 counter pow2:%" PRId64
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
254 " nonpow2:%" PRId64 ".\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
255 (int64_t) hist->hvalue.counters[1],
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
256 (int64_t) hist->hvalue.counters[0]);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
259 case HIST_TYPE_TOPN_VALUES:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
260 case HIST_TYPE_INDIR_CALL:
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 if (hist->hvalue.counters)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
263 fprintf (dump_file,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
264 (hist->type == HIST_TYPE_TOPN_VALUES
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
265 ? "Top N value counter" : "Indirect call counter"));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
266 if (hist->hvalue.counters)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
267 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
268 fprintf (dump_file, " all: %" PRId64 ", values: ",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
269 (int64_t) hist->hvalue.counters[0]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
270 for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
271 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
272 fprintf (dump_file, "[%" PRId64 ":%" PRId64 "]",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
273 (int64_t) hist->hvalue.counters[2 * i + 1],
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
274 (int64_t) hist->hvalue.counters[2 * i + 2]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
275 if (i != GCOV_TOPN_VALUES - 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
276 fprintf (dump_file, ", ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
277 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
278 fprintf (dump_file, ".\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
279 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 case HIST_TYPE_AVERAGE:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 if (hist->hvalue.counters)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
285 fprintf (dump_file, "Average value sum:%" PRId64
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
286 " times:%" PRId64 ".\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
287 (int64_t) hist->hvalue.counters[0],
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
288 (int64_t) hist->hvalue.counters[1]);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 case HIST_TYPE_IOR:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 if (hist->hvalue.counters)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
293 fprintf (dump_file, "IOR value ior:%" PRId64 ".\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
294 (int64_t) hist->hvalue.counters[0]);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
296
111
kono
parents: 67
diff changeset
297 case HIST_TYPE_TIME_PROFILE:
kono
parents: 67
diff changeset
298 if (hist->hvalue.counters)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
299 fprintf (dump_file, "Time profile time:%" PRId64 ".\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
300 (int64_t) hist->hvalue.counters[0]);
111
kono
parents: 67
diff changeset
301 break;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
302 default:
111
kono
parents: 67
diff changeset
303 gcc_unreachable ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306
111
kono
parents: 67
diff changeset
307 /* Dump information about HIST to DUMP_FILE. */
kono
parents: 67
diff changeset
308
kono
parents: 67
diff changeset
309 void
kono
parents: 67
diff changeset
310 stream_out_histogram_value (struct output_block *ob, histogram_value hist)
kono
parents: 67
diff changeset
311 {
kono
parents: 67
diff changeset
312 struct bitpack_d bp;
kono
parents: 67
diff changeset
313 unsigned int i;
kono
parents: 67
diff changeset
314
kono
parents: 67
diff changeset
315 bp = bitpack_create (ob->main_stream);
kono
parents: 67
diff changeset
316 bp_pack_enum (&bp, hist_type, HIST_TYPE_MAX, hist->type);
kono
parents: 67
diff changeset
317 bp_pack_value (&bp, hist->hvalue.next != NULL, 1);
kono
parents: 67
diff changeset
318 streamer_write_bitpack (&bp);
kono
parents: 67
diff changeset
319 switch (hist->type)
kono
parents: 67
diff changeset
320 {
kono
parents: 67
diff changeset
321 case HIST_TYPE_INTERVAL:
kono
parents: 67
diff changeset
322 streamer_write_hwi (ob, hist->hdata.intvl.int_start);
kono
parents: 67
diff changeset
323 streamer_write_uhwi (ob, hist->hdata.intvl.steps);
kono
parents: 67
diff changeset
324 break;
kono
parents: 67
diff changeset
325 default:
kono
parents: 67
diff changeset
326 break;
kono
parents: 67
diff changeset
327 }
kono
parents: 67
diff changeset
328 for (i = 0; i < hist->n_counters; i++)
kono
parents: 67
diff changeset
329 {
kono
parents: 67
diff changeset
330 /* When user uses an unsigned type with a big value, constant converted
kono
parents: 67
diff changeset
331 to gcov_type (a signed type) can be negative. */
kono
parents: 67
diff changeset
332 gcov_type value = hist->hvalue.counters[i];
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
333 if (hist->type == HIST_TYPE_TOPN_VALUES && i > 0)
111
kono
parents: 67
diff changeset
334 ;
kono
parents: 67
diff changeset
335 else
kono
parents: 67
diff changeset
336 gcc_assert (value >= 0);
kono
parents: 67
diff changeset
337
kono
parents: 67
diff changeset
338 streamer_write_gcov_count (ob, value);
kono
parents: 67
diff changeset
339 }
kono
parents: 67
diff changeset
340 if (hist->hvalue.next)
kono
parents: 67
diff changeset
341 stream_out_histogram_value (ob, hist->hvalue.next);
kono
parents: 67
diff changeset
342 }
kono
parents: 67
diff changeset
343
kono
parents: 67
diff changeset
344 /* Dump information about HIST to DUMP_FILE. */
kono
parents: 67
diff changeset
345
kono
parents: 67
diff changeset
346 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
347 stream_in_histogram_value (class lto_input_block *ib, gimple *stmt)
111
kono
parents: 67
diff changeset
348 {
kono
parents: 67
diff changeset
349 enum hist_type type;
kono
parents: 67
diff changeset
350 unsigned int ncounters = 0;
kono
parents: 67
diff changeset
351 struct bitpack_d bp;
kono
parents: 67
diff changeset
352 unsigned int i;
kono
parents: 67
diff changeset
353 histogram_value new_val;
kono
parents: 67
diff changeset
354 bool next;
kono
parents: 67
diff changeset
355 histogram_value *next_p = NULL;
kono
parents: 67
diff changeset
356
kono
parents: 67
diff changeset
357 do
kono
parents: 67
diff changeset
358 {
kono
parents: 67
diff changeset
359 bp = streamer_read_bitpack (ib);
kono
parents: 67
diff changeset
360 type = bp_unpack_enum (&bp, hist_type, HIST_TYPE_MAX);
kono
parents: 67
diff changeset
361 next = bp_unpack_value (&bp, 1);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
362 new_val = gimple_alloc_histogram_value (cfun, type, stmt);
111
kono
parents: 67
diff changeset
363 switch (type)
kono
parents: 67
diff changeset
364 {
kono
parents: 67
diff changeset
365 case HIST_TYPE_INTERVAL:
kono
parents: 67
diff changeset
366 new_val->hdata.intvl.int_start = streamer_read_hwi (ib);
kono
parents: 67
diff changeset
367 new_val->hdata.intvl.steps = streamer_read_uhwi (ib);
kono
parents: 67
diff changeset
368 ncounters = new_val->hdata.intvl.steps + 2;
kono
parents: 67
diff changeset
369 break;
kono
parents: 67
diff changeset
370
kono
parents: 67
diff changeset
371 case HIST_TYPE_POW2:
kono
parents: 67
diff changeset
372 case HIST_TYPE_AVERAGE:
kono
parents: 67
diff changeset
373 ncounters = 2;
kono
parents: 67
diff changeset
374 break;
kono
parents: 67
diff changeset
375
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
376 case HIST_TYPE_TOPN_VALUES:
111
kono
parents: 67
diff changeset
377 case HIST_TYPE_INDIR_CALL:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
378 ncounters = GCOV_TOPN_VALUES_COUNTERS;
111
kono
parents: 67
diff changeset
379 break;
kono
parents: 67
diff changeset
380
kono
parents: 67
diff changeset
381 case HIST_TYPE_IOR:
kono
parents: 67
diff changeset
382 case HIST_TYPE_TIME_PROFILE:
kono
parents: 67
diff changeset
383 ncounters = 1;
kono
parents: 67
diff changeset
384 break;
kono
parents: 67
diff changeset
385
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
386 default:
111
kono
parents: 67
diff changeset
387 gcc_unreachable ();
kono
parents: 67
diff changeset
388 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
389 new_val->hvalue.counters = XNEWVAR (gcov_type,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
390 sizeof (*new_val->hvalue.counters)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
391 * ncounters);
111
kono
parents: 67
diff changeset
392 new_val->n_counters = ncounters;
kono
parents: 67
diff changeset
393 for (i = 0; i < ncounters; i++)
kono
parents: 67
diff changeset
394 new_val->hvalue.counters[i] = streamer_read_gcov_count (ib);
kono
parents: 67
diff changeset
395 if (!next_p)
kono
parents: 67
diff changeset
396 gimple_add_histogram_value (cfun, stmt, new_val);
kono
parents: 67
diff changeset
397 else
kono
parents: 67
diff changeset
398 *next_p = new_val;
kono
parents: 67
diff changeset
399 next_p = &new_val->hvalue.next;
kono
parents: 67
diff changeset
400 }
kono
parents: 67
diff changeset
401 while (next);
kono
parents: 67
diff changeset
402 }
kono
parents: 67
diff changeset
403
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 /* Dump all histograms attached to STMT to DUMP_FILE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
405
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
406 void
111
kono
parents: 67
diff changeset
407 dump_histograms_for_stmt (struct function *fun, FILE *dump_file, gimple *stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
408 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
409 histogram_value hist;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 for (hist = gimple_histogram_value (fun, stmt); hist; hist = hist->hvalue.next)
111
kono
parents: 67
diff changeset
411 dump_histogram_value (dump_file, hist);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
413
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
414 /* Remove all histograms associated with STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
415
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 void
111
kono
parents: 67
diff changeset
417 gimple_remove_stmt_histograms (struct function *fun, gimple *stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 histogram_value val;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 while ((val = gimple_histogram_value (fun, stmt)) != NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 gimple_remove_histogram_value (fun, stmt, val);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
423
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 /* Duplicate all histograms associates with OSTMT to STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
425
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 void
111
kono
parents: 67
diff changeset
427 gimple_duplicate_stmt_histograms (struct function *fun, gimple *stmt,
kono
parents: 67
diff changeset
428 struct function *ofun, gimple *ostmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
429 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
430 histogram_value val;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 for (val = gimple_histogram_value (ofun, ostmt); val != NULL; val = val->hvalue.next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
433 histogram_value new_val = gimple_alloc_histogram_value (fun, val->type);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 memcpy (new_val, val, sizeof (*val));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 new_val->hvalue.stmt = stmt;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 memcpy (new_val->hvalue.counters, val->hvalue.counters, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 gimple_add_histogram_value (fun, stmt, new_val);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
439 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
441
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 /* Move all histograms associated with OSTMT to STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
443
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
444 void
111
kono
parents: 67
diff changeset
445 gimple_move_stmt_histograms (struct function *fun, gimple *stmt, gimple *ostmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 histogram_value val = gimple_histogram_value (fun, ostmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 if (val)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
450 /* The following three statements can't be reordered,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 because histogram hashtab relies on stmt field value
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 for finding the exact slot. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 set_histogram_value (fun, ostmt, NULL);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 for (; val != NULL; val = val->hvalue.next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 val->hvalue.stmt = stmt;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 set_histogram_value (fun, stmt, val);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
459
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 static bool error_found = false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
461
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 /* Helper function for verify_histograms. For each histogram reachable via htab
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
463 walk verify that it was reached via statement walk. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
464
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
465 static int
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 visit_hist (void **slot, void *data)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 {
111
kono
parents: 67
diff changeset
468 hash_set<histogram_value> *visited = (hash_set<histogram_value> *) data;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 histogram_value hist = *(histogram_value *) slot;
111
kono
parents: 67
diff changeset
470
kono
parents: 67
diff changeset
471 if (!visited->contains (hist)
kono
parents: 67
diff changeset
472 && hist->type != HIST_TYPE_TIME_PROFILE)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
473 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
474 error ("dead histogram");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 dump_histogram_value (stderr, hist);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 debug_gimple_stmt (hist->hvalue.stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 error_found = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
478 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
479 return 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
481
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 /* Verify sanity of the histograms. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
483
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
484 DEBUG_FUNCTION void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 verify_histograms (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
486 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
487 basic_block bb;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
488 gimple_stmt_iterator gsi;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 histogram_value hist;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
490
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 error_found = false;
111
kono
parents: 67
diff changeset
492 hash_set<histogram_value> visited_hists;
kono
parents: 67
diff changeset
493 FOR_EACH_BB_FN (bb, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
494 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
495 {
111
kono
parents: 67
diff changeset
496 gimple *stmt = gsi_stmt (gsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
497
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 for (hist = gimple_histogram_value (cfun, stmt); hist;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
499 hist = hist->hvalue.next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
500 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
501 if (hist->hvalue.stmt != stmt)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
502 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
503 error ("histogram value statement does not correspond to "
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 "the statement it is associated with");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
505 debug_gimple_stmt (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
506 dump_histogram_value (stderr, hist);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507 error_found = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 }
111
kono
parents: 67
diff changeset
509 visited_hists.add (hist);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 if (VALUE_HISTOGRAMS (cfun))
111
kono
parents: 67
diff changeset
513 htab_traverse (VALUE_HISTOGRAMS (cfun), visit_hist, &visited_hists);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 if (error_found)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
515 internal_error ("%qs failed", __func__);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
517
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
518 /* Helper function for verify_histograms. For each histogram reachable via htab
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
519 walk verify that it was reached via statement walk. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
520
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 static int
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
522 free_hist (void **slot, void *data ATTRIBUTE_UNUSED)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
523 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
524 histogram_value hist = *(histogram_value *) slot;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
525 free (hist->hvalue.counters);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 free (hist);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
527 return 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
528 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
529
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
530 void
111
kono
parents: 67
diff changeset
531 free_histograms (struct function *fn)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
532 {
111
kono
parents: 67
diff changeset
533 if (VALUE_HISTOGRAMS (fn))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
534 {
111
kono
parents: 67
diff changeset
535 htab_traverse (VALUE_HISTOGRAMS (fn), free_hist, NULL);
kono
parents: 67
diff changeset
536 htab_delete (VALUE_HISTOGRAMS (fn));
kono
parents: 67
diff changeset
537 VALUE_HISTOGRAMS (fn) = NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
538 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
539 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
540
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
541 /* The overall number of invocations of the counter should match
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
542 execution count of basic block. Report it as error rather than
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
543 internal error as it might mean that user has misused the profile
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
544 somehow. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
545
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 static bool
111
kono
parents: 67
diff changeset
547 check_counter (gimple *stmt, const char * name,
kono
parents: 67
diff changeset
548 gcov_type *count, gcov_type *all, profile_count bb_count_d)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
549 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
550 gcov_type bb_count = bb_count_d.ipa ().to_gcov_type ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 if (*all != bb_count || *count > *all)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
552 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
553 dump_user_location_t locus;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
554 locus = ((stmt != NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
555 ? dump_user_location_t (stmt)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
556 : dump_user_location_t::from_function_decl
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
557 (current_function_decl));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
558 if (flag_profile_correction)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
559 {
111
kono
parents: 67
diff changeset
560 if (dump_enabled_p ())
kono
parents: 67
diff changeset
561 dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
kono
parents: 67
diff changeset
562 "correcting inconsistent value profile: %s "
kono
parents: 67
diff changeset
563 "profiler overall count (%d) does not match BB "
kono
parents: 67
diff changeset
564 "count (%d)\n", name, (int)*all, (int)bb_count);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
565 *all = bb_count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
566 if (*count > *all)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 *count = *all;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
568 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
571 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
572 error_at (locus.get_location_t (), "corrupted value profile: %s "
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
573 "profile counter (%d out of %d) inconsistent with "
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
574 "basic-block count (%d)",
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
575 name,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
576 (int) *count,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
577 (int) *all,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
578 (int) bb_count);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
579 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
582
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
585
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
586 /* GIMPLE based transformations. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
587
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
588 bool
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
589 gimple_value_profile_transformations (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
591 basic_block bb;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
592 gimple_stmt_iterator gsi;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
593 bool changed = false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
594
111
kono
parents: 67
diff changeset
595 FOR_EACH_BB_FN (bb, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
596 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
598 {
111
kono
parents: 67
diff changeset
599 gimple *stmt = gsi_stmt (gsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
600 histogram_value th = gimple_histogram_value (cfun, stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
601 if (!th)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
602 continue;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
603
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
604 if (dump_file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
605 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
606 fprintf (dump_file, "Trying transformations on stmt ");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
607 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
608 dump_histograms_for_stmt (cfun, dump_file, stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
609 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
610
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
611 /* Transformations: */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
612 /* The order of things in this conditional controls which
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
613 transformation is used when more than one is applicable. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
614 /* It is expected that any code added by the transformations
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
615 will be added before the current statement, and that the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
616 current statement remain valid (although possibly
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
617 modified) upon return. */
111
kono
parents: 67
diff changeset
618 if (gimple_mod_subtract_transform (&gsi)
kono
parents: 67
diff changeset
619 || gimple_divmod_fixed_value_transform (&gsi)
kono
parents: 67
diff changeset
620 || gimple_mod_pow2_value_transform (&gsi)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
621 || gimple_stringops_transform (&gsi))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
622 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
623 stmt = gsi_stmt (gsi);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
624 changed = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
625 /* Original statement may no longer be in the same block. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
626 if (bb != gimple_bb (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
627 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
628 bb = gimple_bb (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
629 gsi = gsi_for_stmt (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
630 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
631 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
632
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
633 /* The function never thansforms a GIMPLE statement. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
634 if (dump_enabled_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
635 dump_ic_profile (&gsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
636 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
637 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
638
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
639 return changed;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
640 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
641
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
642 /* Generate code for transformation 1 (with parent gimple assignment
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
643 STMT and probability of taking the optimal path PROB, which is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
644 equivalent to COUNT/ALL within roundoff error). This generates the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
645 result into a temp and returns the temp; it does not replace or
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
646 alter the original STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
647
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
648 static tree
111
kono
parents: 67
diff changeset
649 gimple_divmod_fixed_value (gassign *stmt, tree value, profile_probability prob,
kono
parents: 67
diff changeset
650 gcov_type count, gcov_type all)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
651 {
111
kono
parents: 67
diff changeset
652 gassign *stmt1, *stmt2;
kono
parents: 67
diff changeset
653 gcond *stmt3;
kono
parents: 67
diff changeset
654 tree tmp0, tmp1, tmp2;
kono
parents: 67
diff changeset
655 gimple *bb1end, *bb2end, *bb3end;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
656 basic_block bb, bb2, bb3, bb4;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
657 tree optype, op1, op2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
658 edge e12, e13, e23, e24, e34;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
659 gimple_stmt_iterator gsi;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
660
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
661 gcc_assert (is_gimple_assign (stmt)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
662 && (gimple_assign_rhs_code (stmt) == TRUNC_DIV_EXPR
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
663 || gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
664
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
665 optype = TREE_TYPE (gimple_assign_lhs (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
666 op1 = gimple_assign_rhs1 (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
667 op2 = gimple_assign_rhs2 (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
668
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
669 bb = gimple_bb (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
670 gsi = gsi_for_stmt (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
671
111
kono
parents: 67
diff changeset
672 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
kono
parents: 67
diff changeset
673 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
674 stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
675 stmt2 = gimple_build_assign (tmp1, op2);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
676 stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
677 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
678 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
680 bb1end = stmt3;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
681
111
kono
parents: 67
diff changeset
682 tmp2 = create_tmp_reg (optype, "PROF");
kono
parents: 67
diff changeset
683 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, tmp0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
684 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
685 bb2end = stmt1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
686
111
kono
parents: 67
diff changeset
687 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, op2);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
688 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
689 bb3end = stmt1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
690
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
691 /* Fix CFG. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
692 /* Edge e23 connects bb2 to bb3, etc. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
693 e12 = split_block (bb, bb1end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
694 bb2 = e12->dest;
111
kono
parents: 67
diff changeset
695 bb2->count = profile_count::from_gcov_type (count);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
696 e23 = split_block (bb2, bb2end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
697 bb3 = e23->dest;
111
kono
parents: 67
diff changeset
698 bb3->count = profile_count::from_gcov_type (all - count);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
699 e34 = split_block (bb3, bb3end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
700 bb4 = e34->dest;
111
kono
parents: 67
diff changeset
701 bb4->count = profile_count::from_gcov_type (all);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
702
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
703 e12->flags &= ~EDGE_FALLTHRU;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
704 e12->flags |= EDGE_FALSE_VALUE;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
705 e12->probability = prob;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
706
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
707 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
111
kono
parents: 67
diff changeset
708 e13->probability = prob.invert ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
709
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
710 remove_edge (e23);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
711
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
712 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
111
kono
parents: 67
diff changeset
713 e24->probability = profile_probability::always ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
714
111
kono
parents: 67
diff changeset
715 e34->probability = profile_probability::always ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
716
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
717 return tmp2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
718 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
719
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
720 /* Return the n-th value count of TOPN_VALUE histogram. If
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
721 there's a value, return true and set VALUE and COUNT
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
722 arguments. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
723
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
724 bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
725 get_nth_most_common_value (gimple *stmt, const char *counter_type,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
726 histogram_value hist, gcov_type *value,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
727 gcov_type *count, gcov_type *all, unsigned n)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
728 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
729 if (hist->hvalue.counters[2] == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
730 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
731
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
732 gcc_assert (n < GCOV_TOPN_VALUES);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
733
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
734 *count = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
735 *value = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
736
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
737 gcov_type read_all = hist->hvalue.counters[0];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
738
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
739 gcov_type v = hist->hvalue.counters[2 * n + 1];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
740 gcov_type c = hist->hvalue.counters[2 * n + 2];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
741
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
742 /* Indirect calls can't be verified. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
743 if (stmt
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
744 && check_counter (stmt, counter_type, &c, &read_all,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
745 gimple_bb (stmt)->count))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
746 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
747
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
748 *all = read_all;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
749
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
750 *value = v;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
751 *count = c;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
752 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
753 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
754
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
755 /* Do transform 1) on INSN if applicable. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
756
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
757 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
758 gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
759 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
760 histogram_value histogram;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
761 enum tree_code code;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
762 gcov_type val, count, all;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
763 tree result, value, tree_val;
111
kono
parents: 67
diff changeset
764 profile_probability prob;
kono
parents: 67
diff changeset
765 gassign *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
766
111
kono
parents: 67
diff changeset
767 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
kono
parents: 67
diff changeset
768 if (!stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
769 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
770
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
771 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
772 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
773
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
774 code = gimple_assign_rhs_code (stmt);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
775
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
776 if (code != TRUNC_DIV_EXPR && code != TRUNC_MOD_EXPR)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
777 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
778
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
779 histogram = gimple_histogram_value_of_type (cfun, stmt,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
780 HIST_TYPE_TOPN_VALUES);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
781 if (!histogram)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
782 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
783
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
784 if (!get_nth_most_common_value (stmt, "divmod", histogram, &val, &count,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
785 &all))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
786 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
787
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
788 value = histogram->hvalue.value;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
789 gimple_remove_histogram_value (cfun, stmt, histogram);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
790
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
791 /* We require that count is at least half of all. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
792 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
793 || 2 * count < all
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
794 || optimize_bb_for_size_p (gimple_bb (stmt)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
795 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
796
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
797 /* Compute probability of taking the optimal path. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
798 if (all > 0)
111
kono
parents: 67
diff changeset
799 prob = profile_probability::probability_in_gcov_type (count, all);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
800 else
111
kono
parents: 67
diff changeset
801 prob = profile_probability::never ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
802
111
kono
parents: 67
diff changeset
803 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
kono
parents: 67
diff changeset
804 tree_val = build_int_cst (get_gcov_type (), val);
kono
parents: 67
diff changeset
805 else
kono
parents: 67
diff changeset
806 {
kono
parents: 67
diff changeset
807 HOST_WIDE_INT a[2];
kono
parents: 67
diff changeset
808 a[0] = (unsigned HOST_WIDE_INT) val;
kono
parents: 67
diff changeset
809 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
kono
parents: 67
diff changeset
810
kono
parents: 67
diff changeset
811 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
kono
parents: 67
diff changeset
812 TYPE_PRECISION (get_gcov_type ()), false));
kono
parents: 67
diff changeset
813 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
814 result = gimple_divmod_fixed_value (stmt, tree_val, prob, count, all);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
815
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
816 if (dump_enabled_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
817 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
818 "Transformation done: div/mod by constant %T\n", tree_val);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
819
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
820 gimple_assign_set_rhs_from_tree (si, result);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
821 update_stmt (gsi_stmt (*si));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
822
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
823 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
824 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
825
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
826 /* Generate code for transformation 2 (with parent gimple assign STMT and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
827 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
828 within roundoff error). This generates the result into a temp and returns
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
829 the temp; it does not replace or alter the original STMT. */
111
kono
parents: 67
diff changeset
830
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
831 static tree
111
kono
parents: 67
diff changeset
832 gimple_mod_pow2 (gassign *stmt, profile_probability prob, gcov_type count, gcov_type all)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
833 {
111
kono
parents: 67
diff changeset
834 gassign *stmt1, *stmt2, *stmt3;
kono
parents: 67
diff changeset
835 gcond *stmt4;
kono
parents: 67
diff changeset
836 tree tmp2, tmp3;
kono
parents: 67
diff changeset
837 gimple *bb1end, *bb2end, *bb3end;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
838 basic_block bb, bb2, bb3, bb4;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
839 tree optype, op1, op2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
840 edge e12, e13, e23, e24, e34;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
841 gimple_stmt_iterator gsi;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
842 tree result;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
843
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
844 gcc_assert (is_gimple_assign (stmt)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
845 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
846
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
847 optype = TREE_TYPE (gimple_assign_lhs (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
848 op1 = gimple_assign_rhs1 (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
849 op2 = gimple_assign_rhs2 (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
850
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
851 bb = gimple_bb (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
852 gsi = gsi_for_stmt (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
853
111
kono
parents: 67
diff changeset
854 result = create_tmp_reg (optype, "PROF");
kono
parents: 67
diff changeset
855 tmp2 = make_temp_ssa_name (optype, NULL, "PROF");
kono
parents: 67
diff changeset
856 tmp3 = make_temp_ssa_name (optype, NULL, "PROF");
kono
parents: 67
diff changeset
857 stmt2 = gimple_build_assign (tmp2, PLUS_EXPR, op2,
kono
parents: 67
diff changeset
858 build_int_cst (optype, -1));
kono
parents: 67
diff changeset
859 stmt3 = gimple_build_assign (tmp3, BIT_AND_EXPR, tmp2, op2);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
860 stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
861 NULL_TREE, NULL_TREE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
862 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
863 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
864 gsi_insert_before (&gsi, stmt4, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
865 bb1end = stmt4;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
866
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
867 /* tmp2 == op2-1 inherited from previous block. */
111
kono
parents: 67
diff changeset
868 stmt1 = gimple_build_assign (result, BIT_AND_EXPR, op1, tmp2);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
869 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
870 bb2end = stmt1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
871
111
kono
parents: 67
diff changeset
872 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
kono
parents: 67
diff changeset
873 op1, op2);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
874 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
875 bb3end = stmt1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
876
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
877 /* Fix CFG. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
878 /* Edge e23 connects bb2 to bb3, etc. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
879 e12 = split_block (bb, bb1end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
880 bb2 = e12->dest;
111
kono
parents: 67
diff changeset
881 bb2->count = profile_count::from_gcov_type (count);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
882 e23 = split_block (bb2, bb2end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
883 bb3 = e23->dest;
111
kono
parents: 67
diff changeset
884 bb3->count = profile_count::from_gcov_type (all - count);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
885 e34 = split_block (bb3, bb3end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
886 bb4 = e34->dest;
111
kono
parents: 67
diff changeset
887 bb4->count = profile_count::from_gcov_type (all);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
888
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
889 e12->flags &= ~EDGE_FALLTHRU;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
890 e12->flags |= EDGE_FALSE_VALUE;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
891 e12->probability = prob;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
892
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
893 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
111
kono
parents: 67
diff changeset
894 e13->probability = prob.invert ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
895
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
896 remove_edge (e23);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
897
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
898 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
111
kono
parents: 67
diff changeset
899 e24->probability = profile_probability::always ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
900
111
kono
parents: 67
diff changeset
901 e34->probability = profile_probability::always ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
902
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
903 return result;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
904 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
905
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
906 /* Do transform 2) on INSN if applicable. */
111
kono
parents: 67
diff changeset
907
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
908 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
909 gimple_mod_pow2_value_transform (gimple_stmt_iterator *si)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
910 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
911 histogram_value histogram;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
912 enum tree_code code;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
913 gcov_type count, wrong_values, all;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
914 tree lhs_type, result, value;
111
kono
parents: 67
diff changeset
915 profile_probability prob;
kono
parents: 67
diff changeset
916 gassign *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
917
111
kono
parents: 67
diff changeset
918 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
kono
parents: 67
diff changeset
919 if (!stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
920 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
921
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
922 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
923 if (!INTEGRAL_TYPE_P (lhs_type))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
924 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
925
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
926 code = gimple_assign_rhs_code (stmt);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
927
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
928 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
929 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
930
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
931 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_POW2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
932 if (!histogram)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
933 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
934
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
935 value = histogram->hvalue.value;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
936 wrong_values = histogram->hvalue.counters[0];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
937 count = histogram->hvalue.counters[1];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
938
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
939 gimple_remove_histogram_value (cfun, stmt, histogram);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
940
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
941 /* We require that we hit a power of 2 at least half of all evaluations. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
942 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
943 || count < wrong_values
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
944 || optimize_bb_for_size_p (gimple_bb (stmt)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
945 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
946
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
947 /* Compute probability of taking the optimal path. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
948 all = count + wrong_values;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
949
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
950 if (check_counter (stmt, "pow2", &count, &all, gimple_bb (stmt)->count))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
951 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
952
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
953 if (dump_enabled_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
954 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
955 "Transformation done: mod power of 2\n");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
956
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
957 if (all > 0)
111
kono
parents: 67
diff changeset
958 prob = profile_probability::probability_in_gcov_type (count, all);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
959 else
111
kono
parents: 67
diff changeset
960 prob = profile_probability::never ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
961
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
962 result = gimple_mod_pow2 (stmt, prob, count, all);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
963
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
964 gimple_assign_set_rhs_from_tree (si, result);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
965 update_stmt (gsi_stmt (*si));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
966
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
967 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
968 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
969
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
970 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
971 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
972 supported and this is built into this interface. The probabilities of taking
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
973 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
974 COUNT2/ALL respectively within roundoff error). This generates the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
975 result into a temp and returns the temp; it does not replace or alter
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
976 the original STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
977 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
978
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
979 static tree
111
kono
parents: 67
diff changeset
980 gimple_mod_subtract (gassign *stmt, profile_probability prob1,
kono
parents: 67
diff changeset
981 profile_probability prob2, int ncounts,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
982 gcov_type count1, gcov_type count2, gcov_type all)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
983 {
111
kono
parents: 67
diff changeset
984 gassign *stmt1;
kono
parents: 67
diff changeset
985 gimple *stmt2;
kono
parents: 67
diff changeset
986 gcond *stmt3;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
987 tree tmp1;
111
kono
parents: 67
diff changeset
988 gimple *bb1end, *bb2end = NULL, *bb3end;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
989 basic_block bb, bb2, bb3, bb4;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
990 tree optype, op1, op2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
991 edge e12, e23 = 0, e24, e34, e14;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
992 gimple_stmt_iterator gsi;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
993 tree result;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
994
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
995 gcc_assert (is_gimple_assign (stmt)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
996 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
997
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
998 optype = TREE_TYPE (gimple_assign_lhs (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
999 op1 = gimple_assign_rhs1 (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1000 op2 = gimple_assign_rhs2 (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1001
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1002 bb = gimple_bb (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1003 gsi = gsi_for_stmt (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1004
111
kono
parents: 67
diff changeset
1005 result = create_tmp_reg (optype, "PROF");
kono
parents: 67
diff changeset
1006 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1007 stmt1 = gimple_build_assign (result, op1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1008 stmt2 = gimple_build_assign (tmp1, op2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1009 stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1010 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1011 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1012 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1013 bb1end = stmt3;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1014
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1015 if (ncounts) /* Assumed to be 0 or 1 */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1016 {
111
kono
parents: 67
diff changeset
1017 stmt1 = gimple_build_assign (result, MINUS_EXPR, result, tmp1);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1018 stmt2 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1019 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1020 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1021 bb2end = stmt2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1022 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1023
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1024 /* Fallback case. */
111
kono
parents: 67
diff changeset
1025 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
kono
parents: 67
diff changeset
1026 result, tmp1);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1027 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1028 bb3end = stmt1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1029
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1030 /* Fix CFG. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1031 /* Edge e23 connects bb2 to bb3, etc. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1032 /* However block 3 is optional; if it is not there, references
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1033 to 3 really refer to block 2. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1034 e12 = split_block (bb, bb1end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1035 bb2 = e12->dest;
111
kono
parents: 67
diff changeset
1036 bb2->count = profile_count::from_gcov_type (all - count1);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1037
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1038 if (ncounts) /* Assumed to be 0 or 1. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1039 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1040 e23 = split_block (bb2, bb2end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1041 bb3 = e23->dest;
111
kono
parents: 67
diff changeset
1042 bb3->count = profile_count::from_gcov_type (all - count1 - count2);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1043 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1044
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1045 e34 = split_block (ncounts ? bb3 : bb2, bb3end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1046 bb4 = e34->dest;
111
kono
parents: 67
diff changeset
1047 bb4->count = profile_count::from_gcov_type (all);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1048
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1049 e12->flags &= ~EDGE_FALLTHRU;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1050 e12->flags |= EDGE_FALSE_VALUE;
111
kono
parents: 67
diff changeset
1051 e12->probability = prob1.invert ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1052
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1053 e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1054 e14->probability = prob1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1055
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1056 if (ncounts) /* Assumed to be 0 or 1. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1057 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1058 e23->flags &= ~EDGE_FALLTHRU;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1059 e23->flags |= EDGE_FALSE_VALUE;
111
kono
parents: 67
diff changeset
1060 e23->probability = prob2.invert ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1061
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1062 e24 = make_edge (bb2, bb4, EDGE_TRUE_VALUE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1063 e24->probability = prob2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1064 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1065
111
kono
parents: 67
diff changeset
1066 e34->probability = profile_probability::always ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1067
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1068 return result;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1069 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1070
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1071 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1072
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1073 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1074 gimple_mod_subtract_transform (gimple_stmt_iterator *si)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1075 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1076 histogram_value histogram;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1077 enum tree_code code;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1078 gcov_type count, wrong_values, all;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1079 tree lhs_type, result;
111
kono
parents: 67
diff changeset
1080 profile_probability prob1, prob2;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1081 unsigned int i, steps;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1082 gcov_type count1, count2;
111
kono
parents: 67
diff changeset
1083 gassign *stmt;
kono
parents: 67
diff changeset
1084 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
kono
parents: 67
diff changeset
1085 if (!stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1086 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1087
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1088 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1089 if (!INTEGRAL_TYPE_P (lhs_type))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1090 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1091
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1092 code = gimple_assign_rhs_code (stmt);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1093
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1094 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1095 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1096
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1097 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INTERVAL);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1098 if (!histogram)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1099 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1100
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1101 all = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1102 wrong_values = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1103 for (i = 0; i < histogram->hdata.intvl.steps; i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1104 all += histogram->hvalue.counters[i];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1105
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1106 wrong_values += histogram->hvalue.counters[i];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1107 wrong_values += histogram->hvalue.counters[i+1];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1108 steps = histogram->hdata.intvl.steps;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1109 all += wrong_values;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1110 count1 = histogram->hvalue.counters[0];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1111 count2 = histogram->hvalue.counters[1];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1112
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1113 if (check_counter (stmt, "interval", &count1, &all, gimple_bb (stmt)->count))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1114 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1115 gimple_remove_histogram_value (cfun, stmt, histogram);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1116 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1117 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1118
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1119 if (flag_profile_correction && count1 + count2 > all)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1120 all = count1 + count2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1121
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1122 gcc_assert (count1 + count2 <= all);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1123
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1124 /* We require that we use just subtractions in at least 50% of all
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1125 evaluations. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1126 count = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1127 for (i = 0; i < histogram->hdata.intvl.steps; i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1128 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1129 count += histogram->hvalue.counters[i];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1130 if (count * 2 >= all)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1131 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1132 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1133 if (i == steps
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1134 || optimize_bb_for_size_p (gimple_bb (stmt)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1135 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1136
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1137 gimple_remove_histogram_value (cfun, stmt, histogram);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1138 if (dump_enabled_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1139 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1140 "Transformation done: mod subtract\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1141
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1142 /* Compute probability of taking the optimal path(s). */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1143 if (all > 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1144 {
111
kono
parents: 67
diff changeset
1145 prob1 = profile_probability::probability_in_gcov_type (count1, all);
kono
parents: 67
diff changeset
1146 prob2 = profile_probability::probability_in_gcov_type (count2, all);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1147 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1148 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1149 {
111
kono
parents: 67
diff changeset
1150 prob1 = prob2 = profile_probability::never ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1151 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1152
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1153 /* In practice, "steps" is always 2. This interface reflects this,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1154 and will need to be changed if "steps" can change. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1155 result = gimple_mod_subtract (stmt, prob1, prob2, i, count1, count2, all);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1156
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1157 gimple_assign_set_rhs_from_tree (si, result);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1158 update_stmt (gsi_stmt (*si));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1159
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1160 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1161 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1162
111
kono
parents: 67
diff changeset
1163 typedef int_hash <unsigned int, 0, UINT_MAX> profile_id_hash;
kono
parents: 67
diff changeset
1164
kono
parents: 67
diff changeset
1165 static hash_map<profile_id_hash, cgraph_node *> *cgraph_node_map = 0;
kono
parents: 67
diff changeset
1166
kono
parents: 67
diff changeset
1167 /* Returns true if node graph is initialized. This
kono
parents: 67
diff changeset
1168 is used to test if profile_id has been created
kono
parents: 67
diff changeset
1169 for cgraph_nodes. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1170
111
kono
parents: 67
diff changeset
1171 bool
kono
parents: 67
diff changeset
1172 coverage_node_map_initialized_p (void)
kono
parents: 67
diff changeset
1173 {
kono
parents: 67
diff changeset
1174 return cgraph_node_map != 0;
kono
parents: 67
diff changeset
1175 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1176
111
kono
parents: 67
diff changeset
1177 /* Initialize map from PROFILE_ID to CGRAPH_NODE.
kono
parents: 67
diff changeset
1178 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume
kono
parents: 67
diff changeset
1179 that the PROFILE_IDs was already assigned. */
kono
parents: 67
diff changeset
1180
kono
parents: 67
diff changeset
1181 void
kono
parents: 67
diff changeset
1182 init_node_map (bool local)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1183 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1184 struct cgraph_node *n;
111
kono
parents: 67
diff changeset
1185 cgraph_node_map = new hash_map<profile_id_hash, cgraph_node *>;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1186
111
kono
parents: 67
diff changeset
1187 FOR_EACH_DEFINED_FUNCTION (n)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1188 if (n->has_gimple_body_p () || n->thunk.thunk_p)
111
kono
parents: 67
diff changeset
1189 {
kono
parents: 67
diff changeset
1190 cgraph_node **val;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1191 dump_user_location_t loc
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1192 = dump_user_location_t::from_function_decl (n->decl);
111
kono
parents: 67
diff changeset
1193 if (local)
kono
parents: 67
diff changeset
1194 {
kono
parents: 67
diff changeset
1195 n->profile_id = coverage_compute_profile_id (n);
kono
parents: 67
diff changeset
1196 while ((val = cgraph_node_map->get (n->profile_id))
kono
parents: 67
diff changeset
1197 || !n->profile_id)
kono
parents: 67
diff changeset
1198 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1199 if (dump_enabled_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1200 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1201 "Local profile-id %i conflict"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1202 " with nodes %s %s\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1203 n->profile_id,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1204 n->dump_name (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1205 (*val)->dump_name ());
111
kono
parents: 67
diff changeset
1206 n->profile_id = (n->profile_id + 1) & 0x7fffffff;
kono
parents: 67
diff changeset
1207 }
kono
parents: 67
diff changeset
1208 }
kono
parents: 67
diff changeset
1209 else if (!n->profile_id)
kono
parents: 67
diff changeset
1210 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1211 if (dump_enabled_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1212 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1213 "Node %s has no profile-id"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1214 " (profile feedback missing?)\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1215 n->dump_name ());
111
kono
parents: 67
diff changeset
1216 continue;
kono
parents: 67
diff changeset
1217 }
kono
parents: 67
diff changeset
1218 else if ((val = cgraph_node_map->get (n->profile_id)))
kono
parents: 67
diff changeset
1219 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1220 if (dump_enabled_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1221 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1222 "Node %s has IP profile-id %i conflict. "
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1223 "Giving up.\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1224 n->dump_name (), n->profile_id);
111
kono
parents: 67
diff changeset
1225 *val = NULL;
kono
parents: 67
diff changeset
1226 continue;
kono
parents: 67
diff changeset
1227 }
kono
parents: 67
diff changeset
1228 cgraph_node_map->put (n->profile_id, n);
kono
parents: 67
diff changeset
1229 }
kono
parents: 67
diff changeset
1230 }
kono
parents: 67
diff changeset
1231
kono
parents: 67
diff changeset
1232 /* Delete the CGRAPH_NODE_MAP. */
kono
parents: 67
diff changeset
1233
kono
parents: 67
diff changeset
1234 void
kono
parents: 67
diff changeset
1235 del_node_map (void)
kono
parents: 67
diff changeset
1236 {
kono
parents: 67
diff changeset
1237 delete cgraph_node_map;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1238 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1239
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1240 /* Return cgraph node for function with pid */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1241
111
kono
parents: 67
diff changeset
1242 struct cgraph_node*
kono
parents: 67
diff changeset
1243 find_func_by_profile_id (int profile_id)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1244 {
111
kono
parents: 67
diff changeset
1245 cgraph_node **val = cgraph_node_map->get (profile_id);
kono
parents: 67
diff changeset
1246 if (val)
kono
parents: 67
diff changeset
1247 return *val;
kono
parents: 67
diff changeset
1248 else
kono
parents: 67
diff changeset
1249 return NULL;
kono
parents: 67
diff changeset
1250 }
kono
parents: 67
diff changeset
1251
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1252 /* Do transformation
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1253
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1254 if (actual_callee_address == address_of_most_common_function/method)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1255 do direct call
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1256 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1257 old call
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1258 */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1259
111
kono
parents: 67
diff changeset
1260 gcall *
kono
parents: 67
diff changeset
1261 gimple_ic (gcall *icall_stmt, struct cgraph_node *direct_call,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1262 profile_probability prob)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1263 {
111
kono
parents: 67
diff changeset
1264 gcall *dcall_stmt;
kono
parents: 67
diff changeset
1265 gassign *load_stmt;
kono
parents: 67
diff changeset
1266 gcond *cond_stmt;
kono
parents: 67
diff changeset
1267 tree tmp0, tmp1, tmp;
kono
parents: 67
diff changeset
1268 basic_block cond_bb, dcall_bb, icall_bb, join_bb = NULL;
kono
parents: 67
diff changeset
1269 edge e_cd, e_ci, e_di, e_dj = NULL, e_ij;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1270 gimple_stmt_iterator gsi;
111
kono
parents: 67
diff changeset
1271 int lp_nr, dflags;
kono
parents: 67
diff changeset
1272 edge e_eh, e;
kono
parents: 67
diff changeset
1273 edge_iterator ei;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1274
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1275 cond_bb = gimple_bb (icall_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1276 gsi = gsi_for_stmt (icall_stmt);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1277
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1278 tmp0 = make_temp_ssa_name (ptr_type_node, NULL, "PROF");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1279 tmp1 = make_temp_ssa_name (ptr_type_node, NULL, "PROF");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1280 tmp = unshare_expr (gimple_call_fn (icall_stmt));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1281 load_stmt = gimple_build_assign (tmp0, tmp);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1282 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1283
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1284 tmp = fold_convert (ptr_type_node, build_addr (direct_call->decl));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1285 load_stmt = gimple_build_assign (tmp1, tmp);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1286 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1287
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1288 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1289 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1290
111
kono
parents: 67
diff changeset
1291 if (TREE_CODE (gimple_vdef (icall_stmt)) == SSA_NAME)
kono
parents: 67
diff changeset
1292 {
kono
parents: 67
diff changeset
1293 unlink_stmt_vdef (icall_stmt);
kono
parents: 67
diff changeset
1294 release_ssa_name (gimple_vdef (icall_stmt));
kono
parents: 67
diff changeset
1295 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1296 gimple_set_vdef (icall_stmt, NULL_TREE);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1297 gimple_set_vuse (icall_stmt, NULL_TREE);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1298 update_stmt (icall_stmt);
111
kono
parents: 67
diff changeset
1299 dcall_stmt = as_a <gcall *> (gimple_copy (icall_stmt));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1300 gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
111
kono
parents: 67
diff changeset
1301 dflags = flags_from_decl_or_type (direct_call->decl);
kono
parents: 67
diff changeset
1302 if ((dflags & ECF_NORETURN) != 0
kono
parents: 67
diff changeset
1303 && should_remove_lhs_p (gimple_call_lhs (dcall_stmt)))
kono
parents: 67
diff changeset
1304 gimple_call_set_lhs (dcall_stmt, NULL_TREE);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1305 gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1306
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1307 /* Fix CFG. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1308 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1309 e_cd = split_block (cond_bb, cond_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1310 dcall_bb = e_cd->dest;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1311 dcall_bb->count = cond_bb->count.apply_probability (prob);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1312
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1313 e_di = split_block (dcall_bb, dcall_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1314 icall_bb = e_di->dest;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1315 icall_bb->count = cond_bb->count - dcall_bb->count;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1316
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1317 /* Do not disturb existing EH edges from the indirect call. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1318 if (!stmt_ends_bb_p (icall_stmt))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1319 e_ij = split_block (icall_bb, icall_stmt);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1320 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1321 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1322 e_ij = find_fallthru_edge (icall_bb->succs);
111
kono
parents: 67
diff changeset
1323 /* The indirect call might be noreturn. */
kono
parents: 67
diff changeset
1324 if (e_ij != NULL)
kono
parents: 67
diff changeset
1325 {
kono
parents: 67
diff changeset
1326 e_ij->probability = profile_probability::always ();
kono
parents: 67
diff changeset
1327 e_ij = single_pred_edge (split_edge (e_ij));
kono
parents: 67
diff changeset
1328 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1329 }
111
kono
parents: 67
diff changeset
1330 if (e_ij != NULL)
kono
parents: 67
diff changeset
1331 {
kono
parents: 67
diff changeset
1332 join_bb = e_ij->dest;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1333 join_bb->count = cond_bb->count;
111
kono
parents: 67
diff changeset
1334 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1335
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1336 e_cd->flags = (e_cd->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1337 e_cd->probability = prob;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1338
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1339 e_ci = make_edge (cond_bb, icall_bb, EDGE_FALSE_VALUE);
111
kono
parents: 67
diff changeset
1340 e_ci->probability = prob.invert ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1341
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1342 remove_edge (e_di);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1343
111
kono
parents: 67
diff changeset
1344 if (e_ij != NULL)
kono
parents: 67
diff changeset
1345 {
kono
parents: 67
diff changeset
1346 if ((dflags & ECF_NORETURN) == 0)
kono
parents: 67
diff changeset
1347 {
kono
parents: 67
diff changeset
1348 e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU);
kono
parents: 67
diff changeset
1349 e_dj->probability = profile_probability::always ();
kono
parents: 67
diff changeset
1350 }
kono
parents: 67
diff changeset
1351 e_ij->probability = profile_probability::always ();
kono
parents: 67
diff changeset
1352 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1353
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1354 /* Insert PHI node for the call result if necessary. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1355 if (gimple_call_lhs (icall_stmt)
111
kono
parents: 67
diff changeset
1356 && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME
kono
parents: 67
diff changeset
1357 && (dflags & ECF_NORETURN) == 0)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1358 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1359 tree result = gimple_call_lhs (icall_stmt);
111
kono
parents: 67
diff changeset
1360 gphi *phi = create_phi_node (result, join_bb);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1361 gimple_call_set_lhs (icall_stmt,
111
kono
parents: 67
diff changeset
1362 duplicate_ssa_name (result, icall_stmt));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1363 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1364 gimple_call_set_lhs (dcall_stmt,
111
kono
parents: 67
diff changeset
1365 duplicate_ssa_name (result, dcall_stmt));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1366 add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1367 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1368
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1369 /* Build an EH edge for the direct call if necessary. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1370 lp_nr = lookup_stmt_eh_lp (icall_stmt);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1371 if (lp_nr > 0 && stmt_could_throw_p (cfun, dcall_stmt))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1372 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1373 add_stmt_to_eh_lp (dcall_stmt, lp_nr);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1374 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1375
111
kono
parents: 67
diff changeset
1376 FOR_EACH_EDGE (e_eh, ei, icall_bb->succs)
kono
parents: 67
diff changeset
1377 if (e_eh->flags & (EDGE_EH | EDGE_ABNORMAL))
kono
parents: 67
diff changeset
1378 {
kono
parents: 67
diff changeset
1379 e = make_edge (dcall_bb, e_eh->dest, e_eh->flags);
kono
parents: 67
diff changeset
1380 e->probability = e_eh->probability;
kono
parents: 67
diff changeset
1381 for (gphi_iterator psi = gsi_start_phis (e_eh->dest);
kono
parents: 67
diff changeset
1382 !gsi_end_p (psi); gsi_next (&psi))
kono
parents: 67
diff changeset
1383 {
kono
parents: 67
diff changeset
1384 gphi *phi = psi.phi ();
kono
parents: 67
diff changeset
1385 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e),
kono
parents: 67
diff changeset
1386 PHI_ARG_DEF_FROM_EDGE (phi, e_eh));
kono
parents: 67
diff changeset
1387 }
kono
parents: 67
diff changeset
1388 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1389 if (!stmt_could_throw_p (cfun, dcall_stmt))
111
kono
parents: 67
diff changeset
1390 gimple_purge_dead_eh_edges (dcall_bb);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1391 return dcall_stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1392 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1393
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1394 /* Dump info about indirect call profile. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1395
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1396 static void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1397 dump_ic_profile (gimple_stmt_iterator *gsi)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1398 {
111
kono
parents: 67
diff changeset
1399 gcall *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1400 histogram_value histogram;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1401 gcov_type val, count, all;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1402 struct cgraph_node *direct_call;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1403
111
kono
parents: 67
diff changeset
1404 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
kono
parents: 67
diff changeset
1405 if (!stmt)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1406 return;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1407
111
kono
parents: 67
diff changeset
1408 if (gimple_call_fndecl (stmt) != NULL_TREE)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1409 return;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1410
111
kono
parents: 67
diff changeset
1411 if (gimple_call_internal_p (stmt))
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1412 return;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1413
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1414 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INDIR_CALL);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1415 if (!histogram)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1416 return;
111
kono
parents: 67
diff changeset
1417
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1418 count = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1419 all = histogram->hvalue.counters[0];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1420
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1421 for (unsigned j = 0; j < GCOV_TOPN_VALUES; j++)
111
kono
parents: 67
diff changeset
1422 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1423 if (!get_nth_most_common_value (NULL, "indirect call", histogram, &val,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1424 &count, &all, j))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1425 return;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1426 if (!count)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1427 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1428
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1429 direct_call = find_func_by_profile_id ((int) val);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1430
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1431 if (direct_call == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1432 dump_printf_loc (
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1433 MSG_MISSED_OPTIMIZATION, stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1434 "Indirect call -> direct call from other "
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1435 "module %T=> %i (will resolve by ipa-profile only with LTO)\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1436 gimple_call_fn (stmt), (int) val);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1437 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1438 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1439 "Indirect call -> direct call "
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1440 "%T => %T (will resolve by ipa-profile)\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1441 gimple_call_fn (stmt), direct_call->decl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1442 dump_printf_loc (MSG_NOTE, stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1443 "hist->count %" PRId64 " hist->all %" PRId64 "\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1444 count, all);
111
kono
parents: 67
diff changeset
1445 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1446 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1447
111
kono
parents: 67
diff changeset
1448 /* Return true if the stringop CALL shall be profiled. SIZE_ARG be
kono
parents: 67
diff changeset
1449 set to the argument index for the size of the string operation. */
kono
parents: 67
diff changeset
1450
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1451 static bool
111
kono
parents: 67
diff changeset
1452 interesting_stringop_to_profile_p (gcall *call, int *size_arg)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1453 {
111
kono
parents: 67
diff changeset
1454 enum built_in_function fcode;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1455
111
kono
parents: 67
diff changeset
1456 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (call));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1457 switch (fcode)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1458 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1459 case BUILT_IN_MEMCPY:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1460 case BUILT_IN_MEMPCPY:
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1461 case BUILT_IN_MEMMOVE:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1462 *size_arg = 2;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1463 return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1464 INTEGER_TYPE, VOID_TYPE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1465 case BUILT_IN_MEMSET:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1466 *size_arg = 2;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1467 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1468 INTEGER_TYPE, VOID_TYPE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1469 case BUILT_IN_BZERO:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1470 *size_arg = 1;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1471 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1472 VOID_TYPE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1473 default:
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1474 return false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1475 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1476 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1477
111
kono
parents: 67
diff changeset
1478 /* Convert stringop (..., vcall_size)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1479 into
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1480 if (vcall_size == icall_size)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1481 stringop (..., icall_size);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1482 else
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1483 stringop (..., vcall_size);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1484 assuming we'll propagate a true constant into ICALL_SIZE later. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1485
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1486 static void
111
kono
parents: 67
diff changeset
1487 gimple_stringop_fixed_value (gcall *vcall_stmt, tree icall_size, profile_probability prob,
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1488 gcov_type count, gcov_type all)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1489 {
111
kono
parents: 67
diff changeset
1490 gassign *tmp_stmt;
kono
parents: 67
diff changeset
1491 gcond *cond_stmt;
kono
parents: 67
diff changeset
1492 gcall *icall_stmt;
kono
parents: 67
diff changeset
1493 tree tmp0, tmp1, vcall_size, optype;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1494 basic_block cond_bb, icall_bb, vcall_bb, join_bb;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1495 edge e_ci, e_cv, e_iv, e_ij, e_vj;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1496 gimple_stmt_iterator gsi;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1497 int size_arg;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1498
111
kono
parents: 67
diff changeset
1499 if (!interesting_stringop_to_profile_p (vcall_stmt, &size_arg))
kono
parents: 67
diff changeset
1500 gcc_unreachable ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1501
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1502 cond_bb = gimple_bb (vcall_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1503 gsi = gsi_for_stmt (vcall_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1504
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1505 vcall_size = gimple_call_arg (vcall_stmt, size_arg);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1506 optype = TREE_TYPE (vcall_size);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1507
111
kono
parents: 67
diff changeset
1508 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
kono
parents: 67
diff changeset
1509 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1510 tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1511 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1512
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1513 tmp_stmt = gimple_build_assign (tmp1, vcall_size);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1514 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1515
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1516 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1517 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1518
111
kono
parents: 67
diff changeset
1519 if (TREE_CODE (gimple_vdef (vcall_stmt)) == SSA_NAME)
kono
parents: 67
diff changeset
1520 {
kono
parents: 67
diff changeset
1521 unlink_stmt_vdef (vcall_stmt);
kono
parents: 67
diff changeset
1522 release_ssa_name (gimple_vdef (vcall_stmt));
kono
parents: 67
diff changeset
1523 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1524 gimple_set_vdef (vcall_stmt, NULL);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1525 gimple_set_vuse (vcall_stmt, NULL);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1526 update_stmt (vcall_stmt);
111
kono
parents: 67
diff changeset
1527 icall_stmt = as_a <gcall *> (gimple_copy (vcall_stmt));
kono
parents: 67
diff changeset
1528 gimple_call_set_arg (icall_stmt, size_arg,
kono
parents: 67
diff changeset
1529 fold_convert (optype, icall_size));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1530 gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1531
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1532 /* Fix CFG. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1533 /* Edge e_ci connects cond_bb to icall_bb, etc. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1534 e_ci = split_block (cond_bb, cond_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1535 icall_bb = e_ci->dest;
111
kono
parents: 67
diff changeset
1536 icall_bb->count = profile_count::from_gcov_type (count);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1537
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1538 e_iv = split_block (icall_bb, icall_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1539 vcall_bb = e_iv->dest;
111
kono
parents: 67
diff changeset
1540 vcall_bb->count = profile_count::from_gcov_type (all - count);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1541
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1542 e_vj = split_block (vcall_bb, vcall_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1543 join_bb = e_vj->dest;
111
kono
parents: 67
diff changeset
1544 join_bb->count = profile_count::from_gcov_type (all);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1545
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1546 e_ci->flags = (e_ci->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1547 e_ci->probability = prob;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1548
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1549 e_cv = make_edge (cond_bb, vcall_bb, EDGE_FALSE_VALUE);
111
kono
parents: 67
diff changeset
1550 e_cv->probability = prob.invert ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1551
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1552 remove_edge (e_iv);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1553
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1554 e_ij = make_edge (icall_bb, join_bb, EDGE_FALLTHRU);
111
kono
parents: 67
diff changeset
1555 e_ij->probability = profile_probability::always ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1556
111
kono
parents: 67
diff changeset
1557 e_vj->probability = profile_probability::always ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1558
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1559 /* Insert PHI node for the call result if necessary. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1560 if (gimple_call_lhs (vcall_stmt)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1561 && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1562 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1563 tree result = gimple_call_lhs (vcall_stmt);
111
kono
parents: 67
diff changeset
1564 gphi *phi = create_phi_node (result, join_bb);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1565 gimple_call_set_lhs (vcall_stmt,
111
kono
parents: 67
diff changeset
1566 duplicate_ssa_name (result, vcall_stmt));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1567 add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1568 gimple_call_set_lhs (icall_stmt,
111
kono
parents: 67
diff changeset
1569 duplicate_ssa_name (result, icall_stmt));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1570 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1571 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1572
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1573 /* Because these are all string op builtins, they're all nothrow. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1574 gcc_assert (!stmt_could_throw_p (cfun, vcall_stmt));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1575 gcc_assert (!stmt_could_throw_p (cfun, icall_stmt));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1576 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1577
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1578 /* Find values inside STMT for that we want to measure histograms for
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1579 division/modulo optimization. */
111
kono
parents: 67
diff changeset
1580
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1581 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1582 gimple_stringops_transform (gimple_stmt_iterator *gsi)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1583 {
111
kono
parents: 67
diff changeset
1584 gcall *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1585 tree blck_size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1586 enum built_in_function fcode;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1587 histogram_value histogram;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1588 gcov_type count, all, val;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1589 tree dest, src;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1590 unsigned int dest_align, src_align;
111
kono
parents: 67
diff changeset
1591 profile_probability prob;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1592 tree tree_val;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1593 int size_arg;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1594
111
kono
parents: 67
diff changeset
1595 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
kono
parents: 67
diff changeset
1596 if (!stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1597 return false;
111
kono
parents: 67
diff changeset
1598
kono
parents: 67
diff changeset
1599 if (!gimple_call_builtin_p (gsi_stmt (*gsi), BUILT_IN_NORMAL))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1600 return false;
111
kono
parents: 67
diff changeset
1601
kono
parents: 67
diff changeset
1602 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1603 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1604
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1605 blck_size = gimple_call_arg (stmt, size_arg);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1606 if (TREE_CODE (blck_size) == INTEGER_CST)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1607 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1608
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1609 histogram = gimple_histogram_value_of_type (cfun, stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1610 HIST_TYPE_TOPN_VALUES);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1611 if (!histogram)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1612 return false;
111
kono
parents: 67
diff changeset
1613
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1614 if (!get_nth_most_common_value (stmt, "stringops", histogram, &val, &count,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1615 &all))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1616 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1617
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1618 gimple_remove_histogram_value (cfun, stmt, histogram);
111
kono
parents: 67
diff changeset
1619
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1620 /* We require that count is at least half of all. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1621 if (2 * count < all || optimize_bb_for_size_p (gimple_bb (stmt)))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1622 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1623 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1624 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1625 if (all > 0)
111
kono
parents: 67
diff changeset
1626 prob = profile_probability::probability_in_gcov_type (count, all);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1627 else
111
kono
parents: 67
diff changeset
1628 prob = profile_probability::never ();
kono
parents: 67
diff changeset
1629
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1630 dest = gimple_call_arg (stmt, 0);
111
kono
parents: 67
diff changeset
1631 dest_align = get_pointer_alignment (dest);
kono
parents: 67
diff changeset
1632 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (stmt));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1633 switch (fcode)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1634 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1635 case BUILT_IN_MEMCPY:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1636 case BUILT_IN_MEMPCPY:
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1637 case BUILT_IN_MEMMOVE:
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1638 src = gimple_call_arg (stmt, 1);
111
kono
parents: 67
diff changeset
1639 src_align = get_pointer_alignment (src);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1640 if (!can_move_by_pieces (val, MIN (dest_align, src_align)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1641 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1642 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1643 case BUILT_IN_MEMSET:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1644 if (!can_store_by_pieces (val, builtin_memset_read_str,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1645 gimple_call_arg (stmt, 1),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1646 dest_align, true))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1647 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1648 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1649 case BUILT_IN_BZERO:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1650 if (!can_store_by_pieces (val, builtin_memset_read_str,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1651 integer_zero_node,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1652 dest_align, true))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1653 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1654 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1655 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1656 gcc_unreachable ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1657 }
111
kono
parents: 67
diff changeset
1658
kono
parents: 67
diff changeset
1659 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
kono
parents: 67
diff changeset
1660 tree_val = build_int_cst (get_gcov_type (), val);
kono
parents: 67
diff changeset
1661 else
kono
parents: 67
diff changeset
1662 {
kono
parents: 67
diff changeset
1663 HOST_WIDE_INT a[2];
kono
parents: 67
diff changeset
1664 a[0] = (unsigned HOST_WIDE_INT) val;
kono
parents: 67
diff changeset
1665 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
kono
parents: 67
diff changeset
1666
kono
parents: 67
diff changeset
1667 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
kono
parents: 67
diff changeset
1668 TYPE_PRECISION (get_gcov_type ()), false));
kono
parents: 67
diff changeset
1669 }
kono
parents: 67
diff changeset
1670
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1671 if (dump_enabled_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1672 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1673 "Transformation done: single value %i stringop for %s\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1674 (int)val, built_in_names[(int)fcode]);
111
kono
parents: 67
diff changeset
1675
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1676 gimple_stringop_fixed_value (stmt, tree_val, prob, count, all);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1677
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1678 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1679 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1680
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1681 void
111
kono
parents: 67
diff changeset
1682 stringop_block_profile (gimple *stmt, unsigned int *expected_align,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1683 HOST_WIDE_INT *expected_size)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1684 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1685 histogram_value histogram;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1686 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_AVERAGE);
111
kono
parents: 67
diff changeset
1687
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1688 if (!histogram)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1689 *expected_size = -1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1690 else if (!histogram->hvalue.counters[1])
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1691 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1692 *expected_size = -1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1693 gimple_remove_histogram_value (cfun, stmt, histogram);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1694 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1695 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1696 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1697 gcov_type size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1698 size = ((histogram->hvalue.counters[0]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1699 + histogram->hvalue.counters[1] / 2)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1700 / histogram->hvalue.counters[1]);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1701 /* Even if we can hold bigger value in SIZE, INT_MAX
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1702 is safe "infinity" for code generation strategies. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1703 if (size > INT_MAX)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1704 size = INT_MAX;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1705 *expected_size = size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1706 gimple_remove_histogram_value (cfun, stmt, histogram);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1707 }
111
kono
parents: 67
diff changeset
1708
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1709 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_IOR);
111
kono
parents: 67
diff changeset
1710
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1711 if (!histogram)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1712 *expected_align = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1713 else if (!histogram->hvalue.counters[0])
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1714 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1715 gimple_remove_histogram_value (cfun, stmt, histogram);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1716 *expected_align = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1717 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1718 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1719 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1720 gcov_type count;
111
kono
parents: 67
diff changeset
1721 unsigned int alignment;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1722
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1723 count = histogram->hvalue.counters[0];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1724 alignment = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1725 while (!(count & alignment)
111
kono
parents: 67
diff changeset
1726 && (alignment <= UINT_MAX / 2 / BITS_PER_UNIT))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1727 alignment <<= 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1728 *expected_align = alignment * BITS_PER_UNIT;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1729 gimple_remove_histogram_value (cfun, stmt, histogram);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1730 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1731 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1732
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1733
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1734 /* Find values inside STMT for that we want to measure histograms for
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1735 division/modulo optimization. */
111
kono
parents: 67
diff changeset
1736
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1737 static void
111
kono
parents: 67
diff changeset
1738 gimple_divmod_values_to_profile (gimple *stmt, histogram_values *values)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1739 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1740 tree lhs, divisor, op0, type;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1741 histogram_value hist;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1742
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1743 if (gimple_code (stmt) != GIMPLE_ASSIGN)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1744 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1745
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1746 lhs = gimple_assign_lhs (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1747 type = TREE_TYPE (lhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1748 if (!INTEGRAL_TYPE_P (type))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1749 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1750
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1751 switch (gimple_assign_rhs_code (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1752 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1753 case TRUNC_DIV_EXPR:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1754 case TRUNC_MOD_EXPR:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1755 divisor = gimple_assign_rhs2 (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1756 op0 = gimple_assign_rhs1 (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1757
111
kono
parents: 67
diff changeset
1758 if (TREE_CODE (divisor) == SSA_NAME)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1759 /* Check for the case where the divisor is the same value most
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1760 of the time. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1761 values->safe_push (gimple_alloc_histogram_value (cfun,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1762 HIST_TYPE_TOPN_VALUES,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1763 stmt, divisor));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1764
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1765 /* For mod, check whether it is not often a noop (or replaceable by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1766 a few subtractions). */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1767 if (gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR
111
kono
parents: 67
diff changeset
1768 && TYPE_UNSIGNED (type)
kono
parents: 67
diff changeset
1769 && TREE_CODE (divisor) == SSA_NAME)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1770 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1771 tree val;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1772 /* Check for a special case where the divisor is power of 2. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1773 values->safe_push (gimple_alloc_histogram_value (cfun,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1774 HIST_TYPE_POW2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1775 stmt, divisor));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1776 val = build2 (TRUNC_DIV_EXPR, type, op0, divisor);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1777 hist = gimple_alloc_histogram_value (cfun, HIST_TYPE_INTERVAL,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1778 stmt, val);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1779 hist->hdata.intvl.int_start = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1780 hist->hdata.intvl.steps = 2;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1781 values->safe_push (hist);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1782 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1783 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1784
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1785 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1786 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1787 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1788 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1789
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1790 /* Find calls inside STMT for that we want to measure histograms for
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1791 indirect/virtual call optimization. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1792
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1793 static void
111
kono
parents: 67
diff changeset
1794 gimple_indirect_call_to_profile (gimple *stmt, histogram_values *values)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1795 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1796 tree callee;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1797
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1798 if (gimple_code (stmt) != GIMPLE_CALL
111
kono
parents: 67
diff changeset
1799 || gimple_call_internal_p (stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1800 || gimple_call_fndecl (stmt) != NULL_TREE)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1801 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1802
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1803 callee = gimple_call_fn (stmt);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1804 histogram_value v = gimple_alloc_histogram_value (cfun, HIST_TYPE_INDIR_CALL,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1805 stmt, callee);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1806 values->safe_push (v);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1807
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1808 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1809 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1810
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1811 /* Find values inside STMT for that we want to measure histograms for
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1812 string operations. */
111
kono
parents: 67
diff changeset
1813
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1814 static void
111
kono
parents: 67
diff changeset
1815 gimple_stringops_values_to_profile (gimple *gs, histogram_values *values)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1816 {
111
kono
parents: 67
diff changeset
1817 gcall *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1818 tree blck_size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1819 tree dest;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1820 int size_arg;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1821
111
kono
parents: 67
diff changeset
1822 stmt = dyn_cast <gcall *> (gs);
kono
parents: 67
diff changeset
1823 if (!stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1824 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1825
111
kono
parents: 67
diff changeset
1826 if (!gimple_call_builtin_p (gs, BUILT_IN_NORMAL))
kono
parents: 67
diff changeset
1827 return;
kono
parents: 67
diff changeset
1828
kono
parents: 67
diff changeset
1829 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1830 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1831
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1832 dest = gimple_call_arg (stmt, 0);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1833 blck_size = gimple_call_arg (stmt, size_arg);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1834
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1835 if (TREE_CODE (blck_size) != INTEGER_CST)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1836 {
111
kono
parents: 67
diff changeset
1837 values->safe_push (gimple_alloc_histogram_value (cfun,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1838 HIST_TYPE_TOPN_VALUES,
111
kono
parents: 67
diff changeset
1839 stmt, blck_size));
kono
parents: 67
diff changeset
1840 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE,
kono
parents: 67
diff changeset
1841 stmt, blck_size));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1842 }
111
kono
parents: 67
diff changeset
1843
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1844 if (TREE_CODE (blck_size) != INTEGER_CST)
111
kono
parents: 67
diff changeset
1845 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_IOR,
kono
parents: 67
diff changeset
1846 stmt, dest));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1847 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1848
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1849 /* Find values inside STMT for that we want to measure histograms and adds
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1850 them to list VALUES. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1851
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1852 static void
111
kono
parents: 67
diff changeset
1853 gimple_values_to_profile (gimple *stmt, histogram_values *values)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1854 {
111
kono
parents: 67
diff changeset
1855 gimple_divmod_values_to_profile (stmt, values);
kono
parents: 67
diff changeset
1856 gimple_stringops_values_to_profile (stmt, values);
kono
parents: 67
diff changeset
1857 gimple_indirect_call_to_profile (stmt, values);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1858 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1859
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1860 void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1861 gimple_find_values_to_profile (histogram_values *values)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1862 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1863 basic_block bb;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1864 gimple_stmt_iterator gsi;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1865 unsigned i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1866 histogram_value hist = NULL;
111
kono
parents: 67
diff changeset
1867 values->create (0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1868
111
kono
parents: 67
diff changeset
1869 FOR_EACH_BB_FN (bb, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1870 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1871 gimple_values_to_profile (gsi_stmt (gsi), values);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1872
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1873 values->safe_push (gimple_alloc_histogram_value (cfun,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1874 HIST_TYPE_TIME_PROFILE));
111
kono
parents: 67
diff changeset
1875
kono
parents: 67
diff changeset
1876 FOR_EACH_VEC_ELT (*values, i, hist)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1877 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1878 switch (hist->type)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1879 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1880 case HIST_TYPE_INTERVAL:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1881 hist->n_counters = hist->hdata.intvl.steps + 2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1882 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1883
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1884 case HIST_TYPE_POW2:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1885 hist->n_counters = 2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1886 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1887
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1888 case HIST_TYPE_TOPN_VALUES:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1889 case HIST_TYPE_INDIR_CALL:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1890 hist->n_counters = GCOV_TOPN_VALUES_COUNTERS;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1891 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1892
111
kono
parents: 67
diff changeset
1893 case HIST_TYPE_TIME_PROFILE:
kono
parents: 67
diff changeset
1894 hist->n_counters = 1;
kono
parents: 67
diff changeset
1895 break;
kono
parents: 67
diff changeset
1896
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1897 case HIST_TYPE_AVERAGE:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1898 hist->n_counters = 2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1899 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1900
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1901 case HIST_TYPE_IOR:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1902 hist->n_counters = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1903 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1904
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1905 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1906 gcc_unreachable ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1907 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1908 if (dump_file && hist->hvalue.stmt != NULL)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1909 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1910 fprintf (dump_file, "Stmt ");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1911 print_gimple_stmt (dump_file, hist->hvalue.stmt, 0, TDF_SLIM);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1912 dump_histogram_value (dump_file, hist);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1913 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1914 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1915 }