annotate gcc/opt-problem.cc @ 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
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* Rich optional information on why an optimization wasn't possible.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2018-2020 Free Software Foundation, Inc.
131
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 #include "backend.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 #include "tree.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 #include "gimple.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 #include "pretty-print.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 #include "opt-problem.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 #include "dump-context.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 #include "tree-pass.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 #include "selftest.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 /* opt_problem's ctor.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 Use FMT and AP to emit a message to the "immediate" dump destinations
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 as if via:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc, ...)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 The optinfo_item instances are not emitted yet. Instead, they
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 are retained internally so that the message can be replayed and
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 emitted when this problem is handled, higher up the call stack. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 opt_problem::opt_problem (const dump_location_t &loc,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 const char *fmt, va_list *ap)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 : m_optinfo (loc, OPTINFO_KIND_FAILURE, current_pass)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 /* We shouldn't be bothering to construct these objects if
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 dumping isn't enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 gcc_assert (dump_enabled_p ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 /* Update the singleton. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 delete s_the_problem;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 s_the_problem = this;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 /* Print the location to the "immediate" dump destinations. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 dump_context &dc = dump_context::get ();
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
57 dc.dump_loc (MSG_MISSED_OPTIMIZATION, loc.get_user_location ());
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 /* Print the formatted string to this opt_problem's optinfo, dumping
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 the items to the "immediate" dump destinations, and storing items
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 for later retrieval. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 dump_pretty_printer pp (&dump_context::get (), MSG_MISSED_OPTIMIZATION);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 text_info text;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 text.err_no = errno;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 text.args_ptr = ap;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 text.format_spec = fmt; /* No i18n is performed. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 /* Phases 1 and 2, using pp_format. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 pp_format (&pp, &text);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 /* Phase 3: dump the items to the "immediate" dump destinations,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 and storing them into m_optinfo for later retrieval. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 pp.emit_items (&m_optinfo);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 /* Emit this problem and delete it, clearing the current opt_problem. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 opt_problem::emit_and_clear ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 gcc_assert (this == s_the_problem);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 m_optinfo.emit_for_opt_problem ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 delete this;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 s_the_problem = NULL;
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 /* The singleton opt_problem *. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 opt_problem *opt_problem::s_the_problem;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 #if CHECKING_P
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 namespace selftest {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 static opt_result
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 function_that_succeeds ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 return opt_result::success ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 /* Verify that opt_result::success works. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 static void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 test_opt_result_success ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 /* Run all tests twice, with and then without dumping enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 for (int i = 0 ; i < 2; i++)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 bool with_dumping = (i == 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 temp_dump_context tmp (with_dumping, with_dumping,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 MSG_ALL_KINDS | MSG_ALL_PRIORITIES);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 if (with_dumping)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 gcc_assert (dump_enabled_p ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 gcc_assert (!dump_enabled_p ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 opt_result res = function_that_succeeds ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 /* Verify that "success" can be used as a "true" boolean. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 ASSERT_TRUE (res);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 /* Verify the underlying opt_wrapper<bool>. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 ASSERT_TRUE (res.get_result ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 ASSERT_EQ (res.get_problem (), NULL);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 /* Nothing should have been dumped. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134 ASSERT_DUMPED_TEXT_EQ (tmp, "");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 ASSERT_EQ (info, NULL);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 /* Example of a function that fails, with a non-trivial
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 pre-canned error message. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 static opt_result
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 function_that_fails (const greturn *stmt)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 gcc_assert (stmt);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 gcc_assert (gimple_return_retval (stmt));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 AUTO_DUMP_SCOPE ("function_that_fails", stmt);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 return opt_result::failure_at (stmt,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 "can't handle return type: %T for stmt: %G",
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 TREE_TYPE (gimple_return_retval (stmt)),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 static_cast <const gimple *> (stmt));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157 /* Example of a function that indirectly fails. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 static opt_result
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 function_that_indirectly_fails (const greturn *stmt)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 AUTO_DUMP_SCOPE ("function_that_indirectly_fails", stmt);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 opt_result res = function_that_fails (stmt);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165 if (!res)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 return res;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 return opt_result::success ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170 /* Verify that opt_result::failure_at works.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 Simulate a failure handling a stmt at one location whilst considering
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172 an optimization that's notionally at another location (as a microcosm
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173 of e.g. a problematic statement within a loop that prevents loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174 vectorization). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176 static void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177 test_opt_result_failure_at (const line_table_case &case_)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
179 /* Generate a location_t for testing. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
180 line_table_test ltt (case_);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
181 const line_map_ordinary *ord_map
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
182 = linemap_check_ordinary (linemap_add (line_table, LC_ENTER, false,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183 "test.c", 0));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
184 linemap_line_start (line_table, 5, 100);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
185
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
186 /* A test location: "test.c:5:10". */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187 const location_t line_5 = linemap_position_for_column (line_table, 10);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
188
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
189 /* Another test location: "test.c:6:12". */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190 const location_t line_6
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
191 = linemap_position_for_line_and_column (line_table, ord_map, 6, 12);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
192
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
193 if (line_6 > LINE_MAP_MAX_LOCATION_WITH_COLS)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
194 return;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
195
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
196 /* Generate statements using "line_5" and "line_6" for testing. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
197 greturn *stmt_at_5 = gimple_build_return (integer_one_node);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
198 gimple_set_location (stmt_at_5, line_5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
199
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
200 greturn *stmt_at_6 = gimple_build_return (integer_zero_node);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
201 gimple_set_location (stmt_at_6, line_6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
202
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
203 /* Run with and then without dumping enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
204 for (int i = 0; i < 2; i++)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
205 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
206 bool with_dumping = (i == 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
207
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
208 /* Run with all 4 combinations of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
209 with and without MSG_PRIORITY_INTERNALS and
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
210 with and without MSG_PRIORITY_REEMITTED. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
211 for (int j = 0; j < 4; j++)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
212 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
213 dump_flags_t filter = MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
214 if (j / 2)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
215 filter |= MSG_PRIORITY_INTERNALS;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
216 if (j % 2)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
217 filter |= MSG_PRIORITY_REEMITTED;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
218
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
219 temp_dump_context tmp (with_dumping, with_dumping, filter);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
220
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
221 if (with_dumping)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
222 gcc_assert (dump_enabled_p ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
223 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
224 gcc_assert (!dump_enabled_p ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
225
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
226 /* Simulate attempting to optimize "stmt_at_6". */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
227 opt_result res = function_that_indirectly_fails (stmt_at_6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
228
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
229 /* Verify that "failure" can be used as a "false" boolean. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
230 ASSERT_FALSE (res);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
231
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
232 /* Verify the underlying opt_wrapper<bool>. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
233 ASSERT_FALSE (res.get_result ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
234 opt_problem *problem = res.get_problem ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
235
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
236 if (with_dumping)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
237 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
238 ASSERT_NE (problem, NULL);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
239 ASSERT_EQ (problem->get_dump_location ().get_location_t (),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
240 line_6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
241 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
242 /* Verify that the problem captures the implementation location
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
243 it was emitted from. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
244 const dump_impl_location_t &impl_location
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
245 = problem->get_dump_location ().get_impl_location ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
246 ASSERT_STR_CONTAINS (impl_location.m_function,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
247 "function_that_fails");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
248 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
249
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
250 /* Verify that the underlying dump items are retained in the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
251 opt_problem. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
252 const optinfo &info = problem->get_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
253 ASSERT_EQ (info.get_dump_location ().get_location_t (), line_6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
254 ASSERT_EQ (info.num_items (), 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
255 ASSERT_IS_TEXT (info.get_item (0), "can't handle return type: ");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
256 ASSERT_IS_TREE (info.get_item (1), UNKNOWN_LOCATION, "int");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
257 ASSERT_IS_TEXT (info.get_item (2), " for stmt: ");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
258 ASSERT_IS_GIMPLE (info.get_item (3), line_6, "return 0;\n");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
259
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
260 /* ...but not in the dump_context's pending_optinfo. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
261 ASSERT_EQ (tmp.get_pending_optinfo (), NULL);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
262
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
263 /* Simulate emitting a high-level summary message, followed
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
264 by the problem. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
265 dump_printf_loc (MSG_MISSED_OPTIMIZATION, stmt_at_5,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
266 "can't optimize loop\n");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
267 problem->emit_and_clear ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
268 ASSERT_EQ (res.get_problem (), NULL);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
269
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
270 /* Verify that the error message was dumped (when the failure
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
271 occurred). We can't use a switch here as not all of the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
272 values are const expressions (using C++98). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
273 dump_flags_t effective_filter
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
274 = filter & (MSG_PRIORITY_INTERNALS | MSG_PRIORITY_REEMITTED);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
275 if (effective_filter
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
276 == (MSG_PRIORITY_INTERNALS | MSG_PRIORITY_REEMITTED))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
277 /* The -fopt-info-internals case. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
278 ASSERT_DUMPED_TEXT_EQ
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
279 (tmp,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
280 "test.c:6:12: note: === function_that_indirectly_fails"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
281 " ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
282 "test.c:6:12: note: === function_that_fails ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
283 "test.c:6:12: missed: can't handle return type: int"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
284 " for stmt: return 0;\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
285 "test.c:5:10: missed: can't optimize loop\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
286 "test.c:6:12: missed: can't handle return type: int"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
287 " for stmt: return 0;\n");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
288 else if (effective_filter == MSG_PRIORITY_INTERNALS)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
289 /* The default for dump files. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
290 ASSERT_DUMPED_TEXT_EQ
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
291 (tmp,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
292 "test.c:6:12: note: === function_that_indirectly_fails"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
293 " ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
294 "test.c:6:12: note: === function_that_fails ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
295 "test.c:6:12: missed: can't handle return type: int"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
296 " for stmt: return 0;\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
297 "test.c:5:10: missed: can't optimize loop\n");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
298 else if (effective_filter == MSG_PRIORITY_REEMITTED)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
299 /* The default when -fopt-info is enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
300 ASSERT_DUMPED_TEXT_EQ
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
301 (tmp,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
302 "test.c:5:10: missed: can't optimize loop\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
303 "test.c:6:12: missed: can't handle return type: int"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
304 " for stmt: return 0;\n");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
305 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
306 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
307 gcc_assert (effective_filter == 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
308 ASSERT_DUMPED_TEXT_EQ
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
309 (tmp,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
310 "test.c:5:10: missed: can't optimize loop\n");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
311 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
312 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
313 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
314 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
315 /* If dumping was disabled, then no problem should have been
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
316 created, and nothing should have been dumped. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
317 ASSERT_EQ (problem, NULL);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
318 ASSERT_DUMPED_TEXT_EQ (tmp, "");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
319 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
320 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
321 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
322 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
323
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
324 /* Run all of the selftests within this file. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
325
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
326 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
327 opt_problem_cc_tests ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
328 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
329 test_opt_result_success ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
330 for_each_line_table_case (test_opt_result_failure_at);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
331 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
332
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
333 } // namespace selftest
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
334
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
335 #endif /* CHECKING_P */