annotate gcc/optinfo.cc @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* Optimization information.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 Copyright (C) 2018 Free Software Foundation, Inc.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 This file is part of GCC.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 version.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 for more details.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 #include "config.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 #include "system.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 #include "coretypes.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 #include "backend.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 #include "tree.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 #include "gimple.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 #include "optinfo.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 #include "optinfo-emit-json.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 #include "dump-context.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 #include "pretty-print.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 #include "gimple-pretty-print.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 #include "cgraph.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 #include "selftest.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 /* optinfo_item's ctor. Takes ownership of TEXT. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 optinfo_item::optinfo_item (enum optinfo_item_kind kind, location_t location,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 char *text)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 : m_kind (kind), m_location (location), m_text (text)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 /* optinfo_item's dtor. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 optinfo_item::~optinfo_item ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 free (m_text);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 /* Get a string from KIND. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 const char *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 optinfo_kind_to_string (enum optinfo_kind kind)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 switch (kind)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 default:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 gcc_unreachable ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 case OPTINFO_KIND_SUCCESS:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 return "success";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 case OPTINFO_KIND_FAILURE:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 return "failure";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 case OPTINFO_KIND_NOTE:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 return "note";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 case OPTINFO_KIND_SCOPE:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 return "scope";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 /* optinfo's dtor. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 optinfo::~optinfo ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 /* Cleanup. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 unsigned i;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 optinfo_item *item;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 FOR_EACH_VEC_ELT (m_items, i, item)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 delete item;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 /* Add ITEM to this optinfo. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 optinfo::add_item (optinfo_item *item)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 gcc_assert (item);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 m_items.safe_push (item);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 /* Get MSG_* flags corresponding to KIND. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 static dump_flags_t
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 optinfo_kind_to_dump_flag (enum optinfo_kind kind)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 switch (kind)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 default:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 gcc_unreachable ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 case OPTINFO_KIND_SUCCESS:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 return MSG_OPTIMIZED_LOCATIONS;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 case OPTINFO_KIND_FAILURE:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 return MSG_MISSED_OPTIMIZATION;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 case OPTINFO_KIND_NOTE:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 case OPTINFO_KIND_SCOPE:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 return MSG_NOTE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 /* Re-emit this optinfo, both to the "non-immediate" destinations,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 *and* to the "immediate" destinations. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 optinfo::emit_for_opt_problem () const
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 dump_flags_t dump_kind = optinfo_kind_to_dump_flag (get_kind ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 dump_kind |= MSG_PRIORITY_REEMITTED;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 /* Re-emit to "immediate" destinations, without creating a new optinfo. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 dump_context::get ().dump_loc_immediate (dump_kind, get_dump_location ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 unsigned i;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 optinfo_item *item;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 FOR_EACH_VEC_ELT (m_items, i, item)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 dump_context::get ().emit_item (item, dump_kind);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 /* Re-emit to "non-immediate" destinations. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 emit ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 /* Emit the optinfo to all of the "non-immediate" destinations
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 (emission to "immediate" destinations is done by
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 dump_context::emit_item). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 optinfo::emit () const
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 /* -fsave-optimization-record. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 optimization_records_maybe_record_optinfo (this);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 /* Update the optinfo's kind based on DUMP_KIND. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 optinfo::handle_dump_file_kind (dump_flags_t dump_kind)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 if (dump_kind & MSG_OPTIMIZED_LOCATIONS)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148 m_kind = OPTINFO_KIND_SUCCESS;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 else if (dump_kind & MSG_MISSED_OPTIMIZATION)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150 m_kind = OPTINFO_KIND_FAILURE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 else if (dump_kind & MSG_NOTE)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 m_kind = OPTINFO_KIND_NOTE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 /* Should optinfo instances be created?
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 All creation of optinfos should be guarded by this predicate.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157 Return true if any optinfo destinations are active. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 bool optinfo_enabled_p ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 return (dump_context::get ().forcibly_enable_optinfo_p ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 || optimization_records_enabled_p ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165 /* Return true if any of the active optinfo destinations make use
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 of inlining information.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 (if true, then the information is preserved). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 bool optinfo_wants_inlining_info_p ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 return optimization_records_enabled_p ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172 }