Branch data Line data Source code
1 : : /* Optimization information.
2 : : Copyright (C) 2018-2024 Free Software Foundation, Inc.
3 : : Contributed by David Malcolm <dmalcolm@redhat.com>.
4 : :
5 : : This file is part of GCC.
6 : :
7 : : GCC is free software; you can redistribute it and/or modify it under
8 : : the terms of the GNU General Public License as published by the Free
9 : : Software Foundation; either version 3, or (at your option) any later
10 : : version.
11 : :
12 : : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 : : WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 : : for more details.
16 : :
17 : : You should have received a copy of the GNU General Public License
18 : : along with GCC; see the file COPYING3. If not see
19 : : <http://www.gnu.org/licenses/>. */
20 : :
21 : : #include "config.h"
22 : : #include "system.h"
23 : : #include "coretypes.h"
24 : :
25 : : #include "backend.h"
26 : : #include "tree.h"
27 : : #include "gimple.h"
28 : :
29 : : #include "optinfo.h"
30 : : #include "optinfo-emit-json.h"
31 : : #include "dump-context.h"
32 : : #include "pretty-print.h"
33 : : #include "gimple-pretty-print.h"
34 : : #include "cgraph.h"
35 : : #include "selftest.h"
36 : :
37 : : /* optinfo_item's ctor. Takes ownership of TEXT. */
38 : :
39 : 19819876 : optinfo_item::optinfo_item (enum optinfo_item_kind kind, location_t location,
40 : 19819876 : char *text)
41 : 19819876 : : m_kind (kind), m_location (location), m_text (text)
42 : : {
43 : 19819876 : }
44 : :
45 : : /* optinfo_item's dtor. */
46 : :
47 : 19817631 : optinfo_item::~optinfo_item ()
48 : : {
49 : 19817631 : free (m_text);
50 : 19817631 : }
51 : :
52 : : /* Get a string from KIND. */
53 : :
54 : : const char *
55 : 49889 : optinfo_kind_to_string (enum optinfo_kind kind)
56 : : {
57 : 49889 : switch (kind)
58 : : {
59 : 0 : default:
60 : 0 : gcc_unreachable ();
61 : : case OPTINFO_KIND_SUCCESS:
62 : : return "success";
63 : 2024 : case OPTINFO_KIND_FAILURE:
64 : 2024 : return "failure";
65 : 43349 : case OPTINFO_KIND_NOTE:
66 : 43349 : return "note";
67 : 4177 : case OPTINFO_KIND_SCOPE:
68 : 4177 : return "scope";
69 : : }
70 : : }
71 : :
72 : : /* optinfo's dtor. */
73 : :
74 : 81248 : optinfo::~optinfo ()
75 : : {
76 : : /* Cleanup. */
77 : 81248 : unsigned i;
78 : 81248 : optinfo_item *item;
79 : 247381 : FOR_EACH_VEC_ELT (m_items, i, item)
80 : 166133 : delete item;
81 : 81248 : }
82 : :
83 : : /* Add ITEM to this optinfo. */
84 : :
85 : : void
86 : 168378 : optinfo::add_item (std::unique_ptr<optinfo_item> item)
87 : : {
88 : 168378 : gcc_assert (item.get ());
89 : 168378 : m_items.safe_push (item.release ());
90 : 168378 : }
91 : :
92 : : /* Get MSG_* flags corresponding to KIND. */
93 : :
94 : : static dump_flags_t
95 : 5540 : optinfo_kind_to_dump_flag (enum optinfo_kind kind)
96 : : {
97 : 5540 : switch (kind)
98 : : {
99 : 0 : default:
100 : 0 : gcc_unreachable ();
101 : : case OPTINFO_KIND_SUCCESS:
102 : : return MSG_OPTIMIZED_LOCATIONS;
103 : : case OPTINFO_KIND_FAILURE:
104 : : return MSG_MISSED_OPTIMIZATION;
105 : : case OPTINFO_KIND_NOTE:
106 : : case OPTINFO_KIND_SCOPE:
107 : : return MSG_NOTE;
108 : : }
109 : : }
110 : :
111 : : /* Re-emit this optinfo, both to the "non-immediate" destinations,
112 : : *and* to the "immediate" destinations. */
113 : :
114 : : void
115 : 5540 : optinfo::emit_for_opt_problem () const
116 : : {
117 : 5540 : dump_flags_t dump_kind = optinfo_kind_to_dump_flag (get_kind ());
118 : 5540 : dump_kind |= MSG_PRIORITY_REEMITTED;
119 : :
120 : : /* Re-emit to "immediate" destinations, without creating a new optinfo. */
121 : 5540 : dump_context::get ().dump_loc_immediate (dump_kind, get_user_location ());
122 : 5540 : unsigned i;
123 : 5540 : optinfo_item *item;
124 : 20987 : FOR_EACH_VEC_ELT (m_items, i, item)
125 : 9907 : dump_context::get ().emit_item (*item, dump_kind);
126 : :
127 : : /* Re-emit to "non-immediate" destinations. */
128 : 5540 : dump_context::get ().emit_optinfo (this);
129 : 5540 : }
130 : :
131 : : /* Update the optinfo's kind based on DUMP_KIND. */
132 : :
133 : : void
134 : 50890 : optinfo::handle_dump_file_kind (dump_flags_t dump_kind)
135 : : {
136 : : /* Any optinfo for a "scope" should have been emitted separately. */
137 : 50890 : gcc_assert (m_kind != OPTINFO_KIND_SCOPE);
138 : :
139 : 50890 : if (dump_kind & MSG_OPTIMIZED_LOCATIONS)
140 : 395 : m_kind = OPTINFO_KIND_SUCCESS;
141 : 50495 : else if (dump_kind & MSG_MISSED_OPTIMIZATION)
142 : 2017 : m_kind = OPTINFO_KIND_FAILURE;
143 : 48478 : else if (dump_kind & MSG_NOTE)
144 : 48478 : m_kind = OPTINFO_KIND_NOTE;
145 : 50890 : }
146 : :
147 : : /* Return true if any of the active optinfo destinations make use
148 : : of inlining information.
149 : : (if true, then the information is preserved). */
150 : :
151 : 1427248 : bool optinfo_wants_inlining_info_p ()
152 : : {
153 : 1427248 : return dump_context::get ().optimization_records_enabled_p ();
154 : : }
|