Line data Source code
1 : /* Gimple IR support functions.
2 :
3 : Copyright (C) 2007-2026 Free Software Foundation, Inc.
4 : Contributed by Aldy Hernandez <aldyh@redhat.com>
5 :
6 : This file is part of GCC.
7 :
8 : GCC is free software; you can redistribute it and/or modify it under
9 : the terms of the GNU General Public License as published by the Free
10 : Software Foundation; either version 3, or (at your option) any later
11 : version.
12 :
13 : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 : WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 : for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with GCC; see the file COPYING3. If not see
20 : <http://www.gnu.org/licenses/>. */
21 :
22 : #include "config.h"
23 : #include "system.h"
24 : #include "coretypes.h"
25 : #include "backend.h"
26 : #include "tree.h"
27 : #include "gimple.h"
28 : #include "ssa.h"
29 : #include "cgraph.h"
30 : #include "diagnostic.h"
31 : #include "alias.h"
32 : #include "fold-const.h"
33 : #include "calls.h"
34 : #include "stor-layout.h"
35 : #include "internal-fn.h"
36 : #include "tree-eh.h"
37 : #include "gimple-iterator.h"
38 : #include "gimple-walk.h"
39 : #include "gimplify.h"
40 : #include "target.h"
41 : #include "builtins.h"
42 : #include "selftest.h"
43 : #include "gimple-pretty-print.h"
44 : #include "stringpool.h"
45 : #include "attribs.h"
46 : #include "asan.h"
47 : #include "ubsan.h"
48 : #include "langhooks.h"
49 : #include "attr-fnspec.h"
50 : #include "ipa-modref-tree.h"
51 : #include "ipa-modref.h"
52 : #include "dbgcnt.h"
53 :
54 : /* All the tuples have their operand vector (if present) at the very bottom of
55 : the structure. Therefore, the offset required to find the operands vector is
56 : the size of the structure minus the size of the 1-element tree array at the
57 : end (see gimple_ops). An adjustment may be required if there is tail
58 : padding, as may happen on a host (e.g. sparc) where a pointer has 4-byte
59 : alignment while a uint64_t has 8-byte alignment.
60 :
61 : Unfortunately, we can't use offsetof to do this computation 100%
62 : straightforwardly, because these structs use inheritance and so are not
63 : standard layout types. However, the fact that they are not standard layout
64 : types also means that tail padding will be reused in inheritance, which makes
65 : it possible to check for the problematic case with the following logic
66 : instead. If tail padding is detected, the offset should be decreased
67 : accordingly. */
68 :
69 : template<typename G>
70 : static constexpr size_t
71 : get_tail_padding_adjustment ()
72 : {
73 : struct padding_check : G
74 : {
75 : tree t;
76 : };
77 : return sizeof (padding_check) == sizeof (G) ? sizeof (tree) : 0;
78 : }
79 :
80 : #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) \
81 : (HAS_TREE_OP \
82 : ? sizeof (STRUCT) - sizeof (tree) - get_tail_padding_adjustment<STRUCT> () \
83 : : 0),
84 : EXPORTED_CONST size_t gimple_ops_offset_[] = {
85 : #include "gsstruct.def"
86 : };
87 : #undef DEFGSSTRUCT
88 :
89 : #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) sizeof (struct STRUCT),
90 : static const size_t gsstruct_code_size[] = {
91 : #include "gsstruct.def"
92 : };
93 : #undef DEFGSSTRUCT
94 :
95 : #define DEFGSCODE(SYM, NAME, GSSCODE) NAME,
96 : const char *const gimple_code_name[] = {
97 : #include "gimple.def"
98 : };
99 : #undef DEFGSCODE
100 :
101 : #define DEFGSCODE(SYM, NAME, GSSCODE) GSSCODE,
102 : EXPORTED_CONST enum gimple_statement_structure_enum gss_for_code_[] = {
103 : #include "gimple.def"
104 : };
105 : #undef DEFGSCODE
106 :
107 : /* Gimple stats. */
108 :
109 : uint64_t gimple_alloc_counts[(int) gimple_alloc_kind_all];
110 : uint64_t gimple_alloc_sizes[(int) gimple_alloc_kind_all];
111 :
112 : /* Keep in sync with gimple.h:enum gimple_alloc_kind. */
113 : static const char * const gimple_alloc_kind_names[] = {
114 : "assignments",
115 : "phi nodes",
116 : "conditionals",
117 : "everything else"
118 : };
119 :
120 : /* Static gimple tuple members. */
121 : const enum gimple_code gassign::code_;
122 : const enum gimple_code gcall::code_;
123 : const enum gimple_code gcond::code_;
124 :
125 :
126 : /* Gimple tuple constructors.
127 : Note: Any constructor taking a ``gimple_seq'' as a parameter, can
128 : be passed a NULL to start with an empty sequence. */
129 :
130 : /* Set the code for statement G to CODE. */
131 :
132 : static inline void
133 339098913 : gimple_set_code (gimple *g, enum gimple_code code)
134 : {
135 339098913 : g->code = code;
136 : }
137 :
138 : /* Return the number of bytes needed to hold a GIMPLE statement with
139 : code CODE. */
140 :
141 : size_t
142 416336462 : gimple_size (enum gimple_code code, unsigned num_ops)
143 : {
144 416336462 : size_t size = gsstruct_code_size[gss_for_code (code)];
145 416336462 : if (num_ops > 0)
146 283857268 : size += (sizeof (tree) * (num_ops - 1));
147 416336462 : return size;
148 : }
149 :
150 : /* Initialize GIMPLE statement G with CODE and NUM_OPS. */
151 :
152 : void
153 339098913 : gimple_init (gimple *g, enum gimple_code code, unsigned num_ops)
154 : {
155 339098913 : gimple_set_code (g, code);
156 339098913 : gimple_set_num_ops (g, num_ops);
157 :
158 : /* Do not call gimple_set_modified here as it has other side
159 : effects and this tuple is still not completely built. */
160 339098913 : g->modified = 1;
161 339098913 : gimple_init_singleton (g);
162 339098913 : }
163 :
164 : /* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS
165 : operands. */
166 :
167 : gimple *
168 337375943 : gimple_alloc (enum gimple_code code, unsigned num_ops MEM_STAT_DECL)
169 : {
170 337375943 : size_t size;
171 337375943 : gimple *stmt;
172 :
173 337375943 : size = gimple_size (code, num_ops);
174 337375943 : if (GATHER_STATISTICS)
175 : {
176 : enum gimple_alloc_kind kind = gimple_alloc_kind (code);
177 : gimple_alloc_counts[(int) kind]++;
178 : gimple_alloc_sizes[(int) kind] += size;
179 : }
180 :
181 337375943 : stmt = ggc_alloc_cleared_gimple_statement_stat (size PASS_MEM_STAT);
182 337375943 : gimple_init (stmt, code, num_ops);
183 337375943 : return stmt;
184 : }
185 :
186 : /* Set SUBCODE to be the code of the expression computed by statement G. */
187 :
188 : static inline void
189 240316021 : gimple_set_subcode (gimple *g, unsigned subcode)
190 : {
191 : /* We only have 16 bits for the RHS code. Assert that we are not
192 : overflowing it. */
193 240316021 : gcc_assert (subcode < (1 << 16));
194 240316021 : g->subcode = subcode;
195 240316021 : }
196 :
197 :
198 :
199 : /* Build a tuple with operands. CODE is the statement to build (which
200 : must be one of the GIMPLE_WITH_OPS tuples). SUBCODE is the subcode
201 : for the new tuple. NUM_OPS is the number of operands to allocate. */
202 :
203 : #define gimple_build_with_ops(c, s, n) \
204 : gimple_build_with_ops_stat (c, s, n MEM_STAT_INFO)
205 :
206 : static gimple *
207 228902242 : gimple_build_with_ops_stat (enum gimple_code code, unsigned subcode,
208 : unsigned num_ops MEM_STAT_DECL)
209 : {
210 0 : gimple *s = gimple_alloc (code, num_ops PASS_MEM_STAT);
211 228902242 : gimple_set_subcode (s, subcode);
212 :
213 228902242 : return s;
214 : }
215 :
216 :
217 : /* Build a GIMPLE_RETURN statement returning RETVAL. */
218 :
219 : greturn *
220 3701628 : gimple_build_return (tree retval)
221 : {
222 3701628 : greturn *s
223 3701628 : = as_a <greturn *> (gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK,
224 : 2));
225 3701628 : if (retval)
226 2242634 : gimple_return_set_retval (s, retval);
227 3701628 : return s;
228 : }
229 :
230 : /* Reset alias information on call S. */
231 :
232 : void
233 19103457 : gimple_call_reset_alias_info (gcall *s)
234 : {
235 19103457 : if (gimple_call_flags (s) & ECF_CONST)
236 2431418 : memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution));
237 : else
238 16672039 : pt_solution_reset (gimple_call_use_set (s));
239 19103457 : if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
240 3692289 : memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution));
241 : else
242 15411168 : pt_solution_reset (gimple_call_clobber_set (s));
243 19103457 : }
244 :
245 : /* Helper for gimple_build_call, gimple_build_call_valist,
246 : gimple_build_call_vec and gimple_build_call_from_tree. Build the basic
247 : components of a GIMPLE_CALL statement to function FN with NARGS
248 : arguments. */
249 :
250 : static inline gcall *
251 12455737 : gimple_build_call_1 (tree fn, unsigned nargs)
252 : {
253 12455737 : gcall *s
254 24911474 : = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
255 : nargs + 3));
256 12455737 : if (TREE_CODE (fn) == FUNCTION_DECL)
257 12233762 : fn = build_fold_addr_expr (fn);
258 12455737 : gimple_set_op (s, 1, fn);
259 12455737 : gimple_call_set_fntype (s, TREE_TYPE (TREE_TYPE (fn)));
260 12455737 : gimple_call_reset_alias_info (s);
261 12455737 : return s;
262 : }
263 :
264 :
265 : /* Build a GIMPLE_CALL statement to function FN with the arguments
266 : specified in vector ARGS. */
267 :
268 : gcall *
269 800740 : gimple_build_call_vec (tree fn, const vec<tree> &args)
270 : {
271 800740 : unsigned i;
272 800740 : unsigned nargs = args.length ();
273 800740 : gcall *call = gimple_build_call_1 (fn, nargs);
274 :
275 3510185 : for (i = 0; i < nargs; i++)
276 1908705 : gimple_call_set_arg (call, i, args[i]);
277 :
278 800740 : return call;
279 : }
280 :
281 :
282 : /* Build a GIMPLE_CALL statement to function FN. NARGS is the number of
283 : arguments. The ... are the arguments. */
284 :
285 : gcall *
286 647967 : gimple_build_call (tree fn, unsigned nargs, ...)
287 : {
288 647967 : va_list ap;
289 647967 : gcall *call;
290 647967 : unsigned i;
291 :
292 647967 : gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
293 :
294 647967 : call = gimple_build_call_1 (fn, nargs);
295 :
296 647967 : va_start (ap, nargs);
297 1347533 : for (i = 0; i < nargs; i++)
298 699566 : gimple_call_set_arg (call, i, va_arg (ap, tree));
299 647967 : va_end (ap);
300 :
301 647967 : return call;
302 : }
303 :
304 :
305 : /* Build a GIMPLE_CALL statement to function FN. NARGS is the number of
306 : arguments. AP contains the arguments. */
307 :
308 : gcall *
309 2447 : gimple_build_call_valist (tree fn, unsigned nargs, va_list ap)
310 : {
311 2447 : gcall *call;
312 2447 : unsigned i;
313 :
314 2447 : gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
315 :
316 2447 : call = gimple_build_call_1 (fn, nargs);
317 :
318 11918 : for (i = 0; i < nargs; i++)
319 7024 : gimple_call_set_arg (call, i, va_arg (ap, tree));
320 :
321 2447 : return call;
322 : }
323 :
324 :
325 : /* Helper for gimple_build_call_internal and gimple_build_call_internal_vec.
326 : Build the basic components of a GIMPLE_CALL statement to internal
327 : function FN with NARGS arguments. */
328 :
329 : static inline gcall *
330 870843 : gimple_build_call_internal_1 (enum internal_fn fn, unsigned nargs)
331 : {
332 870843 : gcall *s
333 1741686 : = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
334 : nargs + 3));
335 870843 : s->subcode |= GF_CALL_INTERNAL;
336 870843 : gimple_call_set_internal_fn (s, fn);
337 870843 : gimple_call_reset_alias_info (s);
338 870843 : return s;
339 : }
340 :
341 :
342 : /* Build a GIMPLE_CALL statement to internal function FN. NARGS is
343 : the number of arguments. The ... are the arguments. */
344 :
345 : gcall *
346 482870 : gimple_build_call_internal (enum internal_fn fn, unsigned nargs, ...)
347 : {
348 482870 : va_list ap;
349 482870 : gcall *call;
350 482870 : unsigned i;
351 :
352 482870 : call = gimple_build_call_internal_1 (fn, nargs);
353 482870 : va_start (ap, nargs);
354 1945308 : for (i = 0; i < nargs; i++)
355 1462438 : gimple_call_set_arg (call, i, va_arg (ap, tree));
356 482870 : va_end (ap);
357 :
358 482870 : return call;
359 : }
360 :
361 :
362 : /* Build a GIMPLE_CALL statement to internal function FN with the arguments
363 : specified in vector ARGS. */
364 :
365 : gcall *
366 387957 : gimple_build_call_internal_vec (enum internal_fn fn, const vec<tree> &args)
367 : {
368 387957 : unsigned i, nargs;
369 387957 : gcall *call;
370 :
371 387957 : nargs = args.length ();
372 387957 : call = gimple_build_call_internal_1 (fn, nargs);
373 1927496 : for (i = 0; i < nargs; i++)
374 1151582 : gimple_call_set_arg (call, i, args[i]);
375 :
376 387957 : return call;
377 : }
378 :
379 :
380 : /* Build a GIMPLE_CALL statement from CALL_EXPR T. Note that T is
381 : assumed to be in GIMPLE form already. Minimal checking is done of
382 : this fact. */
383 :
384 : gcall *
385 11004599 : gimple_build_call_from_tree (tree t, tree fnptrtype)
386 : {
387 11004599 : unsigned i, nargs;
388 11004599 : gcall *call;
389 :
390 11004599 : gcc_assert (TREE_CODE (t) == CALL_EXPR);
391 :
392 11004599 : nargs = call_expr_nargs (t);
393 :
394 11004599 : tree fndecl = NULL_TREE;
395 11004599 : if (CALL_EXPR_FN (t) == NULL_TREE)
396 16 : call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs);
397 : else
398 : {
399 11004583 : fndecl = get_callee_fndecl (t);
400 11168788 : call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs);
401 : }
402 :
403 30705200 : for (i = 0; i < nargs; i++)
404 19700601 : gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i));
405 :
406 11004599 : gimple_set_block (call, TREE_BLOCK (t));
407 11004599 : gimple_set_location (call, EXPR_LOCATION (t));
408 :
409 : /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL. */
410 11004599 : gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t));
411 11004599 : gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t));
412 11004599 : gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t));
413 11004599 : gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t));
414 11004599 : if (fndecl
415 10840378 : && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
416 13316972 : && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl)))
417 82798 : gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t));
418 10963200 : else if (fndecl
419 21762179 : && (DECL_IS_OPERATOR_NEW_P (fndecl)
420 10741729 : || DECL_IS_OPERATOR_DELETE_P (fndecl)))
421 273384 : gimple_call_set_from_new_or_delete (call, CALL_FROM_NEW_OR_DELETE_P (t));
422 : else
423 21653016 : gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t));
424 11004599 : gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t));
425 11004599 : gimple_call_set_nothrow (call, TREE_NOTHROW (t));
426 11004599 : if (fndecl)
427 10840378 : gimple_call_set_expected_throw (call,
428 10840378 : flags_from_decl_or_type (fndecl)
429 10840378 : & ECF_XTHROW);
430 11004599 : gimple_call_set_by_descriptor (call, CALL_EXPR_BY_DESCRIPTOR (t));
431 11004599 : copy_warning (call, t);
432 :
433 11004599 : if (fnptrtype)
434 : {
435 11004446 : gimple_call_set_fntype (call, TREE_TYPE (fnptrtype));
436 :
437 : /* Check if it's an indirect CALL and the type has the
438 : nocf_check attribute. In that case propagate the information
439 : to the gimple CALL insn. */
440 11004446 : if (!fndecl)
441 : {
442 164068 : gcc_assert (POINTER_TYPE_P (fnptrtype));
443 164068 : tree fntype = TREE_TYPE (fnptrtype);
444 :
445 164068 : if (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (fntype)))
446 21 : gimple_call_set_nocf_check (call, true);
447 : }
448 : }
449 :
450 11004599 : return call;
451 : }
452 :
453 : /* Build a gcall to __builtin_unreachable as rewritten by
454 : -fsanitize=unreachable. */
455 :
456 : gcall *
457 185968 : gimple_build_builtin_unreachable (location_t loc)
458 : {
459 185968 : tree data = NULL_TREE;
460 185968 : tree fn = sanitize_unreachable_fn (&data, loc);
461 185968 : gcall *g = gimple_build_call (fn, data != NULL_TREE, data);
462 185968 : gimple_call_set_ctrl_altering (g, true);
463 185968 : gimple_set_location (g, loc);
464 185968 : return g;
465 : }
466 :
467 : /* Build a GIMPLE_ASSIGN statement.
468 :
469 : LHS of the assignment.
470 : RHS of the assignment which can be unary or binary. */
471 :
472 : gassign *
473 89509836 : gimple_build_assign (tree lhs, tree rhs MEM_STAT_DECL)
474 : {
475 89509836 : enum tree_code subcode;
476 89509836 : tree op1, op2, op3;
477 :
478 89509836 : extract_ops_from_tree (rhs, &subcode, &op1, &op2, &op3);
479 89509836 : return gimple_build_assign (lhs, subcode, op1, op2, op3 PASS_MEM_STAT);
480 : }
481 :
482 :
483 : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
484 : OP1, OP2 and OP3. */
485 :
486 : static inline gassign *
487 96066723 : gimple_build_assign_1 (tree lhs, enum tree_code subcode, tree op1,
488 : tree op2, tree op3 MEM_STAT_DECL)
489 : {
490 96066723 : unsigned num_ops;
491 96066723 : gassign *p;
492 :
493 : /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the
494 : code). */
495 96066723 : num_ops = get_gimple_rhs_num_ops (subcode) + 1;
496 :
497 192133446 : p = as_a <gassign *> (
498 : gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops
499 : PASS_MEM_STAT));
500 96066723 : gimple_assign_set_lhs (p, lhs);
501 : /* For COND_EXPR, op1 should not be a comparison. */
502 96066723 : if (op1 && subcode == COND_EXPR)
503 278882 : gcc_assert (!COMPARISON_CLASS_P (op1));
504 96066723 : gimple_assign_set_rhs1 (p, op1);
505 96066723 : if (op2)
506 : {
507 15158941 : gcc_assert (num_ops > 2);
508 15158941 : gimple_assign_set_rhs2 (p, op2);
509 : }
510 :
511 96066723 : if (op3)
512 : {
513 394321 : gcc_assert (num_ops > 3);
514 394321 : gimple_assign_set_rhs3 (p, op3);
515 : }
516 :
517 96066723 : return p;
518 : }
519 :
520 : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
521 : OP1, OP2 and OP3. */
522 :
523 : gassign *
524 90933304 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
525 : tree op2, tree op3 MEM_STAT_DECL)
526 : {
527 90933304 : return gimple_build_assign_1 (lhs, subcode, op1, op2, op3 PASS_MEM_STAT);
528 : }
529 :
530 : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
531 : OP1 and OP2. */
532 :
533 : gassign *
534 3603301 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
535 : tree op2 MEM_STAT_DECL)
536 : {
537 3603301 : return gimple_build_assign_1 (lhs, subcode, op1, op2, NULL_TREE
538 3603301 : PASS_MEM_STAT);
539 : }
540 :
541 : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operand OP1. */
542 :
543 : gassign *
544 1530118 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1 MEM_STAT_DECL)
545 : {
546 1530118 : return gimple_build_assign_1 (lhs, subcode, op1, NULL_TREE, NULL_TREE
547 1530118 : PASS_MEM_STAT);
548 : }
549 :
550 :
551 : /* Build a GIMPLE_COND statement.
552 :
553 : PRED is the condition used to compare LHS and the RHS.
554 : T_LABEL is the label to jump to if the condition is true.
555 : F_LABEL is the label to jump to otherwise. */
556 :
557 : gcond *
558 8803743 : gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs,
559 : tree t_label, tree f_label)
560 : {
561 8803743 : gcond *p;
562 :
563 8803743 : gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison);
564 17607486 : p = as_a <gcond *> (gimple_build_with_ops (GIMPLE_COND, pred_code, 4));
565 8803743 : gimple_cond_set_lhs (p, lhs);
566 8803743 : gimple_cond_set_rhs (p, rhs);
567 8803743 : gimple_cond_set_true_label (p, t_label);
568 8803743 : gimple_cond_set_false_label (p, f_label);
569 8803743 : return p;
570 : }
571 :
572 : /* Build a GIMPLE_COND statement from the conditional expression tree
573 : COND. T_LABEL and F_LABEL are as in gimple_build_cond. */
574 :
575 : gcond *
576 99504 : gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label)
577 : {
578 99504 : enum tree_code code;
579 99504 : tree lhs, rhs;
580 :
581 99504 : gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
582 99504 : return gimple_build_cond (code, lhs, rhs, t_label, f_label);
583 : }
584 :
585 : /* Set code, lhs, and rhs of a GIMPLE_COND from a suitable
586 : boolean expression tree COND. */
587 :
588 : void
589 412532 : gimple_cond_set_condition_from_tree (gcond *stmt, tree cond)
590 : {
591 412532 : enum tree_code code;
592 412532 : tree lhs, rhs;
593 :
594 412532 : gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
595 412532 : gimple_cond_set_condition (stmt, code, lhs, rhs);
596 412532 : }
597 :
598 : /* Build a GIMPLE_LABEL statement for LABEL. */
599 :
600 : glabel *
601 19746838 : gimple_build_label (tree label)
602 : {
603 19746838 : glabel *p
604 19746838 : = as_a <glabel *> (gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1));
605 19746838 : gimple_label_set_label (p, label);
606 19746838 : return p;
607 : }
608 :
609 : /* Build a GIMPLE_GOTO statement to label DEST. */
610 :
611 : ggoto *
612 7226230 : gimple_build_goto (tree dest)
613 : {
614 7226230 : ggoto *p
615 7226230 : = as_a <ggoto *> (gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1));
616 7226230 : gimple_goto_set_dest (p, dest);
617 7226230 : return p;
618 : }
619 :
620 :
621 : /* Build a GIMPLE_NOP statement. */
622 :
623 : gimple *
624 15896727 : gimple_build_nop (void)
625 : {
626 15896727 : return gimple_alloc (GIMPLE_NOP, 0);
627 : }
628 :
629 :
630 : /* Build a GIMPLE_BIND statement.
631 : VARS are the variables in BODY.
632 : BLOCK is the containing block. */
633 :
634 : gbind *
635 7592475 : gimple_build_bind (tree vars, gimple_seq body, tree block)
636 : {
637 7592475 : gbind *p = as_a <gbind *> (gimple_alloc (GIMPLE_BIND, 0));
638 7592475 : gimple_bind_set_vars (p, vars);
639 7592475 : if (body)
640 1380141 : gimple_bind_set_body (p, body);
641 7592475 : if (block)
642 6065673 : gimple_bind_set_block (p, block);
643 7592475 : return p;
644 : }
645 :
646 : /* Helper function to set the simple fields of a asm stmt.
647 :
648 : STRING is a pointer to a string that is the asm blocks assembly code.
649 : NINPUT is the number of register inputs.
650 : NOUTPUT is the number of register outputs.
651 : NCLOBBERS is the number of clobbered registers.
652 : */
653 :
654 : static inline gasm *
655 87874 : gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs,
656 : unsigned nclobbers, unsigned nlabels)
657 : {
658 87874 : gasm *p;
659 87874 : int size = strlen (string);
660 :
661 87874 : p = as_a <gasm *> (
662 87874 : gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK,
663 : ninputs + noutputs + nclobbers + nlabels));
664 :
665 87874 : p->ni = ninputs;
666 87874 : p->no = noutputs;
667 87874 : p->nc = nclobbers;
668 87874 : p->nl = nlabels;
669 87874 : p->string = ggc_alloc_string (string, size);
670 :
671 87874 : if (GATHER_STATISTICS)
672 : gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size;
673 :
674 87874 : return p;
675 : }
676 :
677 : /* Build a GIMPLE_ASM statement.
678 :
679 : STRING is the assembly code.
680 : NINPUT is the number of register inputs.
681 : NOUTPUT is the number of register outputs.
682 : NCLOBBERS is the number of clobbered registers.
683 : INPUTS is a vector of the input register parameters.
684 : OUTPUTS is a vector of the output register parameters.
685 : CLOBBERS is a vector of the clobbered register parameters.
686 : LABELS is a vector of destination labels. */
687 :
688 : gasm *
689 87874 : gimple_build_asm_vec (const char *string, vec<tree, va_gc> *inputs,
690 : vec<tree, va_gc> *outputs, vec<tree, va_gc> *clobbers,
691 : vec<tree, va_gc> *labels)
692 : {
693 87874 : gasm *p;
694 87874 : unsigned i;
695 :
696 172188 : p = gimple_build_asm_1 (string,
697 : vec_safe_length (inputs),
698 : vec_safe_length (outputs),
699 : vec_safe_length (clobbers),
700 : vec_safe_length (labels));
701 :
702 303684 : for (i = 0; i < vec_safe_length (inputs); i++)
703 47186 : gimple_asm_set_input_op (p, i, (*inputs)[i]);
704 :
705 250598 : for (i = 0; i < vec_safe_length (outputs); i++)
706 66063 : gimple_asm_set_output_op (p, i, (*outputs)[i]);
707 :
708 301644 : for (i = 0; i < vec_safe_length (clobbers); i++)
709 80331 : gimple_asm_set_clobber_op (p, i, (*clobbers)[i]);
710 :
711 88821 : for (i = 0; i < vec_safe_length (labels); i++)
712 947 : gimple_asm_set_label_op (p, i, (*labels)[i]);
713 :
714 87874 : return p;
715 : }
716 :
717 : /* Build a GIMPLE_CATCH statement.
718 :
719 : TYPES are the catch types.
720 : HANDLER is the exception handler. */
721 :
722 : gcatch *
723 41968 : gimple_build_catch (tree types, gimple_seq handler)
724 : {
725 41968 : gcatch *p = as_a <gcatch *> (gimple_alloc (GIMPLE_CATCH, 0));
726 41968 : gimple_catch_set_types (p, types);
727 41968 : if (handler)
728 41956 : gimple_catch_set_handler (p, handler);
729 :
730 41968 : return p;
731 : }
732 :
733 : /* Build a GIMPLE_EH_FILTER statement.
734 :
735 : TYPES are the filter's types.
736 : FAILURE is the filter's failure action. */
737 :
738 : geh_filter *
739 5891 : gimple_build_eh_filter (tree types, gimple_seq failure)
740 : {
741 5891 : geh_filter *p = as_a <geh_filter *> (gimple_alloc (GIMPLE_EH_FILTER, 0));
742 5891 : gimple_eh_filter_set_types (p, types);
743 5891 : if (failure)
744 5891 : gimple_eh_filter_set_failure (p, failure);
745 :
746 5891 : return p;
747 : }
748 :
749 : /* Build a GIMPLE_EH_MUST_NOT_THROW statement. */
750 :
751 : geh_mnt *
752 1381830 : gimple_build_eh_must_not_throw (tree decl)
753 : {
754 1381830 : geh_mnt *p = as_a <geh_mnt *> (gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0));
755 :
756 1381830 : gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
757 1381830 : gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
758 1381830 : gimple_eh_must_not_throw_set_fndecl (p, decl);
759 :
760 1381830 : return p;
761 : }
762 :
763 : /* Build a GIMPLE_EH_ELSE statement. */
764 :
765 : geh_else *
766 554 : gimple_build_eh_else (gimple_seq n_body, gimple_seq e_body)
767 : {
768 554 : geh_else *p = as_a <geh_else *> (gimple_alloc (GIMPLE_EH_ELSE, 0));
769 554 : gimple_eh_else_set_n_body (p, n_body);
770 554 : gimple_eh_else_set_e_body (p, e_body);
771 554 : return p;
772 : }
773 :
774 : /* Build a GIMPLE_TRY statement.
775 :
776 : EVAL is the expression to evaluate.
777 : CLEANUP is the cleanup expression.
778 : KIND is either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY depending on
779 : whether this is a try/catch or a try/finally respectively. */
780 :
781 : gtry *
782 3351340 : gimple_build_try (gimple_seq eval, gimple_seq cleanup,
783 : enum gimple_try_flags kind)
784 : {
785 3351340 : gtry *p;
786 :
787 3351340 : gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY);
788 3351340 : p = as_a <gtry *> (gimple_alloc (GIMPLE_TRY, 0));
789 3351340 : gimple_set_subcode (p, kind);
790 3351340 : if (eval)
791 3255687 : gimple_try_set_eval (p, eval);
792 3351340 : if (cleanup)
793 3351340 : gimple_try_set_cleanup (p, cleanup);
794 :
795 3351340 : return p;
796 : }
797 :
798 : /* Construct a GIMPLE_WITH_CLEANUP_EXPR statement.
799 :
800 : CLEANUP is the cleanup expression. */
801 :
802 : gimple *
803 674730 : gimple_build_wce (gimple_seq cleanup)
804 : {
805 674730 : gimple *p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0);
806 674730 : if (cleanup)
807 674730 : gimple_wce_set_cleanup (p, cleanup);
808 :
809 674730 : return p;
810 : }
811 :
812 :
813 : /* Build a GIMPLE_RESX statement. */
814 :
815 : gresx *
816 974192 : gimple_build_resx (int region)
817 : {
818 974192 : gresx *p
819 974192 : = as_a <gresx *> (gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0));
820 974192 : p->region = region;
821 974192 : return p;
822 : }
823 :
824 :
825 : /* The helper for constructing a gimple switch statement.
826 : INDEX is the switch's index.
827 : NLABELS is the number of labels in the switch excluding the default.
828 : DEFAULT_LABEL is the default label for the switch statement. */
829 :
830 : gswitch *
831 68934 : gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label)
832 : {
833 : /* nlabels + 1 default label + 1 index. */
834 68934 : gcc_checking_assert (default_label);
835 137868 : gswitch *p = as_a <gswitch *> (gimple_build_with_ops (GIMPLE_SWITCH,
836 : ERROR_MARK,
837 : 1 + 1 + nlabels));
838 68934 : gimple_switch_set_index (p, index);
839 68934 : gimple_switch_set_default_label (p, default_label);
840 68934 : return p;
841 : }
842 :
843 : /* Build a GIMPLE_SWITCH statement.
844 :
845 : INDEX is the switch's index.
846 : DEFAULT_LABEL is the default label
847 : ARGS is a vector of labels excluding the default. */
848 :
849 : gswitch *
850 68934 : gimple_build_switch (tree index, tree default_label, const vec<tree> &args)
851 : {
852 68934 : unsigned i, nlabels = args.length ();
853 :
854 68934 : gswitch *p = gimple_build_switch_nlabels (nlabels, index, default_label);
855 :
856 : /* Copy the labels from the vector to the switch statement. */
857 1242440 : for (i = 0; i < nlabels; i++)
858 1104572 : gimple_switch_set_label (p, i + 1, args[i]);
859 :
860 68934 : return p;
861 : }
862 :
863 : /* Build a GIMPLE_EH_DISPATCH statement. */
864 :
865 : geh_dispatch *
866 43547 : gimple_build_eh_dispatch (int region)
867 : {
868 43547 : geh_dispatch *p
869 43547 : = as_a <geh_dispatch *> (
870 : gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0));
871 43547 : p->region = region;
872 43547 : return p;
873 : }
874 :
875 : /* Build a new GIMPLE_DEBUG_BIND statement.
876 :
877 : VAR is bound to VALUE; block and location are taken from STMT. */
878 :
879 : gdebug *
880 71355307 : gimple_build_debug_bind (tree var, tree value, gimple *stmt MEM_STAT_DECL)
881 : {
882 71355307 : gdebug *p
883 71355307 : = as_a <gdebug *> (gimple_build_with_ops_stat (GIMPLE_DEBUG,
884 : (unsigned)GIMPLE_DEBUG_BIND, 2
885 : PASS_MEM_STAT));
886 71355307 : gimple_debug_bind_set_var (p, var);
887 71355307 : gimple_debug_bind_set_value (p, value);
888 71355307 : if (stmt)
889 70323823 : gimple_set_location (p, gimple_location (stmt));
890 :
891 71355307 : return p;
892 : }
893 :
894 :
895 : /* Build a new GIMPLE_DEBUG_SOURCE_BIND statement.
896 :
897 : VAR is bound to VALUE; block and location are taken from STMT. */
898 :
899 : gdebug *
900 752925 : gimple_build_debug_source_bind (tree var, tree value,
901 : gimple *stmt MEM_STAT_DECL)
902 : {
903 752925 : gdebug *p
904 752925 : = as_a <gdebug *> (
905 : gimple_build_with_ops_stat (GIMPLE_DEBUG,
906 : (unsigned)GIMPLE_DEBUG_SOURCE_BIND, 2
907 : PASS_MEM_STAT));
908 :
909 752925 : gimple_debug_source_bind_set_var (p, var);
910 752925 : gimple_debug_source_bind_set_value (p, value);
911 752925 : if (stmt)
912 599397 : gimple_set_location (p, gimple_location (stmt));
913 :
914 752925 : return p;
915 : }
916 :
917 :
918 : /* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at
919 : LOCATION. */
920 :
921 : gdebug *
922 2517013 : gimple_build_debug_begin_stmt (tree block, location_t location
923 : MEM_STAT_DECL)
924 : {
925 2517013 : gdebug *p
926 2517013 : = as_a <gdebug *> (
927 : gimple_build_with_ops_stat (GIMPLE_DEBUG,
928 : (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0
929 : PASS_MEM_STAT));
930 :
931 2517013 : gimple_set_location (p, location);
932 2517013 : gimple_set_block (p, block);
933 2517013 : cfun->debug_marker_count++;
934 :
935 2517013 : return p;
936 : }
937 :
938 :
939 : /* Build a new GIMPLE_DEBUG_INLINE_ENTRY statement in BLOCK at
940 : LOCATION. The BLOCK links to the inlined function. */
941 :
942 : gdebug *
943 4230708 : gimple_build_debug_inline_entry (tree block, location_t location
944 : MEM_STAT_DECL)
945 : {
946 4230708 : gdebug *p
947 4230708 : = as_a <gdebug *> (
948 : gimple_build_with_ops_stat (GIMPLE_DEBUG,
949 : (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0
950 : PASS_MEM_STAT));
951 :
952 4230708 : gimple_set_location (p, location);
953 4230708 : gimple_set_block (p, block);
954 4230708 : cfun->debug_marker_count++;
955 :
956 4230708 : return p;
957 : }
958 :
959 :
960 : /* Build a GIMPLE_OMP_CRITICAL statement.
961 :
962 : BODY is the sequence of statements for which only one thread can execute.
963 : NAME is optional identifier for this critical block.
964 : CLAUSES are clauses for this critical block. */
965 :
966 : gomp_critical *
967 552 : gimple_build_omp_critical (gimple_seq body, tree name, tree clauses)
968 : {
969 552 : gomp_critical *p
970 552 : = as_a <gomp_critical *> (gimple_alloc (GIMPLE_OMP_CRITICAL, 0));
971 552 : gimple_omp_critical_set_name (p, name);
972 552 : gimple_omp_critical_set_clauses (p, clauses);
973 552 : if (body)
974 457 : gimple_omp_set_body (p, body);
975 :
976 552 : return p;
977 : }
978 :
979 : /* Build a GIMPLE_OMP_FOR statement.
980 :
981 : BODY is sequence of statements inside the for loop.
982 : KIND is the `for' variant.
983 : CLAUSES are any of the construct's clauses.
984 : COLLAPSE is the collapse count.
985 : PRE_BODY is the sequence of statements that are loop invariant. */
986 :
987 : gomp_for *
988 53615 : gimple_build_omp_for (gimple_seq body, int kind, tree clauses, size_t collapse,
989 : gimple_seq pre_body)
990 : {
991 53615 : gomp_for *p = as_a <gomp_for *> (gimple_alloc (GIMPLE_OMP_FOR, 0));
992 53615 : if (body)
993 49763 : gimple_omp_set_body (p, body);
994 53615 : gimple_omp_for_set_clauses (p, clauses);
995 53615 : gimple_omp_for_set_kind (p, kind);
996 53615 : p->collapse = collapse;
997 53615 : p->iter = ggc_cleared_vec_alloc<gimple_omp_for_iter> (collapse);
998 :
999 53615 : if (pre_body)
1000 3580 : gimple_omp_for_set_pre_body (p, pre_body);
1001 :
1002 53615 : return p;
1003 : }
1004 :
1005 :
1006 : /* Build a GIMPLE_OMP_PARALLEL statement.
1007 :
1008 : BODY is sequence of statements which are executed in parallel.
1009 : CLAUSES are the OMP parallel construct's clauses.
1010 : CHILD_FN is the function created for the parallel threads to execute.
1011 : DATA_ARG are the shared data argument(s). */
1012 :
1013 : gomp_parallel *
1014 18585 : gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn,
1015 : tree data_arg)
1016 : {
1017 18585 : gomp_parallel *p
1018 18585 : = as_a <gomp_parallel *> (gimple_alloc (GIMPLE_OMP_PARALLEL, 0));
1019 18585 : if (body)
1020 18392 : gimple_omp_set_body (p, body);
1021 18585 : gimple_omp_parallel_set_clauses (p, clauses);
1022 18585 : gimple_omp_parallel_set_child_fn (p, child_fn);
1023 18585 : gimple_omp_parallel_set_data_arg (p, data_arg);
1024 :
1025 18585 : return p;
1026 : }
1027 :
1028 :
1029 : /* Build a GIMPLE_OMP_TASK statement.
1030 :
1031 : BODY is sequence of statements which are executed by the explicit task.
1032 : CLAUSES are the OMP task construct's clauses.
1033 : CHILD_FN is the function created for the parallel threads to execute.
1034 : DATA_ARG are the shared data argument(s).
1035 : COPY_FN is the optional function for firstprivate initialization.
1036 : ARG_SIZE and ARG_ALIGN are size and alignment of the data block. */
1037 :
1038 : gomp_task *
1039 5692 : gimple_build_omp_task (gimple_seq body, tree clauses, tree child_fn,
1040 : tree data_arg, tree copy_fn, tree arg_size,
1041 : tree arg_align)
1042 : {
1043 5692 : gomp_task *p = as_a <gomp_task *> (gimple_alloc (GIMPLE_OMP_TASK, 0));
1044 5692 : if (body)
1045 5599 : gimple_omp_set_body (p, body);
1046 5692 : gimple_omp_task_set_clauses (p, clauses);
1047 5692 : gimple_omp_task_set_child_fn (p, child_fn);
1048 5692 : gimple_omp_task_set_data_arg (p, data_arg);
1049 5692 : gimple_omp_task_set_copy_fn (p, copy_fn);
1050 5692 : gimple_omp_task_set_arg_size (p, arg_size);
1051 5692 : gimple_omp_task_set_arg_align (p, arg_align);
1052 :
1053 5692 : return p;
1054 : }
1055 :
1056 :
1057 : /* Build a GIMPLE_OMP_SECTION statement for a sections statement.
1058 :
1059 : BODY is the sequence of statements in the section. */
1060 :
1061 : gimple *
1062 1279 : gimple_build_omp_section (gimple_seq body)
1063 : {
1064 1279 : gimple *p = gimple_alloc (GIMPLE_OMP_SECTION, 0);
1065 1279 : if (body)
1066 1087 : gimple_omp_set_body (p, body);
1067 :
1068 1279 : return p;
1069 : }
1070 :
1071 :
1072 : /* Build a GIMPLE_OMP_STRUCTURED_BLOCK statement.
1073 :
1074 : BODY is the structured block sequence. */
1075 :
1076 : gimple *
1077 791 : gimple_build_omp_structured_block (gimple_seq body)
1078 : {
1079 791 : gimple *p = gimple_alloc (GIMPLE_OMP_STRUCTURED_BLOCK, 0);
1080 791 : if (body)
1081 791 : gimple_omp_set_body (p, body);
1082 :
1083 791 : return p;
1084 : }
1085 :
1086 :
1087 : /* Build a GIMPLE_OMP_MASTER statement.
1088 :
1089 : BODY is the sequence of statements to be executed by just the master. */
1090 :
1091 : gimple *
1092 874 : gimple_build_omp_master (gimple_seq body)
1093 : {
1094 874 : gimple *p = gimple_alloc (GIMPLE_OMP_MASTER, 0);
1095 874 : if (body)
1096 793 : gimple_omp_set_body (p, body);
1097 :
1098 874 : return p;
1099 : }
1100 :
1101 : /* Build a GIMPLE_OMP_MASKED statement.
1102 :
1103 : BODY is the sequence of statements to be executed by the selected thread(s). */
1104 :
1105 : gimple *
1106 497 : gimple_build_omp_masked (gimple_seq body, tree clauses)
1107 : {
1108 497 : gimple *p = gimple_alloc (GIMPLE_OMP_MASKED, 0);
1109 497 : gimple_omp_masked_set_clauses (p, clauses);
1110 497 : if (body)
1111 417 : gimple_omp_set_body (p, body);
1112 :
1113 497 : return p;
1114 : }
1115 :
1116 : /* Build a GIMPLE_OMP_TASKGROUP statement.
1117 :
1118 : BODY is the sequence of statements to be executed by the taskgroup
1119 : construct.
1120 : CLAUSES are any of the construct's clauses. */
1121 :
1122 : gimple *
1123 611 : gimple_build_omp_taskgroup (gimple_seq body, tree clauses)
1124 : {
1125 611 : gimple *p = gimple_alloc (GIMPLE_OMP_TASKGROUP, 0);
1126 611 : gimple_omp_taskgroup_set_clauses (p, clauses);
1127 611 : if (body)
1128 611 : gimple_omp_set_body (p, body);
1129 :
1130 611 : return p;
1131 : }
1132 :
1133 :
1134 : /* Build a GIMPLE_OMP_CONTINUE statement.
1135 :
1136 : CONTROL_DEF is the definition of the control variable.
1137 : CONTROL_USE is the use of the control variable. */
1138 :
1139 : gomp_continue *
1140 52047 : gimple_build_omp_continue (tree control_def, tree control_use)
1141 : {
1142 52047 : gomp_continue *p
1143 52047 : = as_a <gomp_continue *> (gimple_alloc (GIMPLE_OMP_CONTINUE, 0));
1144 52047 : gimple_omp_continue_set_control_def (p, control_def);
1145 52047 : gimple_omp_continue_set_control_use (p, control_use);
1146 52047 : return p;
1147 : }
1148 :
1149 : /* Build a GIMPLE_OMP_ORDERED statement.
1150 :
1151 : BODY is the sequence of statements inside a loop that will executed in
1152 : sequence.
1153 : CLAUSES are clauses for this statement. */
1154 :
1155 : gomp_ordered *
1156 1852 : gimple_build_omp_ordered (gimple_seq body, tree clauses)
1157 : {
1158 1852 : gomp_ordered *p
1159 1852 : = as_a <gomp_ordered *> (gimple_alloc (GIMPLE_OMP_ORDERED, 0));
1160 1852 : gimple_omp_ordered_set_clauses (p, clauses);
1161 1852 : if (body)
1162 501 : gimple_omp_set_body (p, body);
1163 :
1164 1852 : return p;
1165 : }
1166 :
1167 :
1168 : /* Build a GIMPLE_OMP_RETURN statement.
1169 : WAIT_P is true if this is a non-waiting return. */
1170 :
1171 : gimple *
1172 102221 : gimple_build_omp_return (bool wait_p)
1173 : {
1174 102221 : gimple *p = gimple_alloc (GIMPLE_OMP_RETURN, 0);
1175 102221 : if (wait_p)
1176 37841 : gimple_omp_return_set_nowait (p);
1177 :
1178 102221 : return p;
1179 : }
1180 :
1181 :
1182 : /* Build a GIMPLE_OMP_SCAN statement.
1183 :
1184 : BODY is the sequence of statements to be executed by the scan
1185 : construct.
1186 : CLAUSES are any of the construct's clauses. */
1187 :
1188 : gomp_scan *
1189 1324 : gimple_build_omp_scan (gimple_seq body, tree clauses)
1190 : {
1191 1324 : gomp_scan *p
1192 1324 : = as_a <gomp_scan *> (gimple_alloc (GIMPLE_OMP_SCAN, 0));
1193 1324 : gimple_omp_scan_set_clauses (p, clauses);
1194 1324 : if (body)
1195 1094 : gimple_omp_set_body (p, body);
1196 :
1197 1324 : return p;
1198 : }
1199 :
1200 :
1201 : /* Build a GIMPLE_OMP_SECTIONS statement.
1202 :
1203 : BODY is a sequence of section statements.
1204 : CLAUSES are any of the OMP sections contsruct's clauses: private,
1205 : firstprivate, lastprivate, reduction, and nowait. */
1206 :
1207 : gomp_sections *
1208 634 : gimple_build_omp_sections (gimple_seq body, tree clauses)
1209 : {
1210 634 : gomp_sections *p
1211 634 : = as_a <gomp_sections *> (gimple_alloc (GIMPLE_OMP_SECTIONS, 0));
1212 634 : if (body)
1213 634 : gimple_omp_set_body (p, body);
1214 634 : gimple_omp_sections_set_clauses (p, clauses);
1215 :
1216 634 : return p;
1217 : }
1218 :
1219 :
1220 : /* Build a GIMPLE_OMP_SECTIONS_SWITCH. */
1221 :
1222 : gimple *
1223 386 : gimple_build_omp_sections_switch (void)
1224 : {
1225 386 : return gimple_alloc (GIMPLE_OMP_SECTIONS_SWITCH, 0);
1226 : }
1227 :
1228 :
1229 : /* Build a GIMPLE_OMP_SINGLE statement.
1230 :
1231 : BODY is the sequence of statements that will be executed once.
1232 : CLAUSES are any of the OMP single construct's clauses: private, firstprivate,
1233 : copyprivate, nowait. */
1234 :
1235 : gomp_single *
1236 1287 : gimple_build_omp_single (gimple_seq body, tree clauses)
1237 : {
1238 1287 : gomp_single *p
1239 1287 : = as_a <gomp_single *> (gimple_alloc (GIMPLE_OMP_SINGLE, 0));
1240 1287 : if (body)
1241 1174 : gimple_omp_set_body (p, body);
1242 1287 : gimple_omp_single_set_clauses (p, clauses);
1243 :
1244 1287 : return p;
1245 : }
1246 :
1247 :
1248 : /* Build a GIMPLE_OMP_SCOPE statement.
1249 :
1250 : BODY is the sequence of statements that will be executed once.
1251 : CLAUSES are any of the OMP scope construct's clauses: private, reduction,
1252 : nowait. */
1253 :
1254 : gimple *
1255 242 : gimple_build_omp_scope (gimple_seq body, tree clauses)
1256 : {
1257 242 : gimple *p = gimple_alloc (GIMPLE_OMP_SCOPE, 0);
1258 242 : gimple_omp_scope_set_clauses (p, clauses);
1259 242 : if (body)
1260 168 : gimple_omp_set_body (p, body);
1261 :
1262 242 : return p;
1263 : }
1264 :
1265 : /* Build a GIMPLE_OMP_DISPATCH statement.
1266 :
1267 : BODY is the target function call to be dispatched.
1268 : CLAUSES are any of the OMP dispatch construct's clauses. */
1269 :
1270 : gimple *
1271 852 : gimple_build_omp_dispatch (gimple_seq body, tree clauses)
1272 : {
1273 852 : gimple *p = gimple_alloc (GIMPLE_OMP_DISPATCH, 0);
1274 852 : gimple_omp_dispatch_set_clauses (p, clauses);
1275 852 : if (body)
1276 852 : gimple_omp_set_body (p, body);
1277 :
1278 852 : return p;
1279 : }
1280 :
1281 : /* Build a GIMPLE_OMP_INTEROP statement.
1282 :
1283 : CLAUSES are any of the OMP interop construct's clauses. */
1284 :
1285 : gimple *
1286 612 : gimple_build_omp_interop (tree clauses)
1287 : {
1288 612 : gimple *p = gimple_alloc (GIMPLE_OMP_INTEROP, 0);
1289 612 : gimple_omp_interop_set_clauses (p, clauses);
1290 :
1291 612 : return p;
1292 : }
1293 :
1294 : /* Build a GIMPLE_OMP_TARGET statement.
1295 :
1296 : BODY is the sequence of statements that will be executed.
1297 : KIND is the kind of the region.
1298 : CLAUSES are any of the construct's clauses.
1299 : ITERATOR_LOOPS is an optional sequence containing constructed loops
1300 : for OpenMP iterators. */
1301 :
1302 : gomp_target *
1303 43201 : gimple_build_omp_target (gimple_seq body, int kind, tree clauses,
1304 : gimple_seq iterator_loops)
1305 : {
1306 43201 : gomp_target *p
1307 43201 : = as_a <gomp_target *> (gimple_alloc (GIMPLE_OMP_TARGET, 0));
1308 43201 : if (body)
1309 29386 : gimple_omp_set_body (p, body);
1310 43201 : gimple_omp_target_set_clauses (p, clauses);
1311 43201 : gimple_omp_target_set_kind (p, kind);
1312 43201 : gimple_omp_target_set_iterator_loops (p, iterator_loops);
1313 :
1314 43201 : return p;
1315 : }
1316 :
1317 :
1318 : /* Build a GIMPLE_OMP_TEAMS statement.
1319 :
1320 : BODY is the sequence of statements that will be executed.
1321 : CLAUSES are any of the OMP teams construct's clauses. */
1322 :
1323 : gomp_teams *
1324 8892 : gimple_build_omp_teams (gimple_seq body, tree clauses)
1325 : {
1326 8892 : gomp_teams *p = as_a <gomp_teams *> (gimple_alloc (GIMPLE_OMP_TEAMS, 0));
1327 8892 : if (body)
1328 8892 : gimple_omp_set_body (p, body);
1329 8892 : gimple_omp_teams_set_clauses (p, clauses);
1330 :
1331 8892 : return p;
1332 : }
1333 :
1334 :
1335 : /* Build a GIMPLE_OMP_ATOMIC_LOAD statement. */
1336 :
1337 : gomp_atomic_load *
1338 10327 : gimple_build_omp_atomic_load (tree lhs, tree rhs, enum omp_memory_order mo)
1339 : {
1340 10327 : gomp_atomic_load *p
1341 10327 : = as_a <gomp_atomic_load *> (gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0));
1342 10327 : gimple_omp_atomic_load_set_lhs (p, lhs);
1343 10327 : gimple_omp_atomic_load_set_rhs (p, rhs);
1344 10327 : gimple_omp_atomic_set_memory_order (p, mo);
1345 10327 : return p;
1346 : }
1347 :
1348 : /* Build a GIMPLE_OMP_ATOMIC_STORE statement.
1349 :
1350 : VAL is the value we are storing. */
1351 :
1352 : gomp_atomic_store *
1353 10327 : gimple_build_omp_atomic_store (tree val, enum omp_memory_order mo)
1354 : {
1355 10327 : gomp_atomic_store *p
1356 10327 : = as_a <gomp_atomic_store *> (gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0));
1357 10327 : gimple_omp_atomic_store_set_val (p, val);
1358 10327 : gimple_omp_atomic_set_memory_order (p, mo);
1359 10327 : return p;
1360 : }
1361 :
1362 : /* Build a GIMPLE_ASSUME statement. */
1363 :
1364 : gimple *
1365 128 : gimple_build_assume (tree guard, gimple_seq body)
1366 : {
1367 128 : gimple_statement_assume *p
1368 128 : = as_a <gimple_statement_assume *> (gimple_alloc (GIMPLE_ASSUME, 0));
1369 128 : gimple_assume_set_guard (p, guard);
1370 128 : *gimple_assume_body_ptr (p) = body;
1371 128 : return p;
1372 : }
1373 :
1374 : /* Build a GIMPLE_TRANSACTION statement. */
1375 :
1376 : gtransaction *
1377 545 : gimple_build_transaction (gimple_seq body)
1378 : {
1379 545 : gtransaction *p
1380 545 : = as_a <gtransaction *> (gimple_alloc (GIMPLE_TRANSACTION, 0));
1381 545 : gimple_transaction_set_body (p, body);
1382 545 : gimple_transaction_set_label_norm (p, 0);
1383 545 : gimple_transaction_set_label_uninst (p, 0);
1384 545 : gimple_transaction_set_label_over (p, 0);
1385 545 : return p;
1386 : }
1387 :
1388 : #if defined ENABLE_GIMPLE_CHECKING
1389 : /* Complain of a gimple type mismatch and die. */
1390 :
1391 : void
1392 0 : gimple_check_failed (const gimple *gs, const char *file, int line,
1393 : const char *function, enum gimple_code code,
1394 : enum tree_code subcode)
1395 : {
1396 0 : internal_error ("gimple check: expected %s(%s), have %s(%s) in %s, at %s:%d",
1397 0 : gimple_code_name[code],
1398 : get_tree_code_name (subcode),
1399 0 : gimple_code_name[gimple_code (gs)],
1400 0 : gs->subcode > 0
1401 0 : ? get_tree_code_name ((enum tree_code) gs->subcode)
1402 : : "",
1403 : function, trim_filename (file), line);
1404 : }
1405 : #endif /* ENABLE_GIMPLE_CHECKING */
1406 :
1407 :
1408 : /* Link gimple statement GS to the end of the sequence *SEQ_P. If
1409 : *SEQ_P is NULL, a new sequence is allocated. */
1410 :
1411 : void
1412 48260750 : gimple_seq_add_stmt (gimple_seq *seq_p, gimple *gs)
1413 : {
1414 48260750 : gimple_stmt_iterator si;
1415 48260750 : if (gs == NULL)
1416 0 : return;
1417 :
1418 48260750 : si = gsi_last (*seq_p);
1419 48260750 : gsi_insert_after (&si, gs, GSI_NEW_STMT);
1420 : }
1421 :
1422 : /* Link gimple statement GS to the end of the sequence *SEQ_P. If
1423 : *SEQ_P is NULL, a new sequence is allocated. This function is
1424 : similar to gimple_seq_add_stmt, but does not scan the operands.
1425 : During gimplification, we need to manipulate statement sequences
1426 : before the def/use vectors have been constructed. */
1427 :
1428 : void
1429 199728242 : gimple_seq_add_stmt_without_update (gimple_seq *seq_p, gimple *gs)
1430 : {
1431 199728242 : gimple_stmt_iterator si;
1432 :
1433 199728242 : if (gs == NULL)
1434 0 : return;
1435 :
1436 199728242 : si = gsi_last (*seq_p);
1437 199728242 : gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT);
1438 : }
1439 :
1440 : /* Append sequence SRC to the end of sequence *DST_P. If *DST_P is
1441 : NULL, a new sequence is allocated. */
1442 :
1443 : void
1444 17244288 : gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
1445 : {
1446 17244288 : gimple_stmt_iterator si;
1447 17244288 : if (src == NULL)
1448 5224751 : return;
1449 :
1450 12019537 : si = gsi_last (*dst_p);
1451 12019537 : gsi_insert_seq_after (&si, src, GSI_NEW_STMT);
1452 : }
1453 :
1454 : /* Append sequence SRC to the end of sequence *DST_P. If *DST_P is
1455 : NULL, a new sequence is allocated. This function is
1456 : similar to gimple_seq_add_seq, but does not scan the operands. */
1457 :
1458 : void
1459 279861 : gimple_seq_add_seq_without_update (gimple_seq *dst_p, gimple_seq src)
1460 : {
1461 279861 : gimple_stmt_iterator si;
1462 279861 : if (src == NULL)
1463 98385 : return;
1464 :
1465 181476 : si = gsi_last (*dst_p);
1466 181476 : gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT);
1467 : }
1468 :
1469 : /* Determine whether to assign a location to the statement GS. */
1470 :
1471 : static bool
1472 268449994 : should_carry_location_p (gimple *gs)
1473 : {
1474 : /* Don't emit a line note for a label. We particularly don't want to
1475 : emit one for the break label, since it doesn't actually correspond
1476 : to the beginning of the loop/switch. */
1477 268449994 : if (gimple_code (gs) == GIMPLE_LABEL)
1478 0 : return false;
1479 :
1480 : return true;
1481 : }
1482 :
1483 : /* Set the location for gimple statement GS to LOCATION. */
1484 :
1485 : static void
1486 681869714 : annotate_one_with_location (gimple *gs, location_t location)
1487 : {
1488 681869714 : if (!gimple_has_location (gs)
1489 338105432 : && !gimple_do_not_emit_location_p (gs)
1490 681869714 : && should_carry_location_p (gs))
1491 26349258 : gimple_set_location (gs, location);
1492 681869714 : }
1493 :
1494 : /* Set LOCATION for all the statements after iterator GSI in sequence
1495 : SEQ. If GSI is pointing to the end of the sequence, start with the
1496 : first statement in SEQ. */
1497 :
1498 : void
1499 101197487 : annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
1500 : location_t location)
1501 : {
1502 101197487 : if (gsi_end_p (gsi))
1503 101197487 : gsi = gsi_start (seq);
1504 : else
1505 66103413 : gsi_next (&gsi);
1506 :
1507 782713406 : for (; !gsi_end_p (gsi); gsi_next (&gsi))
1508 681515919 : annotate_one_with_location (gsi_stmt (gsi), location);
1509 101197487 : }
1510 :
1511 : /* Set the location for all the statements in a sequence STMT_P to LOCATION. */
1512 :
1513 : void
1514 231420 : annotate_all_with_location (gimple_seq stmt_p, location_t location)
1515 : {
1516 231420 : gimple_stmt_iterator i;
1517 :
1518 231420 : if (gimple_seq_empty_p (stmt_p))
1519 231420 : return;
1520 :
1521 576508 : for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
1522 : {
1523 353795 : gimple *gs = gsi_stmt (i);
1524 353795 : annotate_one_with_location (gs, location);
1525 : }
1526 : }
1527 :
1528 : /* Helper function of empty_body_p. Return true if STMT is an empty
1529 : statement. */
1530 :
1531 : static bool
1532 36781 : empty_stmt_p (gimple *stmt)
1533 : {
1534 36781 : if (gimple_code (stmt) == GIMPLE_NOP)
1535 : return true;
1536 36779 : if (gbind *bind_stmt = dyn_cast <gbind *> (stmt))
1537 21824 : return empty_body_p (gimple_bind_body (bind_stmt));
1538 : return false;
1539 : }
1540 :
1541 :
1542 : /* Return true if BODY contains nothing but empty statements. */
1543 :
1544 : bool
1545 36860 : empty_body_p (gimple_seq body)
1546 : {
1547 36860 : gimple_stmt_iterator i;
1548 :
1549 36860 : if (gimple_seq_empty_p (body))
1550 : return true;
1551 36968 : for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i))
1552 36781 : if (!empty_stmt_p (gsi_stmt (i))
1553 36781 : && !is_gimple_debug (gsi_stmt (i)))
1554 : return false;
1555 :
1556 : return true;
1557 : }
1558 :
1559 :
1560 : /* Perform a deep copy of sequence SRC and return the result. */
1561 :
1562 : gimple_seq
1563 1911230 : gimple_seq_copy (gimple_seq src)
1564 : {
1565 1911230 : gimple_stmt_iterator gsi;
1566 1911230 : gimple_seq new_seq = NULL;
1567 1911230 : gimple *stmt;
1568 :
1569 4286979 : for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi))
1570 : {
1571 2375749 : stmt = gimple_copy (gsi_stmt (gsi));
1572 2375749 : gimple_seq_add_stmt (&new_seq, stmt);
1573 : }
1574 :
1575 1911230 : return new_seq;
1576 : }
1577 :
1578 :
1579 :
1580 : /* Return true if calls C1 and C2 are known to go to the same function. */
1581 :
1582 : bool
1583 1036842 : gimple_call_same_target_p (const gimple *c1, const gimple *c2)
1584 : {
1585 1036842 : if (gimple_call_internal_p (c1))
1586 8420 : return (gimple_call_internal_p (c2)
1587 8420 : && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2)
1588 16840 : && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1))
1589 0 : || c1 == c2));
1590 : else
1591 1028422 : return (gimple_call_fn (c1) == gimple_call_fn (c2)
1592 1028422 : || (gimple_call_fndecl (c1)
1593 1027793 : && gimple_call_fndecl (c1) == gimple_call_fndecl (c2)));
1594 : }
1595 :
1596 : /* Detect flags from a GIMPLE_CALL. This is just like
1597 : call_expr_flags, but for gimple tuples. */
1598 :
1599 : int
1600 4405236556 : gimple_call_flags (const gimple *stmt)
1601 : {
1602 4405236556 : int flags = 0;
1603 :
1604 4405236556 : if (gimple_call_internal_p (stmt))
1605 123487988 : flags = internal_fn_flags (gimple_call_internal_fn (stmt));
1606 : else
1607 : {
1608 4281748568 : tree decl = gimple_call_fndecl (stmt);
1609 4281748568 : if (decl)
1610 4155846201 : flags = flags_from_decl_or_type (decl);
1611 4281748568 : flags |= flags_from_decl_or_type (gimple_call_fntype (stmt));
1612 : }
1613 :
1614 4405236556 : if (stmt->subcode & GF_CALL_NOTHROW)
1615 782996352 : flags |= ECF_NOTHROW;
1616 4405236556 : if (stmt->subcode & GF_CALL_XTHROW)
1617 16936748 : flags |= ECF_XTHROW;
1618 :
1619 4405236556 : if (stmt->subcode & GF_CALL_BY_DESCRIPTOR)
1620 0 : flags |= ECF_BY_DESCRIPTOR;
1621 :
1622 4405236556 : return flags;
1623 : }
1624 :
1625 : /* Return the "fn spec" string for call STMT. */
1626 :
1627 : attr_fnspec
1628 456858172 : gimple_call_fnspec (const gcall *stmt)
1629 : {
1630 456858172 : tree type, attr;
1631 :
1632 456858172 : if (gimple_call_internal_p (stmt))
1633 : {
1634 9784896 : const_tree spec = internal_fn_fnspec (gimple_call_internal_fn (stmt));
1635 9784896 : if (spec)
1636 394378 : return spec;
1637 : else
1638 9390518 : return "";
1639 : }
1640 :
1641 447073276 : type = gimple_call_fntype (stmt);
1642 447073276 : if (type)
1643 : {
1644 447073276 : attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
1645 447073276 : if (attr)
1646 61660571 : return TREE_VALUE (TREE_VALUE (attr));
1647 : }
1648 385412705 : if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
1649 114984768 : return builtin_fnspec (gimple_call_fndecl (stmt));
1650 270427937 : tree fndecl = gimple_call_fndecl (stmt);
1651 : /* If the call is to a replaceable operator delete and results
1652 : from a delete expression as opposed to a direct call to
1653 : such operator, then we can treat it as free. */
1654 270427937 : if (fndecl
1655 256280137 : && DECL_IS_OPERATOR_DELETE_P (fndecl)
1656 8071399 : && DECL_IS_REPLACEABLE_OPERATOR (fndecl)
1657 278493473 : && gimple_call_from_new_or_delete (stmt))
1658 : {
1659 8009956 : if (flag_assume_sane_operators_new_delete)
1660 8008461 : return ".co ";
1661 : else
1662 1495 : return ". o ";
1663 : }
1664 : /* Similarly operator new can be treated as malloc. */
1665 262417981 : if (fndecl
1666 248270181 : && DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
1667 265645047 : && gimple_call_from_new_or_delete (stmt))
1668 : {
1669 3192157 : if (flag_assume_sane_operators_new_delete)
1670 3191164 : return "mC";
1671 : else
1672 993 : return "m ";
1673 : }
1674 259225824 : return "";
1675 : }
1676 :
1677 : /* Detects argument flags for argument number ARG on call STMT. */
1678 :
1679 : int
1680 125838648 : gimple_call_arg_flags (const gcall *stmt, unsigned arg)
1681 : {
1682 125838648 : attr_fnspec fnspec = gimple_call_fnspec (stmt);
1683 125838648 : int flags = 0;
1684 :
1685 125838648 : if (fnspec.known_p ())
1686 24614908 : flags = fnspec.arg_eaf_flags (arg);
1687 125838648 : tree callee = gimple_call_fndecl (stmt);
1688 125838648 : if (callee)
1689 : {
1690 117755561 : cgraph_node *node = cgraph_node::get (callee);
1691 117755561 : modref_summary *summary = node ? get_modref_function_summary (node)
1692 : : NULL;
1693 :
1694 117536945 : if (summary && summary->arg_flags.length () > arg)
1695 : {
1696 24102200 : int modref_flags = summary->arg_flags[arg];
1697 :
1698 : /* We have possibly optimized out load. Be conservative here. */
1699 24102200 : if (!node->binds_to_current_def_p ())
1700 12123026 : modref_flags = interposable_eaf_flags (modref_flags, flags);
1701 24102200 : if (dbg_cnt (ipa_mod_ref_pta))
1702 24102200 : flags |= modref_flags;
1703 : }
1704 : }
1705 125838648 : return flags;
1706 : }
1707 :
1708 : /* Detects argument flags for return slot on call STMT. */
1709 :
1710 : int
1711 102969 : gimple_call_retslot_flags (const gcall *stmt)
1712 : {
1713 102969 : int flags = implicit_retslot_eaf_flags;
1714 :
1715 102969 : tree callee = gimple_call_fndecl (stmt);
1716 102969 : if (callee)
1717 : {
1718 94205 : cgraph_node *node = cgraph_node::get (callee);
1719 94205 : modref_summary *summary = node ? get_modref_function_summary (node)
1720 : : NULL;
1721 :
1722 94205 : if (summary)
1723 : {
1724 65921 : int modref_flags = summary->retslot_flags;
1725 :
1726 : /* We have possibly optimized out load. Be conservative here. */
1727 65921 : if (!node->binds_to_current_def_p ())
1728 55401 : modref_flags = interposable_eaf_flags (modref_flags, flags);
1729 65921 : if (dbg_cnt (ipa_mod_ref_pta))
1730 65921 : flags |= modref_flags;
1731 : }
1732 : }
1733 102969 : return flags;
1734 : }
1735 :
1736 : /* Detects argument flags for static chain on call STMT. */
1737 :
1738 : int
1739 180519 : gimple_call_static_chain_flags (const gcall *stmt)
1740 : {
1741 180519 : int flags = 0;
1742 :
1743 180519 : tree callee = gimple_call_fndecl (stmt);
1744 180519 : if (callee)
1745 : {
1746 28011 : cgraph_node *node = cgraph_node::get (callee);
1747 28011 : modref_summary *summary = node ? get_modref_function_summary (node)
1748 : : NULL;
1749 :
1750 : /* Nested functions should always bind to current def since
1751 : there is no public ABI for them. */
1752 28011 : gcc_checking_assert (node->binds_to_current_def_p ());
1753 28011 : if (summary)
1754 : {
1755 26174 : int modref_flags = summary->static_chain_flags;
1756 :
1757 26174 : if (dbg_cnt (ipa_mod_ref_pta))
1758 180519 : flags |= modref_flags;
1759 : }
1760 : }
1761 180519 : return flags;
1762 : }
1763 :
1764 : /* Detects return flags for the call STMT. */
1765 :
1766 : int
1767 50098767 : gimple_call_return_flags (const gcall *stmt)
1768 : {
1769 50098767 : if (gimple_call_flags (stmt) & ECF_MALLOC)
1770 : return ERF_NOALIAS;
1771 :
1772 48000875 : attr_fnspec fnspec = gimple_call_fnspec (stmt);
1773 :
1774 48000875 : unsigned int arg_no;
1775 48000875 : if (fnspec.returns_arg (&arg_no))
1776 1132805 : return ERF_RETURNS_ARG | arg_no;
1777 :
1778 46868070 : if (fnspec.returns_noalias_p ())
1779 6076 : return ERF_NOALIAS;
1780 : return 0;
1781 : }
1782 :
1783 :
1784 : /* Return true if call STMT is known to return a non-zero result. */
1785 :
1786 : bool
1787 13686928 : gimple_call_nonnull_result_p (gcall *call)
1788 : {
1789 13686928 : tree fndecl = gimple_call_fndecl (call);
1790 13686928 : if (!fndecl)
1791 : return false;
1792 12508585 : if (flag_delete_null_pointer_checks && !flag_check_new
1793 12508530 : && DECL_IS_OPERATOR_NEW_P (fndecl)
1794 13082765 : && !TREE_NOTHROW (fndecl))
1795 : return true;
1796 :
1797 : /* References are always non-NULL. */
1798 11950271 : if (flag_delete_null_pointer_checks
1799 11950271 : && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE)
1800 : return true;
1801 :
1802 11950271 : if (flag_delete_null_pointer_checks
1803 23894050 : && lookup_attribute ("returns_nonnull",
1804 11943779 : TYPE_ATTRIBUTES (gimple_call_fntype (call))))
1805 : return true;
1806 11883897 : return gimple_alloca_call_p (call);
1807 : }
1808 :
1809 :
1810 : /* If CALL returns a non-null result in an argument, return that arg. */
1811 :
1812 : tree
1813 12989986 : gimple_call_nonnull_arg (gcall *call)
1814 : {
1815 12989986 : tree fndecl = gimple_call_fndecl (call);
1816 12989986 : if (!fndecl)
1817 : return NULL_TREE;
1818 :
1819 11818135 : unsigned rf = gimple_call_return_flags (call);
1820 11818135 : if (rf & ERF_RETURNS_ARG)
1821 : {
1822 0 : unsigned argnum = rf & ERF_RETURN_ARG_MASK;
1823 0 : if (argnum < gimple_call_num_args (call))
1824 : {
1825 0 : tree arg = gimple_call_arg (call, argnum);
1826 0 : if (SSA_VAR_P (arg)
1827 0 : && infer_nonnull_range_by_attribute (call, arg))
1828 0 : return arg;
1829 : }
1830 : }
1831 : return NULL_TREE;
1832 : }
1833 :
1834 :
1835 : /* Return true if GS is a copy assignment. */
1836 :
1837 : bool
1838 204440705 : gimple_assign_copy_p (gimple *gs)
1839 : {
1840 204440705 : return (gimple_assign_single_p (gs)
1841 204440705 : && is_gimple_val (gimple_op (gs, 1)));
1842 : }
1843 :
1844 :
1845 : /* Return true if GS is a SSA_NAME copy assignment. */
1846 :
1847 : bool
1848 41079125 : gimple_assign_ssa_name_copy_p (gimple *gs)
1849 : {
1850 41079125 : return (gimple_assign_single_p (gs)
1851 23294464 : && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME
1852 54608020 : && TREE_CODE (gimple_assign_rhs1 (gs)) == SSA_NAME);
1853 : }
1854 :
1855 :
1856 : /* Return true if GS is an assignment with a unary RHS, but the
1857 : operator has no effect on the assigned value. The logic is adapted
1858 : from STRIP_NOPS. This predicate is intended to be used in tuplifying
1859 : instances in which STRIP_NOPS was previously applied to the RHS of
1860 : an assignment.
1861 :
1862 : NOTE: In the use cases that led to the creation of this function
1863 : and of gimple_assign_single_p, it is typical to test for either
1864 : condition and to proceed in the same manner. In each case, the
1865 : assigned value is represented by the single RHS operand of the
1866 : assignment. I suspect there may be cases where gimple_assign_copy_p,
1867 : gimple_assign_single_p, or equivalent logic is used where a similar
1868 : treatment of unary NOPs is appropriate. */
1869 :
1870 : bool
1871 47195 : gimple_assign_unary_nop_p (gimple *gs)
1872 : {
1873 47195 : return (is_gimple_assign (gs)
1874 47195 : && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs))
1875 41725 : || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR)
1876 5470 : && gimple_assign_rhs1 (gs) != error_mark_node
1877 58135 : && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs)))
1878 5470 : == TYPE_MODE (TREE_TYPE (gimple_assign_rhs1 (gs)))));
1879 : }
1880 :
1881 : /* Return true if GS is an assignment that loads from its rhs1. */
1882 :
1883 : bool
1884 554980759 : gimple_assign_load_p (const gimple *gs)
1885 : {
1886 554980759 : tree rhs;
1887 554980759 : if (!gimple_assign_single_p (gs))
1888 : return false;
1889 337403738 : rhs = gimple_assign_rhs1 (gs);
1890 337403738 : if (TREE_CODE (rhs) == WITH_SIZE_EXPR)
1891 : return true;
1892 337403734 : if (handled_component_p (rhs))
1893 91993888 : rhs = TREE_OPERAND (rhs, 0);
1894 337403734 : return (handled_component_p (rhs)
1895 311086099 : || DECL_P (rhs)
1896 251919958 : || TREE_CODE (rhs) == MEM_REF
1897 185998626 : || TREE_CODE (rhs) == TARGET_MEM_REF);
1898 : }
1899 :
1900 :
1901 : /* Set BB to be the basic block holding G. */
1902 :
1903 : void
1904 767713526 : gimple_set_bb (gimple *stmt, basic_block bb)
1905 : {
1906 767713526 : stmt->bb = bb;
1907 :
1908 767713526 : if (gimple_code (stmt) != GIMPLE_LABEL)
1909 : return;
1910 :
1911 : /* If the statement is a label, add the label to block-to-labels map
1912 : so that we can speed up edge creation for GIMPLE_GOTOs. */
1913 39384383 : if (cfun->cfg)
1914 : {
1915 39384269 : tree t;
1916 39384269 : int uid;
1917 :
1918 39384269 : t = gimple_label_label (as_a <glabel *> (stmt));
1919 39384269 : uid = LABEL_DECL_UID (t);
1920 39384269 : if (uid == -1)
1921 : {
1922 20089181 : unsigned old_len =
1923 20089181 : vec_safe_length (label_to_block_map_for_fn (cfun));
1924 20089181 : LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++;
1925 20089181 : if (old_len <= (unsigned) uid)
1926 9515301 : vec_safe_grow_cleared (label_to_block_map_for_fn (cfun), uid + 1);
1927 : }
1928 :
1929 39384269 : (*label_to_block_map_for_fn (cfun))[uid] = bb;
1930 : }
1931 : }
1932 :
1933 :
1934 : /* Modify the RHS of the assignment pointed-to by GSI using the
1935 : operands in the expression tree EXPR.
1936 :
1937 : NOTE: The statement pointed-to by GSI may be reallocated if it
1938 : did not have enough operand slots.
1939 :
1940 : This function is useful to convert an existing tree expression into
1941 : the flat representation used for the RHS of a GIMPLE assignment.
1942 : It will reallocate memory as needed to expand or shrink the number
1943 : of operand slots needed to represent EXPR.
1944 :
1945 : NOTE: If you find yourself building a tree and then calling this
1946 : function, you are most certainly doing it the slow way. It is much
1947 : better to build a new assignment or to use the function
1948 : gimple_assign_set_rhs_with_ops, which does not require an
1949 : expression tree to be built. */
1950 :
1951 : void
1952 5323685 : gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr)
1953 : {
1954 5323685 : enum tree_code subcode;
1955 5323685 : tree op1, op2, op3;
1956 :
1957 5323685 : extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3);
1958 5323685 : gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3);
1959 5323685 : }
1960 :
1961 :
1962 : /* Set the RHS of assignment statement pointed-to by GSI to CODE with
1963 : operands OP1, OP2 and OP3.
1964 :
1965 : NOTE: The statement pointed-to by GSI may be reallocated if it
1966 : did not have enough operand slots. */
1967 :
1968 : void
1969 8062439 : gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
1970 : tree op1, tree op2, tree op3)
1971 : {
1972 8062439 : unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
1973 8062439 : gimple *stmt = gsi_stmt (*gsi);
1974 8062439 : gimple *old_stmt = stmt;
1975 :
1976 : /* If the new CODE needs more operands, allocate a new statement. */
1977 8062439 : if (gimple_num_ops (stmt) < new_rhs_ops + 1)
1978 : {
1979 207130 : tree lhs = gimple_assign_lhs (old_stmt);
1980 207130 : stmt = gimple_alloc (gimple_code (old_stmt), new_rhs_ops + 1);
1981 207130 : memcpy (stmt, old_stmt, gimple_size (gimple_code (old_stmt)));
1982 207130 : gimple_init_singleton (stmt);
1983 :
1984 : /* The LHS needs to be reset as this also changes the SSA name
1985 : on the LHS. */
1986 207130 : gimple_assign_set_lhs (stmt, lhs);
1987 : }
1988 :
1989 8062439 : gimple_set_num_ops (stmt, new_rhs_ops + 1);
1990 8062439 : gimple_set_subcode (stmt, code);
1991 8062439 : gimple_assign_set_rhs1 (stmt, op1);
1992 8062439 : if (new_rhs_ops > 1)
1993 1191692 : gimple_assign_set_rhs2 (stmt, op2);
1994 1191692 : if (new_rhs_ops > 2)
1995 36358 : gimple_assign_set_rhs3 (stmt, op3);
1996 8062439 : if (stmt != old_stmt)
1997 207130 : gsi_replace (gsi, stmt, false);
1998 8062439 : }
1999 :
2000 :
2001 : /* Return the LHS of a statement that performs an assignment,
2002 : either a GIMPLE_ASSIGN or a GIMPLE_CALL. Returns NULL_TREE
2003 : for a call to a function that returns no value, or for a
2004 : statement other than an assignment or a call. */
2005 :
2006 : tree
2007 7696565031 : gimple_get_lhs (const gimple *stmt)
2008 : {
2009 7696565031 : enum gimple_code code = gimple_code (stmt);
2010 :
2011 7696565031 : if (code == GIMPLE_ASSIGN)
2012 4756024968 : return gimple_assign_lhs (stmt);
2013 2940540063 : else if (code == GIMPLE_CALL)
2014 551786414 : return gimple_call_lhs (stmt);
2015 2388753649 : else if (code == GIMPLE_PHI)
2016 146322511 : return gimple_phi_result (stmt);
2017 : else
2018 : return NULL_TREE;
2019 : }
2020 :
2021 :
2022 : /* Set the LHS of a statement that performs an assignment,
2023 : either a GIMPLE_ASSIGN or a GIMPLE_CALL. */
2024 :
2025 : void
2026 2264501 : gimple_set_lhs (gimple *stmt, tree lhs)
2027 : {
2028 2264501 : enum gimple_code code = gimple_code (stmt);
2029 :
2030 2264501 : if (code == GIMPLE_ASSIGN)
2031 1052447 : gimple_assign_set_lhs (stmt, lhs);
2032 1212054 : else if (code == GIMPLE_CALL)
2033 1212054 : gimple_call_set_lhs (stmt, lhs);
2034 : else
2035 0 : gcc_unreachable ();
2036 2264501 : }
2037 :
2038 :
2039 : /* Return a deep copy of statement STMT. All the operands from STMT
2040 : are reallocated and copied using unshare_expr. The DEF, USE, VDEF
2041 : and VUSE operand arrays are set to empty in the new copy. The new
2042 : copy isn't part of any sequence. */
2043 :
2044 : gimple *
2045 77030419 : gimple_copy (gimple *stmt)
2046 : {
2047 77030419 : enum gimple_code code = gimple_code (stmt);
2048 77030419 : unsigned num_ops = gimple_num_ops (stmt);
2049 77030419 : gimple *copy = gimple_alloc (code, num_ops);
2050 77030419 : unsigned i;
2051 :
2052 : /* Shallow copy all the fields from STMT. */
2053 77030419 : memcpy (copy, stmt, gimple_size (code));
2054 77030419 : gimple_init_singleton (copy);
2055 :
2056 : /* If STMT has sub-statements, deep-copy them as well. */
2057 77030419 : if (gimple_has_substatements (stmt))
2058 : {
2059 42597 : gimple_seq new_seq;
2060 42597 : tree t;
2061 :
2062 42597 : switch (gimple_code (stmt))
2063 : {
2064 357 : case GIMPLE_BIND:
2065 357 : {
2066 357 : gbind *bind_stmt = as_a <gbind *> (stmt);
2067 357 : gbind *bind_copy = as_a <gbind *> (copy);
2068 357 : new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt));
2069 357 : gimple_bind_set_body (bind_copy, new_seq);
2070 357 : gimple_bind_set_vars (bind_copy,
2071 : unshare_expr (gimple_bind_vars (bind_stmt)));
2072 357 : gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt));
2073 : }
2074 357 : break;
2075 :
2076 17498 : case GIMPLE_CATCH:
2077 17498 : {
2078 17498 : gcatch *catch_stmt = as_a <gcatch *> (stmt);
2079 17498 : gcatch *catch_copy = as_a <gcatch *> (copy);
2080 17498 : new_seq = gimple_seq_copy (gimple_catch_handler (catch_stmt));
2081 17498 : gimple_catch_set_handler (catch_copy, new_seq);
2082 17498 : t = unshare_expr (gimple_catch_types (catch_stmt));
2083 17498 : gimple_catch_set_types (catch_copy, t);
2084 : }
2085 17498 : break;
2086 :
2087 0 : case GIMPLE_EH_FILTER:
2088 0 : {
2089 0 : geh_filter *eh_filter_stmt = as_a <geh_filter *> (stmt);
2090 0 : geh_filter *eh_filter_copy = as_a <geh_filter *> (copy);
2091 0 : new_seq
2092 0 : = gimple_seq_copy (gimple_eh_filter_failure (eh_filter_stmt));
2093 0 : gimple_eh_filter_set_failure (eh_filter_copy, new_seq);
2094 0 : t = unshare_expr (gimple_eh_filter_types (eh_filter_stmt));
2095 0 : gimple_eh_filter_set_types (eh_filter_copy, t);
2096 : }
2097 0 : break;
2098 :
2099 273 : case GIMPLE_EH_ELSE:
2100 273 : {
2101 273 : geh_else *eh_else_stmt = as_a <geh_else *> (stmt);
2102 273 : geh_else *eh_else_copy = as_a <geh_else *> (copy);
2103 273 : new_seq = gimple_seq_copy (gimple_eh_else_n_body (eh_else_stmt));
2104 273 : gimple_eh_else_set_n_body (eh_else_copy, new_seq);
2105 273 : new_seq = gimple_seq_copy (gimple_eh_else_e_body (eh_else_stmt));
2106 273 : gimple_eh_else_set_e_body (eh_else_copy, new_seq);
2107 : }
2108 273 : break;
2109 :
2110 24187 : case GIMPLE_TRY:
2111 24187 : {
2112 24187 : gtry *try_stmt = as_a <gtry *> (stmt);
2113 24187 : gtry *try_copy = as_a <gtry *> (copy);
2114 24187 : new_seq = gimple_seq_copy (gimple_try_eval (try_stmt));
2115 24187 : gimple_try_set_eval (try_copy, new_seq);
2116 24187 : new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt));
2117 24187 : gimple_try_set_cleanup (try_copy, new_seq);
2118 : }
2119 24187 : break;
2120 :
2121 276 : case GIMPLE_OMP_FOR:
2122 276 : new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt));
2123 276 : gimple_omp_for_set_pre_body (copy, new_seq);
2124 276 : t = unshare_expr (gimple_omp_for_clauses (stmt));
2125 276 : gimple_omp_for_set_clauses (copy, t);
2126 276 : {
2127 276 : gomp_for *omp_for_copy = as_a <gomp_for *> (copy);
2128 276 : omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter>
2129 276 : ( gimple_omp_for_collapse (stmt));
2130 : }
2131 564 : for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
2132 : {
2133 288 : gimple_omp_for_set_cond (copy, i,
2134 : gimple_omp_for_cond (stmt, i));
2135 288 : gimple_omp_for_set_index (copy, i,
2136 : gimple_omp_for_index (stmt, i));
2137 288 : t = unshare_expr (gimple_omp_for_initial (stmt, i));
2138 288 : gimple_omp_for_set_initial (copy, i, t);
2139 288 : t = unshare_expr (gimple_omp_for_final (stmt, i));
2140 288 : gimple_omp_for_set_final (copy, i, t);
2141 288 : t = unshare_expr (gimple_omp_for_incr (stmt, i));
2142 288 : gimple_omp_for_set_incr (copy, i, t);
2143 : }
2144 276 : goto copy_omp_body;
2145 :
2146 0 : case GIMPLE_OMP_PARALLEL:
2147 0 : {
2148 0 : gomp_parallel *omp_par_stmt = as_a <gomp_parallel *> (stmt);
2149 0 : gomp_parallel *omp_par_copy = as_a <gomp_parallel *> (copy);
2150 0 : t = unshare_expr (gimple_omp_parallel_clauses (omp_par_stmt));
2151 0 : gimple_omp_parallel_set_clauses (omp_par_copy, t);
2152 0 : t = unshare_expr (gimple_omp_parallel_child_fn (omp_par_stmt));
2153 0 : gimple_omp_parallel_set_child_fn (omp_par_copy, t);
2154 0 : t = unshare_expr (gimple_omp_parallel_data_arg (omp_par_stmt));
2155 0 : gimple_omp_parallel_set_data_arg (omp_par_copy, t);
2156 : }
2157 0 : goto copy_omp_body;
2158 :
2159 0 : case GIMPLE_OMP_TASK:
2160 0 : t = unshare_expr (gimple_omp_task_clauses (stmt));
2161 0 : gimple_omp_task_set_clauses (copy, t);
2162 0 : t = unshare_expr (gimple_omp_task_child_fn (stmt));
2163 0 : gimple_omp_task_set_child_fn (copy, t);
2164 0 : t = unshare_expr (gimple_omp_task_data_arg (stmt));
2165 0 : gimple_omp_task_set_data_arg (copy, t);
2166 0 : t = unshare_expr (gimple_omp_task_copy_fn (stmt));
2167 0 : gimple_omp_task_set_copy_fn (copy, t);
2168 0 : t = unshare_expr (gimple_omp_task_arg_size (stmt));
2169 0 : gimple_omp_task_set_arg_size (copy, t);
2170 0 : t = unshare_expr (gimple_omp_task_arg_align (stmt));
2171 0 : gimple_omp_task_set_arg_align (copy, t);
2172 0 : goto copy_omp_body;
2173 :
2174 0 : case GIMPLE_OMP_CRITICAL:
2175 0 : t = unshare_expr (gimple_omp_critical_name
2176 0 : (as_a <gomp_critical *> (stmt)));
2177 0 : gimple_omp_critical_set_name (as_a <gomp_critical *> (copy), t);
2178 0 : t = unshare_expr (gimple_omp_critical_clauses
2179 0 : (as_a <gomp_critical *> (stmt)));
2180 0 : gimple_omp_critical_set_clauses (as_a <gomp_critical *> (copy), t);
2181 0 : goto copy_omp_body;
2182 :
2183 0 : case GIMPLE_OMP_ORDERED:
2184 0 : t = unshare_expr (gimple_omp_ordered_clauses
2185 0 : (as_a <gomp_ordered *> (stmt)));
2186 0 : gimple_omp_ordered_set_clauses (as_a <gomp_ordered *> (copy), t);
2187 0 : goto copy_omp_body;
2188 :
2189 0 : case GIMPLE_OMP_SCAN:
2190 0 : t = gimple_omp_scan_clauses (as_a <gomp_scan *> (stmt));
2191 0 : t = unshare_expr (t);
2192 0 : gimple_omp_scan_set_clauses (as_a <gomp_scan *> (copy), t);
2193 0 : goto copy_omp_body;
2194 :
2195 0 : case GIMPLE_OMP_TASKGROUP:
2196 0 : t = unshare_expr (gimple_omp_taskgroup_clauses (stmt));
2197 0 : gimple_omp_taskgroup_set_clauses (copy, t);
2198 0 : goto copy_omp_body;
2199 :
2200 0 : case GIMPLE_OMP_SECTIONS:
2201 0 : t = unshare_expr (gimple_omp_sections_clauses (stmt));
2202 0 : gimple_omp_sections_set_clauses (copy, t);
2203 0 : t = unshare_expr (gimple_omp_sections_control (stmt));
2204 0 : gimple_omp_sections_set_control (copy, t);
2205 0 : goto copy_omp_body;
2206 :
2207 0 : case GIMPLE_OMP_SINGLE:
2208 0 : {
2209 0 : gomp_single *omp_single_copy = as_a <gomp_single *> (copy);
2210 0 : t = unshare_expr (gimple_omp_single_clauses (stmt));
2211 0 : gimple_omp_single_set_clauses (omp_single_copy, t);
2212 : }
2213 0 : goto copy_omp_body;
2214 :
2215 0 : case GIMPLE_OMP_SCOPE:
2216 0 : t = unshare_expr (gimple_omp_scope_clauses (stmt));
2217 0 : gimple_omp_scope_set_clauses (copy, t);
2218 0 : goto copy_omp_body;
2219 :
2220 0 : case GIMPLE_OMP_DISPATCH:
2221 0 : t = unshare_expr (gimple_omp_dispatch_clauses (stmt));
2222 0 : gimple_omp_dispatch_set_clauses (copy, t);
2223 0 : goto copy_omp_body;
2224 :
2225 0 : case GIMPLE_OMP_INTEROP:
2226 0 : t = unshare_expr (gimple_omp_interop_clauses (stmt));
2227 0 : gimple_omp_interop_set_clauses (copy, t);
2228 0 : break;
2229 :
2230 0 : case GIMPLE_OMP_TARGET:
2231 0 : {
2232 0 : gomp_target *omp_target_stmt = as_a <gomp_target *> (stmt);
2233 0 : gomp_target *omp_target_copy = as_a <gomp_target *> (copy);
2234 0 : t = unshare_expr (gimple_omp_target_clauses (omp_target_stmt));
2235 0 : gimple_omp_target_set_clauses (omp_target_copy, t);
2236 0 : t = unshare_expr (gimple_omp_target_data_arg (omp_target_stmt));
2237 0 : gimple_omp_target_set_data_arg (omp_target_copy, t);
2238 : }
2239 0 : goto copy_omp_body;
2240 :
2241 0 : case GIMPLE_OMP_TEAMS:
2242 0 : {
2243 0 : gomp_teams *omp_teams_copy = as_a <gomp_teams *> (copy);
2244 0 : t = unshare_expr (gimple_omp_teams_clauses (stmt));
2245 0 : gimple_omp_teams_set_clauses (omp_teams_copy, t);
2246 : }
2247 : /* FALLTHRU */
2248 :
2249 276 : case GIMPLE_OMP_SECTION:
2250 276 : case GIMPLE_OMP_MASTER:
2251 276 : case GIMPLE_OMP_STRUCTURED_BLOCK:
2252 276 : copy_omp_body:
2253 276 : new_seq = gimple_seq_copy (gimple_omp_body (stmt));
2254 276 : gimple_omp_set_body (copy, new_seq);
2255 276 : break;
2256 :
2257 0 : case GIMPLE_OMP_MASKED:
2258 0 : t = unshare_expr (gimple_omp_masked_clauses (stmt));
2259 0 : gimple_omp_masked_set_clauses (copy, t);
2260 0 : goto copy_omp_body;
2261 :
2262 0 : case GIMPLE_ASSUME:
2263 0 : new_seq = gimple_seq_copy (gimple_assume_body (stmt));
2264 0 : *gimple_assume_body_ptr (copy) = new_seq;
2265 0 : gimple_assume_set_guard (copy,
2266 : unshare_expr (gimple_assume_guard (stmt)));
2267 0 : break;
2268 :
2269 6 : case GIMPLE_TRANSACTION:
2270 6 : new_seq = gimple_seq_copy (gimple_transaction_body (
2271 6 : as_a <gtransaction *> (stmt)));
2272 6 : gimple_transaction_set_body (as_a <gtransaction *> (copy),
2273 : new_seq);
2274 6 : break;
2275 :
2276 0 : case GIMPLE_WITH_CLEANUP_EXPR:
2277 0 : new_seq = gimple_seq_copy (gimple_wce_cleanup (stmt));
2278 0 : gimple_wce_set_cleanup (copy, new_seq);
2279 0 : break;
2280 :
2281 0 : default:
2282 0 : gcc_unreachable ();
2283 : }
2284 : }
2285 :
2286 77030419 : switch (gimple_code (stmt))
2287 : {
2288 0 : case GIMPLE_OMP_ATOMIC_LOAD:
2289 0 : {
2290 0 : gomp_atomic_load *g = as_a <gomp_atomic_load *> (copy);
2291 0 : gimple_omp_atomic_load_set_lhs (g,
2292 : unshare_expr (gimple_omp_atomic_load_lhs (g)));
2293 0 : gimple_omp_atomic_load_set_rhs (g,
2294 : unshare_expr (gimple_omp_atomic_load_rhs (g)));
2295 0 : break;
2296 : }
2297 0 : case GIMPLE_OMP_ATOMIC_STORE:
2298 0 : {
2299 0 : gomp_atomic_store *g = as_a <gomp_atomic_store *> (copy);
2300 0 : gimple_omp_atomic_store_set_val (g,
2301 : unshare_expr (gimple_omp_atomic_store_val (g)));
2302 0 : break;
2303 : }
2304 : default:
2305 : break;
2306 : }
2307 :
2308 : /* Make copy of operands. */
2309 234659028 : for (i = 0; i < num_ops; i++)
2310 157628609 : gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i)));
2311 :
2312 77030419 : if (gimple_has_mem_ops (stmt))
2313 : {
2314 34916793 : gimple_set_vdef (copy, gimple_vdef (stmt));
2315 34916793 : gimple_set_vuse (copy, gimple_vuse (stmt));
2316 : }
2317 :
2318 : /* Clear out SSA operand vectors on COPY. */
2319 77030419 : if (gimple_has_ops (stmt))
2320 : {
2321 76573994 : gimple_set_use_ops (copy, NULL);
2322 :
2323 : /* SSA operands need to be updated. */
2324 76573994 : gimple_set_modified (copy, true);
2325 : }
2326 :
2327 77030419 : if (gimple_debug_nonbind_marker_p (stmt))
2328 17146172 : cfun->debug_marker_count++;
2329 :
2330 77030419 : return copy;
2331 : }
2332 :
2333 : /* Move OLD_STMT's vuse and vdef operands to NEW_STMT, on the assumption
2334 : that OLD_STMT is about to be removed. */
2335 :
2336 : void
2337 768114 : gimple_move_vops (gimple *new_stmt, gimple *old_stmt)
2338 : {
2339 768114 : tree vdef = gimple_vdef (old_stmt);
2340 1536228 : gimple_set_vuse (new_stmt, gimple_vuse (old_stmt));
2341 768114 : gimple_set_vdef (new_stmt, vdef);
2342 768114 : if (vdef && TREE_CODE (vdef) == SSA_NAME)
2343 267840 : SSA_NAME_DEF_STMT (vdef) = new_stmt;
2344 768114 : }
2345 :
2346 : /* Return true if statement S has side-effects. We consider a
2347 : statement to have side effects if:
2348 :
2349 : - It is a GIMPLE_CALL not marked with ECF_PURE or ECF_CONST.
2350 : - Any of its operands are marked TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS. */
2351 :
2352 : bool
2353 897935792 : gimple_has_side_effects (const gimple *s)
2354 : {
2355 897935792 : if (is_gimple_debug (s))
2356 : return false;
2357 :
2358 : /* We don't have to scan the arguments to check for
2359 : volatile arguments, though, at present, we still
2360 : do a scan to check for TREE_SIDE_EFFECTS. */
2361 1345369519 : if (gimple_has_volatile_ops (s))
2362 : return true;
2363 :
2364 676051713 : if (gimple_code (s) == GIMPLE_ASM
2365 676051713 : && gimple_asm_volatile_p (as_a <const gasm *> (s)))
2366 : return true;
2367 :
2368 675515381 : if (is_gimple_call (s))
2369 : {
2370 97225570 : int flags = gimple_call_flags (s);
2371 :
2372 : /* An infinite loop is considered a side effect. */
2373 97225570 : if (!(flags & (ECF_CONST | ECF_PURE))
2374 19249764 : || (flags & ECF_LOOPING_CONST_OR_PURE))
2375 : return true;
2376 :
2377 17057386 : return false;
2378 : }
2379 :
2380 : return false;
2381 : }
2382 :
2383 : /* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p.
2384 : Return true if S can trap. When INCLUDE_MEM is true, check whether
2385 : the memory operations could trap. When INCLUDE_STORES is true, also
2386 : check a memory LHS with store semantics. */
2387 :
2388 : bool
2389 77085092 : gimple_could_trap_p_1 (const gimple *s, bool include_mem, bool include_stores)
2390 : {
2391 77085092 : tree t, div = NULL_TREE;
2392 77085092 : enum tree_code op;
2393 :
2394 77085092 : if (include_mem)
2395 : {
2396 51944823 : unsigned i, start = 0;
2397 :
2398 : /* Use store semantics for the LHS. A call marked for return-slot
2399 : optimization can still use a temporary and a caller-side copy. */
2400 51944823 : if (include_stores
2401 47640082 : && gimple_store_p (s)
2402 56680416 : && lhs_could_trap_p (gimple_get_lhs (s)))
2403 : return true;
2404 :
2405 52276643 : if (gimple_has_lhs (s))
2406 51368356 : start = 1;
2407 :
2408 132695612 : for (i = start; i < gimple_num_ops (s); i++)
2409 86138640 : if (tree_could_trap_p (gimple_op (s, i)))
2410 : return true;
2411 : }
2412 :
2413 71697241 : switch (gimple_code (s))
2414 : {
2415 10400 : case GIMPLE_ASM:
2416 10400 : return gimple_asm_volatile_p (as_a <const gasm *> (s));
2417 :
2418 1602506 : case GIMPLE_CALL:
2419 1602506 : {
2420 1602506 : if (gimple_call_internal_p (s))
2421 : return false;
2422 1384079 : t = gimple_call_fndecl (s);
2423 : /* Assume that indirect and calls to weak functions may trap. */
2424 1384079 : if (!t || !DECL_P (t) || DECL_WEAK (t))
2425 : return true;
2426 :
2427 : /* Any floating point builtin operation could trap. */
2428 1357421 : if (gimple_call_builtin_p (s))
2429 : {
2430 994068 : if (fndecl_built_in_p (t, BUILT_IN_NORMAL))
2431 888657 : switch (DECL_FUNCTION_CODE (t))
2432 : {
2433 : CASE_FLT_FN (BUILT_IN_COPYSIGN):
2434 : CASE_FLT_FN_FLOATN_NX (BUILT_IN_COPYSIGN):
2435 : return false;
2436 : default:
2437 : break;
2438 : }
2439 943818 : tree type = TREE_TYPE (gimple_call_fntype (s));
2440 943818 : bool fp_operation = FLOAT_TYPE_P (type);
2441 51056 : return fp_operation && flag_trapping_math;
2442 : }
2443 : return false;
2444 : }
2445 58715797 : case GIMPLE_ASSIGN:
2446 58715797 : op = gimple_assign_rhs_code (s);
2447 :
2448 : /* COND_EXPR does not trap. */
2449 58715797 : if (op == COND_EXPR)
2450 : return false;
2451 :
2452 : /* For comparisons we need to check rhs operand types instead of lhs type
2453 : (which is BOOLEAN_TYPE). */
2454 58617230 : if (TREE_CODE_CLASS (op) == tcc_comparison)
2455 2591006 : t = TREE_TYPE (gimple_assign_rhs1 (s));
2456 : else
2457 56026224 : t = TREE_TYPE (gimple_assign_lhs (s));
2458 :
2459 58617230 : if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS)
2460 35329836 : div = gimple_assign_rhs2 (s);
2461 :
2462 61785445 : return (operation_could_trap_p (op, FLOAT_TYPE_P (t),
2463 58617230 : (INTEGRAL_TYPE_P (t)
2464 44626066 : && TYPE_OVERFLOW_TRAPS (t)),
2465 58617230 : div));
2466 :
2467 6450321 : case GIMPLE_COND:
2468 6450321 : t = TREE_TYPE (gimple_cond_lhs (s));
2469 6450321 : return operation_could_trap_p (gimple_cond_code (s),
2470 12900642 : FLOAT_TYPE_P (t), false, NULL_TREE);
2471 :
2472 : default:
2473 : break;
2474 : }
2475 :
2476 : return false;
2477 : }
2478 :
2479 : /* Return true if statement S can trap. */
2480 :
2481 : bool
2482 47640082 : gimple_could_trap_p (const gimple *s)
2483 : {
2484 47640082 : return gimple_could_trap_p_1 (s, true, true);
2485 : }
2486 :
2487 : /* Return true if RHS of a GIMPLE_ASSIGN S can trap. */
2488 :
2489 : bool
2490 3324366 : gimple_assign_rhs_could_trap_p (gimple *s)
2491 : {
2492 3324366 : gcc_assert (is_gimple_assign (s));
2493 3324366 : return gimple_could_trap_p_1 (s, true, false);
2494 : }
2495 :
2496 :
2497 : /* Print debugging information for gimple stmts generated. */
2498 :
2499 : void
2500 0 : dump_gimple_statistics (void)
2501 : {
2502 0 : int i;
2503 0 : uint64_t total_tuples = 0, total_bytes = 0;
2504 :
2505 0 : if (! GATHER_STATISTICS)
2506 : {
2507 0 : fprintf (stderr, "No GIMPLE statistics\n");
2508 0 : return;
2509 : }
2510 :
2511 : fprintf (stderr, "\nGIMPLE statements\n");
2512 : fprintf (stderr, "Kind Stmts Bytes\n");
2513 : fprintf (stderr, "---------------------------------------\n");
2514 : for (i = 0; i < (int) gimple_alloc_kind_all; ++i)
2515 : {
2516 : fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n",
2517 : gimple_alloc_kind_names[i],
2518 : SIZE_AMOUNT (gimple_alloc_counts[i]),
2519 : SIZE_AMOUNT (gimple_alloc_sizes[i]));
2520 : total_tuples += gimple_alloc_counts[i];
2521 : total_bytes += gimple_alloc_sizes[i];
2522 : }
2523 : fprintf (stderr, "---------------------------------------\n");
2524 : fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n", "Total",
2525 : SIZE_AMOUNT (total_tuples), SIZE_AMOUNT (total_bytes));
2526 : fprintf (stderr, "---------------------------------------\n");
2527 : }
2528 :
2529 :
2530 : /* Return the number of operands needed on the RHS of a GIMPLE
2531 : assignment for an expression with tree code CODE. */
2532 :
2533 : unsigned
2534 104429946 : get_gimple_rhs_num_ops (enum tree_code code)
2535 : {
2536 104429946 : switch (get_gimple_rhs_class (code))
2537 : {
2538 : case GIMPLE_UNARY_RHS:
2539 : case GIMPLE_SINGLE_RHS:
2540 : return 1;
2541 : case GIMPLE_BINARY_RHS:
2542 : return 2;
2543 : case GIMPLE_TERNARY_RHS:
2544 : return 3;
2545 0 : default:
2546 0 : gcc_unreachable ();
2547 : }
2548 : }
2549 :
2550 : #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
2551 : (unsigned char) \
2552 : ((TYPE) == tcc_unary ? GIMPLE_UNARY_RHS \
2553 : : ((TYPE) == tcc_binary \
2554 : || (TYPE) == tcc_comparison) ? GIMPLE_BINARY_RHS \
2555 : : ((TYPE) == tcc_constant \
2556 : || (TYPE) == tcc_declaration \
2557 : || (TYPE) == tcc_reference) ? GIMPLE_SINGLE_RHS \
2558 : : ((SYM) == TRUTH_AND_EXPR \
2559 : || (SYM) == TRUTH_OR_EXPR \
2560 : || (SYM) == TRUTH_XOR_EXPR) ? GIMPLE_BINARY_RHS \
2561 : : (SYM) == TRUTH_NOT_EXPR ? GIMPLE_UNARY_RHS \
2562 : : ((SYM) == COND_EXPR \
2563 : || (SYM) == WIDEN_MULT_PLUS_EXPR \
2564 : || (SYM) == WIDEN_MULT_MINUS_EXPR \
2565 : || (SYM) == DOT_PROD_EXPR \
2566 : || (SYM) == SAD_EXPR \
2567 : || (SYM) == REALIGN_LOAD_EXPR \
2568 : || (SYM) == VEC_COND_EXPR \
2569 : || (SYM) == VEC_PERM_EXPR \
2570 : || (SYM) == BIT_INSERT_EXPR) ? GIMPLE_TERNARY_RHS \
2571 : : ((SYM) == CONSTRUCTOR \
2572 : || (SYM) == OBJ_TYPE_REF \
2573 : || (SYM) == ADDR_EXPR \
2574 : || (SYM) == WITH_SIZE_EXPR \
2575 : || (SYM) == SSA_NAME \
2576 : || (SYM) == OMP_NEXT_VARIANT \
2577 : || (SYM) == OMP_TARGET_DEVICE_MATCHES) ? GIMPLE_SINGLE_RHS \
2578 : : GIMPLE_INVALID_RHS),
2579 : #define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS,
2580 :
2581 : const unsigned char gimple_rhs_class_table[] = {
2582 : #include "all-tree.def"
2583 : };
2584 :
2585 : #undef DEFTREECODE
2586 : #undef END_OF_BASE_TREE_CODES
2587 :
2588 : /* Build a GIMPLE_CALL identical to STMT but skipping the arguments in
2589 : the positions marked by the set ARGS_TO_SKIP. */
2590 :
2591 : gcall *
2592 0 : gimple_call_copy_skip_args (gcall *stmt, bitmap args_to_skip)
2593 : {
2594 0 : int i;
2595 0 : int nargs = gimple_call_num_args (stmt);
2596 0 : auto_vec<tree> vargs (nargs);
2597 0 : gcall *new_stmt;
2598 :
2599 0 : for (i = 0; i < nargs; i++)
2600 0 : if (!bitmap_bit_p (args_to_skip, i))
2601 0 : vargs.quick_push (gimple_call_arg (stmt, i));
2602 :
2603 0 : if (gimple_call_internal_p (stmt))
2604 0 : new_stmt = gimple_build_call_internal_vec (gimple_call_internal_fn (stmt),
2605 : vargs);
2606 : else
2607 0 : new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs);
2608 :
2609 0 : if (gimple_call_lhs (stmt))
2610 0 : gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
2611 :
2612 0 : gimple_set_vuse (new_stmt, gimple_vuse (stmt));
2613 0 : gimple_set_vdef (new_stmt, gimple_vdef (stmt));
2614 :
2615 0 : if (gimple_has_location (stmt))
2616 0 : gimple_set_location (new_stmt, gimple_location (stmt));
2617 0 : gimple_call_copy_flags (new_stmt, stmt);
2618 0 : gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
2619 :
2620 0 : gimple_set_modified (new_stmt, true);
2621 :
2622 0 : return new_stmt;
2623 0 : }
2624 :
2625 :
2626 :
2627 : /* Return true if the field decls F1 and F2 are at the same offset.
2628 :
2629 : This is intended to be used on GIMPLE types only. */
2630 :
2631 : bool
2632 62905437 : gimple_compare_field_offset (tree f1, tree f2)
2633 : {
2634 62905437 : if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2))
2635 : {
2636 62905374 : tree offset1 = DECL_FIELD_OFFSET (f1);
2637 62905374 : tree offset2 = DECL_FIELD_OFFSET (f2);
2638 62905374 : return ((offset1 == offset2
2639 : /* Once gimplification is done, self-referential offsets are
2640 : instantiated as operand #2 of the COMPONENT_REF built for
2641 : each access and reset. Therefore, they are not relevant
2642 : anymore and fields are interchangeable provided that they
2643 : represent the same access. */
2644 0 : || (TREE_CODE (offset1) == PLACEHOLDER_EXPR
2645 0 : && TREE_CODE (offset2) == PLACEHOLDER_EXPR
2646 0 : && (DECL_SIZE (f1) == DECL_SIZE (f2)
2647 0 : || (TREE_CODE (DECL_SIZE (f1)) == PLACEHOLDER_EXPR
2648 0 : && TREE_CODE (DECL_SIZE (f2)) == PLACEHOLDER_EXPR)
2649 0 : || operand_equal_p (DECL_SIZE (f1), DECL_SIZE (f2), 0))
2650 0 : && DECL_ALIGN (f1) == DECL_ALIGN (f2))
2651 0 : || operand_equal_p (offset1, offset2, 0))
2652 125810748 : && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1),
2653 62905374 : DECL_FIELD_BIT_OFFSET (f2)));
2654 : }
2655 :
2656 : /* Fortran and C do not always agree on what DECL_OFFSET_ALIGN
2657 : should be, so handle differing ones specially by decomposing
2658 : the offset into a byte and bit offset manually. */
2659 63 : if (tree_fits_shwi_p (DECL_FIELD_OFFSET (f1))
2660 63 : && tree_fits_shwi_p (DECL_FIELD_OFFSET (f2)))
2661 : {
2662 63 : unsigned HOST_WIDE_INT byte_offset1, byte_offset2;
2663 63 : unsigned HOST_WIDE_INT bit_offset1, bit_offset2;
2664 63 : bit_offset1 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f1));
2665 63 : byte_offset1 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f1))
2666 63 : + bit_offset1 / BITS_PER_UNIT);
2667 63 : bit_offset2 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f2));
2668 63 : byte_offset2 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f2))
2669 63 : + bit_offset2 / BITS_PER_UNIT);
2670 63 : if (byte_offset1 != byte_offset2)
2671 : return false;
2672 63 : return bit_offset1 % BITS_PER_UNIT == bit_offset2 % BITS_PER_UNIT;
2673 : }
2674 :
2675 : return false;
2676 : }
2677 :
2678 :
2679 : /* Return a type the same as TYPE except unsigned or
2680 : signed according to UNSIGNEDP. */
2681 :
2682 : static tree
2683 609387 : gimple_signed_or_unsigned_type (bool unsignedp, tree type)
2684 : {
2685 609387 : tree type1;
2686 609387 : int i;
2687 :
2688 609387 : type1 = TYPE_MAIN_VARIANT (type);
2689 609387 : if (type1 == signed_char_type_node
2690 609387 : || type1 == char_type_node
2691 609387 : || type1 == unsigned_char_type_node)
2692 0 : return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2693 609387 : if (type1 == integer_type_node || type1 == unsigned_type_node)
2694 354250 : return unsignedp ? unsigned_type_node : integer_type_node;
2695 255137 : if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
2696 233298 : return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2697 21839 : if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
2698 30 : return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2699 21809 : if (type1 == long_long_integer_type_node
2700 21720 : || type1 == long_long_unsigned_type_node)
2701 89 : return unsignedp
2702 89 : ? long_long_unsigned_type_node
2703 0 : : long_long_integer_type_node;
2704 :
2705 36009 : for (i = 0; i < NUM_INT_N_ENTS; i ++)
2706 21720 : if (int_n_enabled_p[i]
2707 21720 : && (type1 == int_n_trees[i].unsigned_type
2708 14661 : || type1 == int_n_trees[i].signed_type))
2709 7431 : return unsignedp
2710 7431 : ? int_n_trees[i].unsigned_type
2711 7431 : : int_n_trees[i].signed_type;
2712 :
2713 : #if HOST_BITS_PER_WIDE_INT >= 64
2714 14289 : if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
2715 0 : return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2716 : #endif
2717 14289 : if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
2718 0 : return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2719 14289 : if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
2720 0 : return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2721 14289 : if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
2722 0 : return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2723 14289 : if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node)
2724 0 : return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2725 :
2726 : #define GIMPLE_FIXED_TYPES(NAME) \
2727 : if (type1 == short_ ## NAME ## _type_node \
2728 : || type1 == unsigned_short_ ## NAME ## _type_node) \
2729 : return unsignedp ? unsigned_short_ ## NAME ## _type_node \
2730 : : short_ ## NAME ## _type_node; \
2731 : if (type1 == NAME ## _type_node \
2732 : || type1 == unsigned_ ## NAME ## _type_node) \
2733 : return unsignedp ? unsigned_ ## NAME ## _type_node \
2734 : : NAME ## _type_node; \
2735 : if (type1 == long_ ## NAME ## _type_node \
2736 : || type1 == unsigned_long_ ## NAME ## _type_node) \
2737 : return unsignedp ? unsigned_long_ ## NAME ## _type_node \
2738 : : long_ ## NAME ## _type_node; \
2739 : if (type1 == long_long_ ## NAME ## _type_node \
2740 : || type1 == unsigned_long_long_ ## NAME ## _type_node) \
2741 : return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \
2742 : : long_long_ ## NAME ## _type_node;
2743 :
2744 : #define GIMPLE_FIXED_MODE_TYPES(NAME) \
2745 : if (type1 == NAME ## _type_node \
2746 : || type1 == u ## NAME ## _type_node) \
2747 : return unsignedp ? u ## NAME ## _type_node \
2748 : : NAME ## _type_node;
2749 :
2750 : #define GIMPLE_FIXED_TYPES_SAT(NAME) \
2751 : if (type1 == sat_ ## short_ ## NAME ## _type_node \
2752 : || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \
2753 : return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \
2754 : : sat_ ## short_ ## NAME ## _type_node; \
2755 : if (type1 == sat_ ## NAME ## _type_node \
2756 : || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \
2757 : return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \
2758 : : sat_ ## NAME ## _type_node; \
2759 : if (type1 == sat_ ## long_ ## NAME ## _type_node \
2760 : || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \
2761 : return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \
2762 : : sat_ ## long_ ## NAME ## _type_node; \
2763 : if (type1 == sat_ ## long_long_ ## NAME ## _type_node \
2764 : || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \
2765 : return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \
2766 : : sat_ ## long_long_ ## NAME ## _type_node;
2767 :
2768 : #define GIMPLE_FIXED_MODE_TYPES_SAT(NAME) \
2769 : if (type1 == sat_ ## NAME ## _type_node \
2770 : || type1 == sat_ ## u ## NAME ## _type_node) \
2771 : return unsignedp ? sat_ ## u ## NAME ## _type_node \
2772 : : sat_ ## NAME ## _type_node;
2773 :
2774 14289 : GIMPLE_FIXED_TYPES (fract);
2775 14289 : GIMPLE_FIXED_TYPES_SAT (fract);
2776 14289 : GIMPLE_FIXED_TYPES (accum);
2777 14289 : GIMPLE_FIXED_TYPES_SAT (accum);
2778 :
2779 14289 : GIMPLE_FIXED_MODE_TYPES (qq);
2780 14289 : GIMPLE_FIXED_MODE_TYPES (hq);
2781 14289 : GIMPLE_FIXED_MODE_TYPES (sq);
2782 14289 : GIMPLE_FIXED_MODE_TYPES (dq);
2783 14289 : GIMPLE_FIXED_MODE_TYPES (tq);
2784 14289 : GIMPLE_FIXED_MODE_TYPES_SAT (qq);
2785 14289 : GIMPLE_FIXED_MODE_TYPES_SAT (hq);
2786 14289 : GIMPLE_FIXED_MODE_TYPES_SAT (sq);
2787 14289 : GIMPLE_FIXED_MODE_TYPES_SAT (dq);
2788 14289 : GIMPLE_FIXED_MODE_TYPES_SAT (tq);
2789 14289 : GIMPLE_FIXED_MODE_TYPES (ha);
2790 14289 : GIMPLE_FIXED_MODE_TYPES (sa);
2791 14289 : GIMPLE_FIXED_MODE_TYPES (da);
2792 14289 : GIMPLE_FIXED_MODE_TYPES (ta);
2793 14289 : GIMPLE_FIXED_MODE_TYPES_SAT (ha);
2794 14289 : GIMPLE_FIXED_MODE_TYPES_SAT (sa);
2795 14289 : GIMPLE_FIXED_MODE_TYPES_SAT (da);
2796 14289 : GIMPLE_FIXED_MODE_TYPES_SAT (ta);
2797 :
2798 : /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not
2799 : the precision; they have precision set to match their range, but
2800 : may use a wider mode to match an ABI. If we change modes, we may
2801 : wind up with bad conversions. For INTEGER_TYPEs in C, must check
2802 : the precision as well, so as to yield correct results for
2803 : bit-field types. C++ does not have these separate bit-field
2804 : types, and producing a signed or unsigned variant of an
2805 : ENUMERAL_TYPE may cause other problems as well. */
2806 14289 : if (!INTEGRAL_TYPE_P (type)
2807 14289 : || TYPE_UNSIGNED (type) == unsignedp)
2808 : return type;
2809 :
2810 : #define TYPE_OK(node) \
2811 : (TYPE_MODE (type) == TYPE_MODE (node) \
2812 : && TYPE_PRECISION (type) == TYPE_PRECISION (node))
2813 14289 : if (TYPE_OK (signed_char_type_node))
2814 517 : return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2815 13772 : if (TYPE_OK (integer_type_node))
2816 3513 : return unsignedp ? unsigned_type_node : integer_type_node;
2817 10259 : if (TYPE_OK (short_integer_type_node))
2818 4754 : return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2819 5505 : if (TYPE_OK (long_integer_type_node))
2820 6 : return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2821 5499 : if (TYPE_OK (long_long_integer_type_node))
2822 0 : return (unsignedp
2823 0 : ? long_long_unsigned_type_node
2824 0 : : long_long_integer_type_node);
2825 :
2826 10971 : for (i = 0; i < NUM_INT_N_ENTS; i ++)
2827 5499 : if (int_n_enabled_p[i]
2828 5499 : && TYPE_MODE (type) == int_n_data[i].m
2829 5526 : && TYPE_PRECISION (type) == int_n_data[i].bitsize)
2830 27 : return unsignedp
2831 27 : ? int_n_trees[i].unsigned_type
2832 27 : : int_n_trees[i].signed_type;
2833 :
2834 : #if HOST_BITS_PER_WIDE_INT >= 64
2835 5472 : if (TYPE_OK (intTI_type_node))
2836 0 : return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2837 : #endif
2838 5472 : if (TYPE_OK (intDI_type_node))
2839 0 : return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2840 5472 : if (TYPE_OK (intSI_type_node))
2841 0 : return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2842 5472 : if (TYPE_OK (intHI_type_node))
2843 0 : return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2844 5472 : if (TYPE_OK (intQI_type_node))
2845 0 : return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2846 :
2847 : #undef GIMPLE_FIXED_TYPES
2848 : #undef GIMPLE_FIXED_MODE_TYPES
2849 : #undef GIMPLE_FIXED_TYPES_SAT
2850 : #undef GIMPLE_FIXED_MODE_TYPES_SAT
2851 : #undef TYPE_OK
2852 :
2853 5472 : return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
2854 : }
2855 :
2856 :
2857 : /* Return an unsigned type the same as TYPE in other respects. */
2858 :
2859 : tree
2860 0 : gimple_unsigned_type (tree type)
2861 : {
2862 0 : return gimple_signed_or_unsigned_type (true, type);
2863 : }
2864 :
2865 :
2866 : /* Return a signed type the same as TYPE in other respects. */
2867 :
2868 : tree
2869 609387 : gimple_signed_type (tree type)
2870 : {
2871 609387 : return gimple_signed_or_unsigned_type (false, type);
2872 : }
2873 :
2874 :
2875 : /* Return the typed-based alias set for T, which may be an expression
2876 : or a type. Return -1 if we don't do anything special. */
2877 :
2878 : alias_set_type
2879 8753239 : gimple_get_alias_set (tree t)
2880 : {
2881 : /* That's all the expressions we handle specially. */
2882 8753239 : if (!TYPE_P (t))
2883 : return -1;
2884 :
2885 : /* For convenience, follow the C standard when dealing with
2886 : character types. Any object may be accessed via an lvalue that
2887 : has character type. */
2888 2479530 : if (t == char_type_node
2889 1933422 : || t == signed_char_type_node
2890 1933422 : || t == unsigned_char_type_node)
2891 : return 0;
2892 :
2893 : /* Allow aliasing between signed and unsigned variants of the same
2894 : type. We treat the signed variant as canonical. */
2895 1933422 : if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
2896 : {
2897 608479 : tree t1 = gimple_signed_type (t);
2898 :
2899 : /* t1 == t can happen for boolean nodes which are always unsigned. */
2900 608479 : if (t1 != t)
2901 608479 : return get_alias_set (t1);
2902 : }
2903 :
2904 : /* Allow aliasing between enumeral types and the underlying
2905 : integer type. This is required for C since those are
2906 : compatible types. */
2907 1324943 : else if (TREE_CODE (t) == ENUMERAL_TYPE)
2908 : {
2909 0 : tree t1 = lang_hooks.types.type_for_size (tree_to_uhwi (TYPE_SIZE (t)),
2910 : false /* short-cut above */);
2911 0 : return get_alias_set (t1);
2912 : }
2913 :
2914 : return -1;
2915 : }
2916 :
2917 :
2918 : /* Return true when STMTs arguments and return value match those of FNDECL,
2919 : a decl of a builtin function. */
2920 :
2921 : bool
2922 295583477 : gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
2923 : {
2924 295583477 : gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN);
2925 :
2926 295583477 : if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
2927 293207165 : if (tree decl = builtin_decl_explicit (DECL_FUNCTION_CODE (fndecl)))
2928 295583477 : fndecl = decl;
2929 :
2930 295583477 : tree ret = gimple_call_lhs (stmt);
2931 295583477 : if (ret
2932 478382597 : && !useless_type_conversion_p (TREE_TYPE (ret),
2933 182799120 : TREE_TYPE (TREE_TYPE (fndecl))))
2934 : return false;
2935 :
2936 295561494 : tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
2937 295561494 : unsigned nargs = gimple_call_num_args (stmt);
2938 1211837007 : for (unsigned i = 0; i < nargs; ++i)
2939 : {
2940 : /* Variadic args follow. */
2941 654196280 : if (!targs)
2942 : return true;
2943 625732078 : tree arg = gimple_call_arg (stmt, i);
2944 625732078 : tree type = TREE_VALUE (targs);
2945 625732078 : if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
2946 : return false;
2947 620714019 : targs = TREE_CHAIN (targs);
2948 : }
2949 523332682 : if (targs && !VOID_TYPE_P (TREE_VALUE (targs)))
2950 7153 : return false;
2951 : return true;
2952 : }
2953 :
2954 : /* Return true when STMT is operator a replaceable delete call. */
2955 :
2956 : bool
2957 2759794 : gimple_call_operator_delete_p (const gcall *stmt)
2958 : {
2959 2759794 : tree fndecl;
2960 :
2961 2759794 : if ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE)
2962 2759794 : return DECL_IS_OPERATOR_DELETE_P (fndecl);
2963 : return false;
2964 : }
2965 :
2966 : /* Return true when STMT is builtins call. */
2967 :
2968 : bool
2969 71179174 : gimple_call_builtin_p (const gimple *stmt)
2970 : {
2971 71179174 : tree fndecl;
2972 71179174 : if (is_gimple_call (stmt)
2973 22522116 : && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
2974 92434750 : && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN)
2975 4975048 : return gimple_builtin_call_types_compatible_p (stmt, fndecl);
2976 : return false;
2977 : }
2978 :
2979 : /* Return true when STMT is builtins call to CLASS. */
2980 :
2981 : bool
2982 1057971324 : gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass)
2983 : {
2984 1057971324 : tree fndecl;
2985 1057971324 : if (is_gimple_call (stmt)
2986 806252494 : && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
2987 1826529723 : && DECL_BUILT_IN_CLASS (fndecl) == klass)
2988 197730618 : return gimple_builtin_call_types_compatible_p (stmt, fndecl);
2989 : return false;
2990 : }
2991 :
2992 : /* Return true when STMT is builtins call to CODE of CLASS. */
2993 :
2994 : bool
2995 3048672153 : gimple_call_builtin_p (const gimple *stmt, enum built_in_function code)
2996 : {
2997 3048672153 : tree fndecl;
2998 3048672153 : if (is_gimple_call (stmt)
2999 909521573 : && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
3000 3914876135 : && fndecl_built_in_p (fndecl, code))
3001 2712511 : return gimple_builtin_call_types_compatible_p (stmt, fndecl);
3002 : return false;
3003 : }
3004 :
3005 : /* If CALL is a call to a combined_fn (i.e. an internal function or
3006 : a normal built-in function), return its code, otherwise return
3007 : CFN_LAST. */
3008 :
3009 : combined_fn
3010 192582875 : gimple_call_combined_fn (const gimple *stmt)
3011 : {
3012 192582875 : if (const gcall *call = dyn_cast <const gcall *> (stmt))
3013 : {
3014 192371050 : if (gimple_call_internal_p (call))
3015 8851948 : return as_combined_fn (gimple_call_internal_fn (call));
3016 :
3017 183519102 : tree fndecl = gimple_call_fndecl (stmt);
3018 183519102 : if (fndecl
3019 177037106 : && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
3020 256116968 : && gimple_builtin_call_types_compatible_p (stmt, fndecl))
3021 72035976 : return as_combined_fn (DECL_FUNCTION_CODE (fndecl));
3022 : }
3023 : return CFN_LAST;
3024 : }
3025 :
3026 : /* Return true if STMT clobbers memory. STMT is required to be a
3027 : GIMPLE_ASM. */
3028 :
3029 : bool
3030 10712064 : gimple_asm_clobbers_memory_p (const gasm *stmt)
3031 : {
3032 10712064 : unsigned i;
3033 :
3034 14775827 : for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
3035 : {
3036 8423649 : tree op = gimple_asm_clobber_op (stmt, i);
3037 8423649 : if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
3038 : return true;
3039 : }
3040 :
3041 : /* Non-empty basic ASM implicitly clobbers memory. */
3042 6352178 : if (gimple_asm_basic_p (stmt) && strlen (gimple_asm_string (stmt)) != 0)
3043 74574 : return true;
3044 :
3045 : return false;
3046 : }
3047 :
3048 : /* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE. */
3049 :
3050 : void
3051 5338 : dump_decl_set (FILE *file, bitmap set)
3052 : {
3053 5338 : if (set)
3054 : {
3055 5338 : bitmap_iterator bi;
3056 5338 : unsigned i;
3057 :
3058 5338 : fprintf (file, "{ ");
3059 :
3060 22230 : EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
3061 : {
3062 16892 : fprintf (file, "D.%u", i);
3063 16892 : fprintf (file, " ");
3064 : }
3065 :
3066 5338 : fprintf (file, "}");
3067 : }
3068 : else
3069 0 : fprintf (file, "NIL");
3070 5338 : }
3071 :
3072 : /* Return true when CALL is a call stmt that definitely doesn't
3073 : free any memory or makes it unavailable otherwise. */
3074 : bool
3075 10219063 : nonfreeing_call_p (gimple *call)
3076 : {
3077 10219063 : if (gimple_call_builtin_p (call, BUILT_IN_NORMAL)
3078 10219063 : && gimple_call_flags (call) & ECF_LEAF)
3079 4457575 : switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call)))
3080 : {
3081 : /* Just in case these become ECF_LEAF in the future. */
3082 : case BUILT_IN_FREE:
3083 : case BUILT_IN_TM_FREE:
3084 : case BUILT_IN_REALLOC:
3085 : case BUILT_IN_STACK_RESTORE:
3086 : case BUILT_IN_GOMP_FREE:
3087 : case BUILT_IN_GOMP_REALLOC:
3088 : return false;
3089 4255290 : default:
3090 4255290 : return true;
3091 : }
3092 5761488 : else if (gimple_call_internal_p (call))
3093 769333 : switch (gimple_call_internal_fn (call))
3094 : {
3095 : case IFN_ABNORMAL_DISPATCHER:
3096 : return true;
3097 35682 : case IFN_ASAN_MARK:
3098 35682 : return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON;
3099 727645 : default:
3100 727645 : if (gimple_call_flags (call) & ECF_LEAF)
3101 : return true;
3102 148466 : return false;
3103 : }
3104 :
3105 4992155 : tree fndecl = gimple_call_fndecl (call);
3106 4992155 : if (!fndecl)
3107 : return false;
3108 4829346 : struct cgraph_node *n = cgraph_node::get (fndecl);
3109 4829346 : if (!n)
3110 : return false;
3111 4827968 : enum availability availability;
3112 4827968 : n = n->function_symbol (&availability);
3113 4827968 : if (!n || availability <= AVAIL_INTERPOSABLE)
3114 : return false;
3115 1175195 : return n->nonfreeing_fn;
3116 : }
3117 :
3118 : /* Return true when CALL is a call stmt that definitely need not
3119 : be considered to be a memory barrier. */
3120 : bool
3121 1680730 : nonbarrier_call_p (gimple *call)
3122 : {
3123 1680730 : if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST))
3124 661596 : return true;
3125 : /* Should extend this to have a nonbarrier_fn flag, just as above in
3126 : the nonfreeing case. */
3127 : return false;
3128 : }
3129 :
3130 : /* Callback for walk_stmt_load_store_ops.
3131 :
3132 : Return TRUE if OP will dereference the tree stored in DATA, FALSE
3133 : otherwise.
3134 :
3135 : This routine only makes a superficial check for a dereference. Thus
3136 : it must only be used if it is safe to return a false negative. */
3137 : static bool
3138 78384616 : check_loadstore (gimple *stmt, tree op, tree, void *data)
3139 : {
3140 156769232 : if (TREE_CODE (op) == MEM_REF
3141 78384616 : || (TREE_CODE (op) == TARGET_MEM_REF
3142 1383357 : && !TMR_INDEX2 (op)
3143 1367354 : && (!TMR_INDEX (op)
3144 646630 : || (TMR_STEP (op)
3145 587231 : && expr_not_equal_to (TMR_STEP (op),
3146 78971847 : wi::one (TYPE_PRECISION (TREE_TYPE
3147 : (TMR_STEP (op)))),
3148 : stmt)))))
3149 : {
3150 : /* Some address spaces may legitimately dereference zero. */
3151 40701913 : addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op));
3152 40701913 : if (targetm.addr_space.zero_address_valid (as))
3153 : return false;
3154 :
3155 40700807 : return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0);
3156 : }
3157 : return false;
3158 : }
3159 :
3160 :
3161 : /* Return true if OP can be inferred to be non-NULL after STMT executes,
3162 : either by using a pointer dereference or attributes. */
3163 : bool
3164 0 : infer_nonnull_range (gimple *stmt, tree op)
3165 : {
3166 0 : return (infer_nonnull_range_by_dereference (stmt, op)
3167 0 : || infer_nonnull_range_by_attribute (stmt, op));
3168 : }
3169 :
3170 : /* Return true if OP can be inferred to be non-NULL after STMT
3171 : executes by using a pointer dereference. */
3172 : bool
3173 353213462 : infer_nonnull_range_by_dereference (gimple *stmt, tree op)
3174 : {
3175 : /* We can only assume that a pointer dereference will yield
3176 : non-NULL if -fdelete-null-pointer-checks is enabled. */
3177 353213462 : if (!flag_delete_null_pointer_checks
3178 352999236 : || !POINTER_TYPE_P (TREE_TYPE (op))
3179 352999236 : || gimple_code (stmt) == GIMPLE_ASM
3180 705786322 : || gimple_clobber_p (stmt))
3181 : return false;
3182 :
3183 345071858 : if (walk_stmt_load_store_ops (stmt, (void *)op,
3184 : check_loadstore, check_loadstore))
3185 : return true;
3186 :
3187 : return false;
3188 : }
3189 :
3190 : /* Return true if OP can be inferred to be a non-NULL after STMT
3191 : executes by using attributes. If OP2 and OP3 are non-NULL and
3192 : nonnull_if_nonzero is the only attribute implying OP being non-NULL
3193 : and the corresponding argument(s) aren't non-zero INTEGER_CST, set *OP2
3194 : and *OP3 to the corresponding arguments and return true (in that case
3195 : returning true doesn't mean OP can be unconditionally inferred to be
3196 : non-NULL, but conditionally). */
3197 : bool
3198 80385933 : infer_nonnull_range_by_attribute (gimple *stmt, tree op, tree *op2, tree *op3)
3199 : {
3200 80385933 : if (op2)
3201 : {
3202 3934 : *op2 = NULL_TREE;
3203 3934 : *op3 = NULL_TREE;
3204 : }
3205 :
3206 : /* We can only assume that a pointer dereference will yield
3207 : non-NULL if -fdelete-null-pointer-checks is enabled. */
3208 80385933 : if (!flag_delete_null_pointer_checks
3209 80357178 : || !POINTER_TYPE_P (TREE_TYPE (op))
3210 160743111 : || gimple_code (stmt) == GIMPLE_ASM)
3211 : return false;
3212 :
3213 80306672 : if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt))
3214 : {
3215 4544360 : tree fntype = gimple_call_fntype (stmt);
3216 4544360 : tree attrs = TYPE_ATTRIBUTES (fntype);
3217 4642161 : for (; attrs; attrs = TREE_CHAIN (attrs))
3218 : {
3219 1185625 : attrs = lookup_attribute ("nonnull", attrs);
3220 :
3221 : /* If "nonnull" wasn't specified, we know nothing about
3222 : the argument, unless "nonnull_if_nonzero" attribute is
3223 : present. */
3224 1185625 : if (attrs == NULL_TREE)
3225 : break;
3226 :
3227 : /* If "nonnull" applies to all the arguments, then ARG
3228 : is non-null if it's in the argument list. */
3229 257364 : if (TREE_VALUE (attrs) == NULL_TREE)
3230 : {
3231 463264 : for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++)
3232 : {
3233 312639 : if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i)))
3234 304913 : && operand_equal_p (op, gimple_call_arg (stmt, i), 0))
3235 : return true;
3236 : }
3237 : return false;
3238 : }
3239 :
3240 : /* Now see if op appears in the nonnull list. */
3241 246404 : for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
3242 : {
3243 148603 : unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
3244 148603 : if (idx < gimple_call_num_args (stmt))
3245 : {
3246 148602 : tree arg = gimple_call_arg (stmt, idx);
3247 148602 : if (operand_equal_p (op, arg, 0))
3248 : return true;
3249 : }
3250 : }
3251 : }
3252 :
3253 4384797 : for (attrs = TYPE_ATTRIBUTES (fntype);
3254 4593068 : (attrs = lookup_attribute ("nonnull_if_nonzero", attrs));
3255 208271 : attrs = TREE_CHAIN (attrs))
3256 : {
3257 209086 : tree args = TREE_VALUE (attrs);
3258 209086 : unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (args)) - 1;
3259 209086 : unsigned int idx2
3260 209086 : = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (args))) - 1;
3261 209086 : unsigned int idx3 = idx2;
3262 209086 : if (tree chain2 = TREE_CHAIN (TREE_CHAIN (args)))
3263 4348 : idx3 = TREE_INT_CST_LOW (TREE_VALUE (chain2)) - 1;
3264 209086 : if (idx < gimple_call_num_args (stmt)
3265 209074 : && idx2 < gimple_call_num_args (stmt)
3266 209063 : && idx3 < gimple_call_num_args (stmt)
3267 418149 : && operand_equal_p (op, gimple_call_arg (stmt, idx), 0))
3268 : {
3269 815 : tree arg2 = gimple_call_arg (stmt, idx2);
3270 815 : tree arg3 = gimple_call_arg (stmt, idx3);
3271 1630 : if (!INTEGRAL_TYPE_P (TREE_TYPE (arg2))
3272 1630 : || !INTEGRAL_TYPE_P (TREE_TYPE (arg3)))
3273 : return false;
3274 815 : if (integer_nonzerop (arg2) && integer_nonzerop (arg3))
3275 : return true;
3276 593 : if (integer_zerop (arg2) || integer_zerop (arg3))
3277 : return false;
3278 503 : if (op2)
3279 : {
3280 : /* This case is meant for ubsan instrumentation.
3281 : The caller can check at runtime if *OP2 and *OP3 are
3282 : non-zero and OP is null. */
3283 132 : *op2 = arg2;
3284 132 : *op3 = arg3;
3285 132 : return true;
3286 : }
3287 371 : return tree_expr_nonzero_p (arg2) && tree_expr_nonzero_p (arg3);
3288 : }
3289 : }
3290 : }
3291 :
3292 : /* If this function is marked as returning non-null, then we can
3293 : infer OP is non-null if it is used in the return statement. */
3294 80146294 : if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
3295 971652 : if (gimple_return_retval (return_stmt)
3296 558658 : && operand_equal_p (gimple_return_retval (return_stmt), op, 0)
3297 1065314 : && lookup_attribute ("returns_nonnull",
3298 93662 : TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
3299 : return true;
3300 :
3301 : return false;
3302 : }
3303 :
3304 : /* Compare two case labels. Because the front end should already have
3305 : made sure that case ranges do not overlap, it is enough to only compare
3306 : the CASE_LOW values of each case label. */
3307 :
3308 : static int
3309 43814048 : compare_case_labels (const void *p1, const void *p2)
3310 : {
3311 43814048 : const_tree const case1 = *(const_tree const*)p1;
3312 43814048 : const_tree const case2 = *(const_tree const*)p2;
3313 :
3314 : /* The 'default' case label always goes first. */
3315 43814048 : if (!CASE_LOW (case1))
3316 : return -1;
3317 43814048 : else if (!CASE_LOW (case2))
3318 : return 1;
3319 : else
3320 43814048 : return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
3321 : }
3322 :
3323 : /* Sort the case labels in LABEL_VEC in place in ascending order. */
3324 :
3325 : void
3326 71369 : sort_case_labels (vec<tree> &label_vec)
3327 : {
3328 71369 : label_vec.qsort (compare_case_labels);
3329 71369 : }
3330 :
3331 : /* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement.
3332 :
3333 : LABELS is a vector that contains all case labels to look at.
3334 :
3335 : INDEX_TYPE is the type of the switch index expression. Case labels
3336 : in LABELS are discarded if their values are not in the value range
3337 : covered by INDEX_TYPE. The remaining case label values are folded
3338 : to INDEX_TYPE.
3339 :
3340 : If a default case exists in LABELS, it is removed from LABELS and
3341 : returned in DEFAULT_CASEP. If no default case exists, but the
3342 : case labels already cover the whole range of INDEX_TYPE, a default
3343 : case is returned pointing to one of the existing case labels.
3344 : Otherwise DEFAULT_CASEP is set to NULL_TREE.
3345 :
3346 : DEFAULT_CASEP may be NULL, in which case the above comment doesn't
3347 : apply and no action is taken regardless of whether a default case is
3348 : found or not. */
3349 :
3350 : void
3351 62743 : preprocess_case_label_vec_for_gimple (vec<tree> &labels,
3352 : tree index_type,
3353 : tree *default_casep)
3354 : {
3355 62743 : tree min_value, max_value;
3356 62743 : tree default_case = NULL_TREE;
3357 62743 : size_t i, len;
3358 :
3359 62743 : i = 0;
3360 62743 : min_value = TYPE_MIN_VALUE (index_type);
3361 62743 : max_value = TYPE_MAX_VALUE (index_type);
3362 1159495 : while (i < labels.length ())
3363 : {
3364 1096752 : tree elt = labels[i];
3365 1096752 : tree low = CASE_LOW (elt);
3366 1096752 : tree high = CASE_HIGH (elt);
3367 1096752 : bool remove_element = false;
3368 :
3369 1096752 : if (low)
3370 : {
3371 1060961 : gcc_checking_assert (TREE_CODE (low) == INTEGER_CST);
3372 1060961 : gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST);
3373 :
3374 : /* This is a non-default case label, i.e. it has a value.
3375 :
3376 : See if the case label is reachable within the range of
3377 : the index type. Remove out-of-range case values. Turn
3378 : case ranges into a canonical form (high > low strictly)
3379 : and convert the case label values to the index type.
3380 :
3381 : NB: The type of gimple_switch_index() may be the promoted
3382 : type, but the case labels retain the original type. */
3383 :
3384 12803 : if (high)
3385 : {
3386 : /* This is a case range. Discard empty ranges.
3387 : If the bounds or the range are equal, turn this
3388 : into a simple (one-value) case. */
3389 12803 : int cmp = tree_int_cst_compare (high, low);
3390 12803 : if (cmp < 0)
3391 : remove_element = true;
3392 12803 : else if (cmp == 0)
3393 : high = NULL_TREE;
3394 : }
3395 :
3396 1049812 : if (! high)
3397 : {
3398 : /* If the simple case value is unreachable, ignore it. */
3399 1059307 : if ((TREE_CODE (min_value) == INTEGER_CST
3400 1059307 : && tree_int_cst_compare (low, min_value) < 0)
3401 2118571 : || (TREE_CODE (max_value) == INTEGER_CST
3402 1059264 : && tree_int_cst_compare (low, max_value) > 0))
3403 : remove_element = true;
3404 : else
3405 1059146 : low = fold_convert (index_type, low);
3406 : }
3407 : else
3408 : {
3409 : /* If the entire case range is unreachable, ignore it. */
3410 1654 : if ((TREE_CODE (min_value) == INTEGER_CST
3411 1654 : && tree_int_cst_compare (high, min_value) < 0)
3412 3296 : || (TREE_CODE (max_value) == INTEGER_CST
3413 1642 : && tree_int_cst_compare (low, max_value) > 0))
3414 : remove_element = true;
3415 : else
3416 : {
3417 : /* If the lower bound is less than the index type's
3418 : minimum value, truncate the range bounds. */
3419 1642 : if (TREE_CODE (min_value) == INTEGER_CST
3420 1642 : && tree_int_cst_compare (low, min_value) < 0)
3421 : low = min_value;
3422 1642 : low = fold_convert (index_type, low);
3423 :
3424 : /* If the upper bound is greater than the index type's
3425 : maximum value, truncate the range bounds. */
3426 1642 : if (TREE_CODE (max_value) == INTEGER_CST
3427 1642 : && tree_int_cst_compare (high, max_value) > 0)
3428 : high = max_value;
3429 1642 : high = fold_convert (index_type, high);
3430 :
3431 : /* We may have folded a case range to a one-value case. */
3432 1642 : if (tree_int_cst_equal (low, high))
3433 0 : high = NULL_TREE;
3434 : }
3435 : }
3436 :
3437 1060961 : CASE_LOW (elt) = low;
3438 1060961 : CASE_HIGH (elt) = high;
3439 : }
3440 : else
3441 : {
3442 35791 : gcc_assert (!default_case);
3443 35791 : default_case = elt;
3444 : /* The default case must be passed separately to the
3445 : gimple_build_switch routine. But if DEFAULT_CASEP
3446 : is NULL, we do not remove the default case (it would
3447 : be completely lost). */
3448 35791 : if (default_casep)
3449 : remove_element = true;
3450 : }
3451 :
3452 1060961 : if (remove_element)
3453 35964 : labels.ordered_remove (i);
3454 : else
3455 1060788 : i++;
3456 : }
3457 62743 : len = i;
3458 :
3459 62743 : if (!labels.is_empty ())
3460 61863 : sort_case_labels (labels);
3461 :
3462 62743 : if (default_casep && !default_case)
3463 : {
3464 : /* If the switch has no default label, add one, so that we jump
3465 : around the switch body. If the labels already cover the whole
3466 : range of the switch index_type, add the default label pointing
3467 : to one of the existing labels. */
3468 15081 : if (len
3469 14600 : && TYPE_MIN_VALUE (index_type)
3470 14600 : && TYPE_MAX_VALUE (index_type)
3471 29681 : && tree_int_cst_equal (CASE_LOW (labels[0]),
3472 14600 : TYPE_MIN_VALUE (index_type)))
3473 : {
3474 4442 : tree low, high = CASE_HIGH (labels[len - 1]);
3475 4442 : if (!high)
3476 4399 : high = CASE_LOW (labels[len - 1]);
3477 4442 : if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type)))
3478 : {
3479 62 : tree widest_label = labels[0];
3480 131 : for (i = 1; i < len; i++)
3481 : {
3482 83 : high = CASE_LOW (labels[i]);
3483 83 : low = CASE_HIGH (labels[i - 1]);
3484 83 : if (!low)
3485 53 : low = CASE_LOW (labels[i - 1]);
3486 :
3487 83 : if (CASE_HIGH (labels[i]) != NULL_TREE
3488 114 : && (CASE_HIGH (widest_label) == NULL_TREE
3489 26 : || (wi::gtu_p
3490 52 : (wi::to_wide (CASE_HIGH (labels[i]))
3491 78 : - wi::to_wide (CASE_LOW (labels[i])),
3492 26 : wi::to_wide (CASE_HIGH (widest_label))
3493 161 : - wi::to_wide (CASE_LOW (widest_label))))))
3494 17 : widest_label = labels[i];
3495 :
3496 83 : if (wi::to_wide (low) + 1 != wi::to_wide (high))
3497 : break;
3498 : }
3499 62 : if (i == len)
3500 : {
3501 : /* Designate the label with the widest range to be the
3502 : default label. */
3503 48 : tree label = CASE_LABEL (widest_label);
3504 48 : default_case = build_case_label (NULL_TREE, NULL_TREE,
3505 : label);
3506 : }
3507 : }
3508 : }
3509 : }
3510 :
3511 62743 : if (default_casep)
3512 50872 : *default_casep = default_case;
3513 62743 : }
3514 :
3515 : /* Set the location of all statements in SEQ to LOC. */
3516 :
3517 : void
3518 1055723 : gimple_seq_set_location (gimple_seq seq, location_t loc)
3519 : {
3520 2141547 : for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
3521 1085824 : gimple_set_location (gsi_stmt (i), loc);
3522 1055723 : }
3523 :
3524 : /* Release SSA_NAMEs in SEQ as well as the GIMPLE statements. */
3525 :
3526 : void
3527 821546212 : gimple_seq_discard (gimple_seq seq)
3528 : {
3529 821546212 : gimple_stmt_iterator gsi;
3530 :
3531 822124511 : for (gsi = gsi_start (seq); !gsi_end_p (gsi); )
3532 : {
3533 389724 : gimple *stmt = gsi_stmt (gsi);
3534 389724 : gsi_remove (&gsi, true);
3535 389724 : release_defs (stmt);
3536 389724 : ggc_free (stmt);
3537 : }
3538 821546212 : }
3539 :
3540 : /* See if STMT now calls function that takes no parameters and if so, drop
3541 : call arguments. This is used when devirtualization machinery redirects
3542 : to __builtin_unreachable or __cxa_pure_virtual. */
3543 :
3544 : void
3545 1206689 : maybe_remove_unused_call_args (struct function *fn, gimple *stmt)
3546 : {
3547 1206689 : tree decl = gimple_call_fndecl (stmt);
3548 1206689 : if (TYPE_ARG_TYPES (TREE_TYPE (decl))
3549 1205851 : && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node
3550 1452806 : && gimple_call_num_args (stmt))
3551 : {
3552 125544 : gimple_set_num_ops (stmt, 3);
3553 125544 : update_stmt_fn (fn, stmt);
3554 : }
3555 1206689 : }
3556 :
3557 : /* Return false if STMT will likely expand to real function call. */
3558 :
3559 : bool
3560 3445001 : gimple_inexpensive_call_p (gcall *stmt)
3561 : {
3562 3445001 : if (gimple_call_internal_p (stmt))
3563 : return true;
3564 3387650 : tree decl = gimple_call_fndecl (stmt);
3565 3387650 : if (decl && is_inexpensive_builtin (decl))
3566 : return true;
3567 : return false;
3568 : }
3569 :
3570 : /* Return a non-artificial location for STMT. If STMT does not have
3571 : location information, get the location from EXPR. */
3572 :
3573 : location_t
3574 124121 : gimple_or_expr_nonartificial_location (gimple *stmt, tree expr)
3575 : {
3576 124121 : location_t loc = gimple_nonartificial_location (stmt);
3577 124121 : if (loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (expr))
3578 46 : loc = tree_nonartificial_location (expr);
3579 124121 : return expansion_point_location_if_in_system_header (loc);
3580 : }
3581 :
3582 :
3583 : #if CHECKING_P
3584 :
3585 : namespace selftest {
3586 :
3587 : /* Selftests for core gimple structures. */
3588 :
3589 : /* Verify that STMT is pretty-printed as EXPECTED.
3590 : Helper function for selftests. */
3591 :
3592 : static void
3593 20 : verify_gimple_pp (const char *expected, gimple *stmt)
3594 : {
3595 20 : pretty_printer pp;
3596 20 : pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */);
3597 20 : ASSERT_STREQ (expected, pp_formatted_text (&pp));
3598 20 : }
3599 :
3600 : /* Build a GIMPLE_ASSIGN equivalent to
3601 : tmp = 5;
3602 : and verify various properties of it. */
3603 :
3604 : static void
3605 4 : test_assign_single ()
3606 : {
3607 4 : tree type = integer_type_node;
3608 4 : tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3609 : get_identifier ("tmp"),
3610 : type);
3611 4 : tree rhs = build_int_cst (type, 5);
3612 4 : gassign *stmt = gimple_build_assign (lhs, rhs);
3613 4 : verify_gimple_pp ("tmp = 5;", stmt);
3614 :
3615 4 : ASSERT_TRUE (is_gimple_assign (stmt));
3616 4 : ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
3617 4 : ASSERT_EQ (lhs, gimple_get_lhs (stmt));
3618 4 : ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt));
3619 4 : ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt));
3620 4 : ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
3621 4 : ASSERT_TRUE (gimple_assign_single_p (stmt));
3622 8 : ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt));
3623 4 : }
3624 :
3625 : /* Build a GIMPLE_ASSIGN equivalent to
3626 : tmp = a * b;
3627 : and verify various properties of it. */
3628 :
3629 : static void
3630 4 : test_assign_binop ()
3631 : {
3632 4 : tree type = integer_type_node;
3633 4 : tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3634 : get_identifier ("tmp"),
3635 : type);
3636 4 : tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3637 : get_identifier ("a"),
3638 : type);
3639 4 : tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3640 : get_identifier ("b"),
3641 : type);
3642 4 : gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b);
3643 4 : verify_gimple_pp ("tmp = a * b;", stmt);
3644 :
3645 4 : ASSERT_TRUE (is_gimple_assign (stmt));
3646 4 : ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
3647 4 : ASSERT_EQ (lhs, gimple_get_lhs (stmt));
3648 4 : ASSERT_EQ (a, gimple_assign_rhs1 (stmt));
3649 8 : ASSERT_EQ (b, gimple_assign_rhs2 (stmt));
3650 4 : ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
3651 4 : ASSERT_FALSE (gimple_assign_single_p (stmt));
3652 4 : ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt));
3653 4 : }
3654 :
3655 : /* Verify that GIMPLE trap queries distinguish a register definition and a
3656 : trapping store from their nontrapping right-hand sides. */
3657 :
3658 : static void
3659 4 : test_could_trap ()
3660 : {
3661 4 : tree reg_lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3662 : get_identifier ("readonly_reg"),
3663 : integer_type_node);
3664 4 : TREE_READONLY (reg_lhs) = 1;
3665 4 : gassign *stmt = gimple_build_assign (reg_lhs, integer_one_node);
3666 :
3667 4 : ASSERT_FALSE (gimple_store_p (stmt));
3668 4 : ASSERT_FALSE (gimple_could_trap_p (stmt));
3669 4 : ASSERT_FALSE (gimple_assign_rhs_could_trap_p (stmt));
3670 :
3671 4 : tree mem_lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3672 : get_identifier ("readonly_mem"),
3673 : integer_type_node);
3674 4 : TREE_READONLY (mem_lhs) = 1;
3675 4 : TREE_STATIC (mem_lhs) = 1;
3676 4 : TREE_ADDRESSABLE (mem_lhs) = 1;
3677 4 : stmt = gimple_build_assign (mem_lhs, integer_one_node);
3678 :
3679 4 : ASSERT_TRUE (gimple_store_p (stmt));
3680 4 : ASSERT_TRUE (gimple_could_trap_p (stmt));
3681 4 : ASSERT_FALSE (gimple_assign_rhs_could_trap_p (stmt));
3682 :
3683 4 : tree record_type = make_node (RECORD_TYPE);
3684 4 : tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL,
3685 : get_identifier ("value"), integer_type_node);
3686 4 : DECL_CONTEXT (field) = record_type;
3687 4 : TYPE_FIELDS (record_type) = field;
3688 4 : layout_type (record_type);
3689 :
3690 4 : tree call_lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3691 : get_identifier ("readonly_call_mem"),
3692 : record_type);
3693 4 : TREE_READONLY (call_lhs) = 1;
3694 4 : TREE_STATIC (call_lhs) = 1;
3695 4 : TREE_ADDRESSABLE (call_lhs) = 1;
3696 :
3697 4 : tree fn_type = build_function_type_list (record_type, NULL_TREE);
3698 4 : tree fn = build_fn_decl ("nothrow_call", fn_type);
3699 4 : gcall *call = gimple_build_call (fn, 0);
3700 4 : gimple_call_set_lhs (call, call_lhs);
3701 4 : gimple_call_set_nothrow (call, true);
3702 :
3703 4 : ASSERT_TRUE (gimple_store_p (call));
3704 4 : ASSERT_TRUE (gimple_could_trap_p (call));
3705 4 : ASSERT_FALSE (gimple_could_trap_p_1 (call, true, false));
3706 :
3707 4 : gimple_call_set_return_slot_opt (call, true);
3708 4 : ASSERT_TRUE (gimple_could_trap_p (call));
3709 4 : ASSERT_FALSE (gimple_could_trap_p_1 (call, true, false));
3710 4 : }
3711 :
3712 : /* Build a GIMPLE_NOP and verify various properties of it. */
3713 :
3714 : static void
3715 4 : test_nop_stmt ()
3716 : {
3717 4 : gimple *stmt = gimple_build_nop ();
3718 4 : verify_gimple_pp ("GIMPLE_NOP", stmt);
3719 4 : ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt));
3720 4 : ASSERT_EQ (NULL, gimple_get_lhs (stmt));
3721 4 : ASSERT_FALSE (gimple_assign_single_p (stmt));
3722 4 : }
3723 :
3724 : /* Build a GIMPLE_RETURN equivalent to
3725 : return 7;
3726 : and verify various properties of it. */
3727 :
3728 : static void
3729 4 : test_return_stmt ()
3730 : {
3731 4 : tree type = integer_type_node;
3732 4 : tree val = build_int_cst (type, 7);
3733 4 : greturn *stmt = gimple_build_return (val);
3734 4 : verify_gimple_pp ("return 7;", stmt);
3735 :
3736 4 : ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
3737 4 : ASSERT_EQ (NULL, gimple_get_lhs (stmt));
3738 4 : ASSERT_EQ (val, gimple_return_retval (stmt));
3739 4 : ASSERT_FALSE (gimple_assign_single_p (stmt));
3740 4 : }
3741 :
3742 : /* Build a GIMPLE_RETURN equivalent to
3743 : return;
3744 : and verify various properties of it. */
3745 :
3746 : static void
3747 4 : test_return_without_value ()
3748 : {
3749 4 : greturn *stmt = gimple_build_return (NULL);
3750 4 : verify_gimple_pp ("return;", stmt);
3751 :
3752 4 : ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
3753 4 : ASSERT_EQ (NULL, gimple_get_lhs (stmt));
3754 4 : ASSERT_EQ (NULL, gimple_return_retval (stmt));
3755 4 : ASSERT_FALSE (gimple_assign_single_p (stmt));
3756 4 : }
3757 :
3758 : /* Run all of the selftests within this file. */
3759 :
3760 : void
3761 4 : gimple_cc_tests ()
3762 : {
3763 4 : test_assign_single ();
3764 4 : test_assign_binop ();
3765 4 : test_could_trap ();
3766 4 : test_nop_stmt ();
3767 4 : test_return_stmt ();
3768 4 : test_return_without_value ();
3769 4 : }
3770 :
3771 : } // namespace selftest
3772 :
3773 :
3774 : #endif /* CHECKING_P */
|