]> gcc.gnu.org Git - gcc.git/blame - gcc/gimple.c
Fix a failure in the libiberty testsuite by increasing the demangle recursion limit...
[gcc.git] / gcc / gimple.c
CommitLineData
726a989a
RB
1/* Gimple IR support functions.
2
85ec4feb 3 Copyright (C) 2007-2018 Free Software Foundation, Inc.
726a989a
RB
4 Contributed by Aldy Hernandez <aldyh@redhat.com>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along 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"
c7131fb2
AM
25#include "backend.h"
26#include "tree.h"
27#include "gimple.h"
c7131fb2 28#include "ssa.h"
957060b5
AM
29#include "cgraph.h"
30#include "diagnostic.h"
40e23961 31#include "alias.h"
40e23961 32#include "fold-const.h"
d8a2d370 33#include "calls.h"
d8a2d370 34#include "stor-layout.h"
2fb9a547
AM
35#include "internal-fn.h"
36#include "tree-eh.h"
5be5c238
AM
37#include "gimple-iterator.h"
38#include "gimple-walk.h"
45b0be94 39#include "gimplify.h"
6626f970 40#include "target.h"
ce120587 41#include "builtins.h"
d9b950dd
DM
42#include "selftest.h"
43#include "gimple-pretty-print.h"
314e6352
ML
44#include "stringpool.h"
45#include "attribs.h"
6dc4a604 46#include "asan.h"
726a989a 47
d7f09764 48
f2c4a81c 49/* All the tuples have their operand vector (if present) at the very bottom
726a989a
RB
50 of the structure. Therefore, the offset required to find the
51 operands vector the size of the structure minus the size of the 1
52 element tree array at the end (see gimple_ops). */
f2c4a81c
RH
53#define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) \
54 (HAS_TREE_OP ? sizeof (struct STRUCT) - sizeof (tree) : 0),
6bc7bc14 55EXPORTED_CONST size_t gimple_ops_offset_[] = {
f2c4a81c
RH
56#include "gsstruct.def"
57};
58#undef DEFGSSTRUCT
59
c3284718 60#define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) sizeof (struct STRUCT),
f2c4a81c
RH
61static const size_t gsstruct_code_size[] = {
62#include "gsstruct.def"
63};
64#undef DEFGSSTRUCT
65
66#define DEFGSCODE(SYM, NAME, GSSCODE) NAME,
67const char *const gimple_code_name[] = {
68#include "gimple.def"
69};
70#undef DEFGSCODE
71
72#define DEFGSCODE(SYM, NAME, GSSCODE) GSSCODE,
73EXPORTED_CONST enum gimple_statement_structure_enum gss_for_code_[] = {
726a989a
RB
74#include "gimple.def"
75};
76#undef DEFGSCODE
77
726a989a
RB
78/* Gimple stats. */
79
33b366c3
ML
80uint64_t gimple_alloc_counts[(int) gimple_alloc_kind_all];
81uint64_t gimple_alloc_sizes[(int) gimple_alloc_kind_all];
726a989a
RB
82
83/* Keep in sync with gimple.h:enum gimple_alloc_kind. */
84static const char * const gimple_alloc_kind_names[] = {
85 "assignments",
86 "phi nodes",
87 "conditionals",
726a989a
RB
88 "everything else"
89};
90
bde351d5
RB
91/* Static gimple tuple members. */
92const enum gimple_code gassign::code_;
003b40ae
RB
93const enum gimple_code gcall::code_;
94const enum gimple_code gcond::code_;
bde351d5
RB
95
96
726a989a
RB
97/* Gimple tuple constructors.
98 Note: Any constructor taking a ``gimple_seq'' as a parameter, can
99 be passed a NULL to start with an empty sequence. */
100
101/* Set the code for statement G to CODE. */
102
103static inline void
355fe088 104gimple_set_code (gimple *g, enum gimple_code code)
726a989a 105{
daa6e488 106 g->code = code;
726a989a
RB
107}
108
726a989a
RB
109/* Return the number of bytes needed to hold a GIMPLE statement with
110 code CODE. */
111
f2c4a81c 112static inline size_t
726a989a
RB
113gimple_size (enum gimple_code code)
114{
f2c4a81c 115 return gsstruct_code_size[gss_for_code (code)];
726a989a
RB
116}
117
726a989a
RB
118/* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS
119 operands. */
120
355fe088 121gimple *
9e2d7f46 122gimple_alloc (enum gimple_code code, unsigned num_ops MEM_STAT_DECL)
726a989a
RB
123{
124 size_t size;
355fe088 125 gimple *stmt;
726a989a
RB
126
127 size = gimple_size (code);
128 if (num_ops > 0)
129 size += sizeof (tree) * (num_ops - 1);
130
7aa6d18a
SB
131 if (GATHER_STATISTICS)
132 {
133 enum gimple_alloc_kind kind = gimple_alloc_kind (code);
134 gimple_alloc_counts[(int) kind]++;
135 gimple_alloc_sizes[(int) kind] += size;
136 }
726a989a 137
daa6e488 138 stmt = ggc_alloc_cleared_gimple_statement_stat (size PASS_MEM_STAT);
726a989a
RB
139 gimple_set_code (stmt, code);
140 gimple_set_num_ops (stmt, num_ops);
141
142 /* Do not call gimple_set_modified here as it has other side
143 effects and this tuple is still not completely built. */
daa6e488 144 stmt->modified = 1;
355a7673 145 gimple_init_singleton (stmt);
726a989a
RB
146
147 return stmt;
148}
149
150/* Set SUBCODE to be the code of the expression computed by statement G. */
151
152static inline void
355fe088 153gimple_set_subcode (gimple *g, unsigned subcode)
726a989a
RB
154{
155 /* We only have 16 bits for the RHS code. Assert that we are not
156 overflowing it. */
157 gcc_assert (subcode < (1 << 16));
daa6e488 158 g->subcode = subcode;
726a989a
RB
159}
160
161
162
163/* Build a tuple with operands. CODE is the statement to build (which
7d05cebb 164 must be one of the GIMPLE_WITH_OPS tuples). SUBCODE is the subcode
b8698a0f 165 for the new tuple. NUM_OPS is the number of operands to allocate. */
726a989a
RB
166
167#define gimple_build_with_ops(c, s, n) \
168 gimple_build_with_ops_stat (c, s, n MEM_STAT_INFO)
169
355fe088 170static gimple *
b5b8b0ac 171gimple_build_with_ops_stat (enum gimple_code code, unsigned subcode,
726a989a
RB
172 unsigned num_ops MEM_STAT_DECL)
173{
9e2d7f46 174 gimple *s = gimple_alloc (code, num_ops PASS_MEM_STAT);
726a989a
RB
175 gimple_set_subcode (s, subcode);
176
177 return s;
178}
179
180
181/* Build a GIMPLE_RETURN statement returning RETVAL. */
182
538dd0b7 183greturn *
726a989a
RB
184gimple_build_return (tree retval)
185{
538dd0b7
DM
186 greturn *s
187 = as_a <greturn *> (gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK,
188 2));
726a989a
RB
189 if (retval)
190 gimple_return_set_retval (s, retval);
191 return s;
192}
193
d086d311
RG
194/* Reset alias information on call S. */
195
196void
538dd0b7 197gimple_call_reset_alias_info (gcall *s)
d086d311
RG
198{
199 if (gimple_call_flags (s) & ECF_CONST)
200 memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution));
201 else
202 pt_solution_reset (gimple_call_use_set (s));
203 if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
204 memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution));
205 else
206 pt_solution_reset (gimple_call_clobber_set (s));
207}
208
21860814
JJ
209/* Helper for gimple_build_call, gimple_build_call_valist,
210 gimple_build_call_vec and gimple_build_call_from_tree. Build the basic
211 components of a GIMPLE_CALL statement to function FN with NARGS
212 arguments. */
726a989a 213
538dd0b7 214static inline gcall *
726a989a
RB
215gimple_build_call_1 (tree fn, unsigned nargs)
216{
538dd0b7
DM
217 gcall *s
218 = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
219 nargs + 3));
7c9577be
RG
220 if (TREE_CODE (fn) == FUNCTION_DECL)
221 fn = build_fold_addr_expr (fn);
726a989a 222 gimple_set_op (s, 1, fn);
f20ca725 223 gimple_call_set_fntype (s, TREE_TYPE (TREE_TYPE (fn)));
d086d311 224 gimple_call_reset_alias_info (s);
726a989a
RB
225 return s;
226}
227
228
229/* Build a GIMPLE_CALL statement to function FN with the arguments
230 specified in vector ARGS. */
231
538dd0b7 232gcall *
9771b263 233gimple_build_call_vec (tree fn, vec<tree> args)
726a989a
RB
234{
235 unsigned i;
9771b263 236 unsigned nargs = args.length ();
538dd0b7 237 gcall *call = gimple_build_call_1 (fn, nargs);
726a989a
RB
238
239 for (i = 0; i < nargs; i++)
9771b263 240 gimple_call_set_arg (call, i, args[i]);
726a989a
RB
241
242 return call;
243}
244
245
246/* Build a GIMPLE_CALL statement to function FN. NARGS is the number of
247 arguments. The ... are the arguments. */
248
538dd0b7 249gcall *
726a989a
RB
250gimple_build_call (tree fn, unsigned nargs, ...)
251{
252 va_list ap;
538dd0b7 253 gcall *call;
726a989a
RB
254 unsigned i;
255
256 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
257
258 call = gimple_build_call_1 (fn, nargs);
259
260 va_start (ap, nargs);
261 for (i = 0; i < nargs; i++)
262 gimple_call_set_arg (call, i, va_arg (ap, tree));
263 va_end (ap);
264
265 return call;
266}
267
268
21860814
JJ
269/* Build a GIMPLE_CALL statement to function FN. NARGS is the number of
270 arguments. AP contains the arguments. */
271
538dd0b7 272gcall *
21860814
JJ
273gimple_build_call_valist (tree fn, unsigned nargs, va_list ap)
274{
538dd0b7 275 gcall *call;
21860814
JJ
276 unsigned i;
277
278 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
279
280 call = gimple_build_call_1 (fn, nargs);
281
282 for (i = 0; i < nargs; i++)
283 gimple_call_set_arg (call, i, va_arg (ap, tree));
284
285 return call;
286}
287
288
25583c4f
RS
289/* Helper for gimple_build_call_internal and gimple_build_call_internal_vec.
290 Build the basic components of a GIMPLE_CALL statement to internal
291 function FN with NARGS arguments. */
292
538dd0b7 293static inline gcall *
25583c4f
RS
294gimple_build_call_internal_1 (enum internal_fn fn, unsigned nargs)
295{
538dd0b7
DM
296 gcall *s
297 = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
298 nargs + 3));
daa6e488 299 s->subcode |= GF_CALL_INTERNAL;
25583c4f
RS
300 gimple_call_set_internal_fn (s, fn);
301 gimple_call_reset_alias_info (s);
302 return s;
303}
304
305
306/* Build a GIMPLE_CALL statement to internal function FN. NARGS is
307 the number of arguments. The ... are the arguments. */
308
538dd0b7 309gcall *
25583c4f
RS
310gimple_build_call_internal (enum internal_fn fn, unsigned nargs, ...)
311{
312 va_list ap;
538dd0b7 313 gcall *call;
25583c4f
RS
314 unsigned i;
315
316 call = gimple_build_call_internal_1 (fn, nargs);
317 va_start (ap, nargs);
318 for (i = 0; i < nargs; i++)
319 gimple_call_set_arg (call, i, va_arg (ap, tree));
320 va_end (ap);
321
322 return call;
323}
324
325
326/* Build a GIMPLE_CALL statement to internal function FN with the arguments
327 specified in vector ARGS. */
328
538dd0b7 329gcall *
9771b263 330gimple_build_call_internal_vec (enum internal_fn fn, vec<tree> args)
25583c4f
RS
331{
332 unsigned i, nargs;
538dd0b7 333 gcall *call;
25583c4f 334
9771b263 335 nargs = args.length ();
25583c4f
RS
336 call = gimple_build_call_internal_1 (fn, nargs);
337 for (i = 0; i < nargs; i++)
9771b263 338 gimple_call_set_arg (call, i, args[i]);
25583c4f
RS
339
340 return call;
341}
342
343
726a989a
RB
344/* Build a GIMPLE_CALL statement from CALL_EXPR T. Note that T is
345 assumed to be in GIMPLE form already. Minimal checking is done of
346 this fact. */
347
538dd0b7 348gcall *
5c5f0b65 349gimple_build_call_from_tree (tree t, tree fnptrtype)
726a989a
RB
350{
351 unsigned i, nargs;
538dd0b7 352 gcall *call;
726a989a
RB
353
354 gcc_assert (TREE_CODE (t) == CALL_EXPR);
355
356 nargs = call_expr_nargs (t);
e4f81565
RS
357
358 tree fndecl = NULL_TREE;
359 if (CALL_EXPR_FN (t) == NULL_TREE)
360 call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs);
361 else
362 {
363 fndecl = get_callee_fndecl (t);
364 call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs);
365 }
726a989a
RB
366
367 for (i = 0; i < nargs; i++)
368 gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i));
369
370 gimple_set_block (call, TREE_BLOCK (t));
025d57f0 371 gimple_set_location (call, EXPR_LOCATION (t));
726a989a
RB
372
373 /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL. */
374 gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t));
375 gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t));
9a385c2d 376 gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t));
726a989a 377 gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t));
63d2a353 378 if (fndecl
3d78e008 379 && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
9e878cf1 380 && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl)))
63d2a353
MM
381 gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t));
382 else
383 gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t));
726a989a 384 gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t));
9bb1a81b 385 gimple_call_set_nothrow (call, TREE_NOTHROW (t));
4c640e26 386 gimple_call_set_by_descriptor (call, CALL_EXPR_BY_DESCRIPTOR (t));
d665b6e5 387 gimple_set_no_warning (call, TREE_NO_WARNING (t));
726a989a 388
5c5f0b65
IT
389 if (fnptrtype)
390 {
391 gimple_call_set_fntype (call, TREE_TYPE (fnptrtype));
392
393 /* Check if it's an indirect CALL and the type has the
394 nocf_check attribute. In that case propagate the information
395 to the gimple CALL insn. */
396 if (!fndecl)
397 {
398 gcc_assert (POINTER_TYPE_P (fnptrtype));
399 tree fntype = TREE_TYPE (fnptrtype);
400
401 if (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (fntype)))
402 gimple_call_set_nocf_check (call, TRUE);
403 }
404 }
405
726a989a
RB
406 return call;
407}
408
409
726a989a
RB
410/* Build a GIMPLE_ASSIGN statement.
411
412 LHS of the assignment.
413 RHS of the assignment which can be unary or binary. */
414
538dd0b7 415gassign *
0d0e4a03 416gimple_build_assign (tree lhs, tree rhs MEM_STAT_DECL)
726a989a
RB
417{
418 enum tree_code subcode;
0354c0c7 419 tree op1, op2, op3;
726a989a 420
d1e2bb2d 421 extract_ops_from_tree (rhs, &subcode, &op1, &op2, &op3);
0d0e4a03 422 return gimple_build_assign (lhs, subcode, op1, op2, op3 PASS_MEM_STAT);
726a989a
RB
423}
424
425
7d05cebb 426/* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
0d0e4a03 427 OP1, OP2 and OP3. */
726a989a 428
0d0e4a03
JJ
429static inline gassign *
430gimple_build_assign_1 (tree lhs, enum tree_code subcode, tree op1,
431 tree op2, tree op3 MEM_STAT_DECL)
726a989a
RB
432{
433 unsigned num_ops;
538dd0b7 434 gassign *p;
726a989a
RB
435
436 /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the
437 code). */
438 num_ops = get_gimple_rhs_num_ops (subcode) + 1;
b8698a0f 439
538dd0b7
DM
440 p = as_a <gassign *> (
441 gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops
442 PASS_MEM_STAT));
726a989a
RB
443 gimple_assign_set_lhs (p, lhs);
444 gimple_assign_set_rhs1 (p, op1);
445 if (op2)
446 {
447 gcc_assert (num_ops > 2);
448 gimple_assign_set_rhs2 (p, op2);
449 }
450
0354c0c7
BS
451 if (op3)
452 {
453 gcc_assert (num_ops > 3);
454 gimple_assign_set_rhs3 (p, op3);
455 }
456
726a989a
RB
457 return p;
458}
459
0d0e4a03
JJ
460/* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
461 OP1, OP2 and OP3. */
462
463gassign *
464gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
465 tree op2, tree op3 MEM_STAT_DECL)
466{
467 return gimple_build_assign_1 (lhs, subcode, op1, op2, op3 PASS_MEM_STAT);
468}
469
470/* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
471 OP1 and OP2. */
472
538dd0b7 473gassign *
0d0e4a03
JJ
474gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
475 tree op2 MEM_STAT_DECL)
73804b12 476{
0d0e4a03
JJ
477 return gimple_build_assign_1 (lhs, subcode, op1, op2, NULL_TREE
478 PASS_MEM_STAT);
73804b12
RG
479}
480
0d0e4a03
JJ
481/* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operand OP1. */
482
538dd0b7 483gassign *
0d0e4a03 484gimple_build_assign (tree lhs, enum tree_code subcode, tree op1 MEM_STAT_DECL)
00d66391 485{
0d0e4a03
JJ
486 return gimple_build_assign_1 (lhs, subcode, op1, NULL_TREE, NULL_TREE
487 PASS_MEM_STAT);
00d66391
JJ
488}
489
726a989a 490
726a989a
RB
491/* Build a GIMPLE_COND statement.
492
493 PRED is the condition used to compare LHS and the RHS.
494 T_LABEL is the label to jump to if the condition is true.
495 F_LABEL is the label to jump to otherwise. */
496
538dd0b7 497gcond *
726a989a
RB
498gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs,
499 tree t_label, tree f_label)
500{
538dd0b7 501 gcond *p;
726a989a
RB
502
503 gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison);
538dd0b7 504 p = as_a <gcond *> (gimple_build_with_ops (GIMPLE_COND, pred_code, 4));
726a989a
RB
505 gimple_cond_set_lhs (p, lhs);
506 gimple_cond_set_rhs (p, rhs);
507 gimple_cond_set_true_label (p, t_label);
508 gimple_cond_set_false_label (p, f_label);
509 return p;
510}
511
726a989a
RB
512/* Build a GIMPLE_COND statement from the conditional expression tree
513 COND. T_LABEL and F_LABEL are as in gimple_build_cond. */
514
538dd0b7 515gcond *
726a989a
RB
516gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label)
517{
518 enum tree_code code;
519 tree lhs, rhs;
520
521 gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
522 return gimple_build_cond (code, lhs, rhs, t_label, f_label);
523}
524
525/* Set code, lhs, and rhs of a GIMPLE_COND from a suitable
526 boolean expression tree COND. */
527
528void
538dd0b7 529gimple_cond_set_condition_from_tree (gcond *stmt, tree cond)
726a989a
RB
530{
531 enum tree_code code;
532 tree lhs, rhs;
533
534 gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
535 gimple_cond_set_condition (stmt, code, lhs, rhs);
536}
537
538/* Build a GIMPLE_LABEL statement for LABEL. */
539
538dd0b7 540glabel *
726a989a
RB
541gimple_build_label (tree label)
542{
538dd0b7
DM
543 glabel *p
544 = as_a <glabel *> (gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1));
726a989a
RB
545 gimple_label_set_label (p, label);
546 return p;
547}
548
549/* Build a GIMPLE_GOTO statement to label DEST. */
550
538dd0b7 551ggoto *
726a989a
RB
552gimple_build_goto (tree dest)
553{
538dd0b7
DM
554 ggoto *p
555 = as_a <ggoto *> (gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1));
726a989a
RB
556 gimple_goto_set_dest (p, dest);
557 return p;
558}
559
560
561/* Build a GIMPLE_NOP statement. */
562
355fe088 563gimple *
726a989a
RB
564gimple_build_nop (void)
565{
566 return gimple_alloc (GIMPLE_NOP, 0);
567}
568
569
570/* Build a GIMPLE_BIND statement.
571 VARS are the variables in BODY.
572 BLOCK is the containing block. */
573
538dd0b7 574gbind *
726a989a
RB
575gimple_build_bind (tree vars, gimple_seq body, tree block)
576{
538dd0b7 577 gbind *p = as_a <gbind *> (gimple_alloc (GIMPLE_BIND, 0));
726a989a
RB
578 gimple_bind_set_vars (p, vars);
579 if (body)
580 gimple_bind_set_body (p, body);
581 if (block)
582 gimple_bind_set_block (p, block);
583 return p;
584}
585
586/* Helper function to set the simple fields of a asm stmt.
587
588 STRING is a pointer to a string that is the asm blocks assembly code.
589 NINPUT is the number of register inputs.
590 NOUTPUT is the number of register outputs.
591 NCLOBBERS is the number of clobbered registers.
592 */
593
538dd0b7 594static inline gasm *
b8698a0f 595gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs,
1c384bf1 596 unsigned nclobbers, unsigned nlabels)
726a989a 597{
538dd0b7 598 gasm *p;
726a989a
RB
599 int size = strlen (string);
600
1c384bf1
RH
601 /* ASMs with labels cannot have outputs. This should have been
602 enforced by the front end. */
603 gcc_assert (nlabels == 0 || noutputs == 0);
604
538dd0b7 605 p = as_a <gasm *> (
daa6e488
DM
606 gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK,
607 ninputs + noutputs + nclobbers + nlabels));
726a989a 608
daa6e488
DM
609 p->ni = ninputs;
610 p->no = noutputs;
611 p->nc = nclobbers;
612 p->nl = nlabels;
613 p->string = ggc_alloc_string (string, size);
726a989a 614
7aa6d18a
SB
615 if (GATHER_STATISTICS)
616 gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size;
b8698a0f 617
726a989a
RB
618 return p;
619}
620
621/* Build a GIMPLE_ASM statement.
622
623 STRING is the assembly code.
624 NINPUT is the number of register inputs.
625 NOUTPUT is the number of register outputs.
626 NCLOBBERS is the number of clobbered registers.
627 INPUTS is a vector of the input register parameters.
628 OUTPUTS is a vector of the output register parameters.
1c384bf1
RH
629 CLOBBERS is a vector of the clobbered register parameters.
630 LABELS is a vector of destination labels. */
726a989a 631
538dd0b7 632gasm *
9771b263
DN
633gimple_build_asm_vec (const char *string, vec<tree, va_gc> *inputs,
634 vec<tree, va_gc> *outputs, vec<tree, va_gc> *clobbers,
635 vec<tree, va_gc> *labels)
726a989a 636{
538dd0b7 637 gasm *p;
726a989a
RB
638 unsigned i;
639
640 p = gimple_build_asm_1 (string,
9771b263
DN
641 vec_safe_length (inputs),
642 vec_safe_length (outputs),
643 vec_safe_length (clobbers),
644 vec_safe_length (labels));
b8698a0f 645
9771b263
DN
646 for (i = 0; i < vec_safe_length (inputs); i++)
647 gimple_asm_set_input_op (p, i, (*inputs)[i]);
726a989a 648
9771b263
DN
649 for (i = 0; i < vec_safe_length (outputs); i++)
650 gimple_asm_set_output_op (p, i, (*outputs)[i]);
726a989a 651
9771b263
DN
652 for (i = 0; i < vec_safe_length (clobbers); i++)
653 gimple_asm_set_clobber_op (p, i, (*clobbers)[i]);
b8698a0f 654
9771b263
DN
655 for (i = 0; i < vec_safe_length (labels); i++)
656 gimple_asm_set_label_op (p, i, (*labels)[i]);
b8698a0f 657
726a989a
RB
658 return p;
659}
660
661/* Build a GIMPLE_CATCH statement.
662
663 TYPES are the catch types.
664 HANDLER is the exception handler. */
665
538dd0b7 666gcatch *
726a989a
RB
667gimple_build_catch (tree types, gimple_seq handler)
668{
538dd0b7 669 gcatch *p = as_a <gcatch *> (gimple_alloc (GIMPLE_CATCH, 0));
726a989a
RB
670 gimple_catch_set_types (p, types);
671 if (handler)
672 gimple_catch_set_handler (p, handler);
673
674 return p;
675}
676
677/* Build a GIMPLE_EH_FILTER statement.
678
679 TYPES are the filter's types.
680 FAILURE is the filter's failure action. */
681
538dd0b7 682geh_filter *
726a989a
RB
683gimple_build_eh_filter (tree types, gimple_seq failure)
684{
538dd0b7 685 geh_filter *p = as_a <geh_filter *> (gimple_alloc (GIMPLE_EH_FILTER, 0));
726a989a
RB
686 gimple_eh_filter_set_types (p, types);
687 if (failure)
688 gimple_eh_filter_set_failure (p, failure);
689
690 return p;
691}
692
1d65f45c
RH
693/* Build a GIMPLE_EH_MUST_NOT_THROW statement. */
694
538dd0b7 695geh_mnt *
1d65f45c
RH
696gimple_build_eh_must_not_throw (tree decl)
697{
538dd0b7 698 geh_mnt *p = as_a <geh_mnt *> (gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0));
1d65f45c
RH
699
700 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
701 gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
d7f09764 702 gimple_eh_must_not_throw_set_fndecl (p, decl);
1d65f45c
RH
703
704 return p;
705}
706
0a35513e
AH
707/* Build a GIMPLE_EH_ELSE statement. */
708
538dd0b7 709geh_else *
0a35513e
AH
710gimple_build_eh_else (gimple_seq n_body, gimple_seq e_body)
711{
538dd0b7 712 geh_else *p = as_a <geh_else *> (gimple_alloc (GIMPLE_EH_ELSE, 0));
0a35513e
AH
713 gimple_eh_else_set_n_body (p, n_body);
714 gimple_eh_else_set_e_body (p, e_body);
715 return p;
716}
717
726a989a
RB
718/* Build a GIMPLE_TRY statement.
719
720 EVAL is the expression to evaluate.
721 CLEANUP is the cleanup expression.
722 KIND is either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY depending on
723 whether this is a try/catch or a try/finally respectively. */
724
538dd0b7 725gtry *
726a989a
RB
726gimple_build_try (gimple_seq eval, gimple_seq cleanup,
727 enum gimple_try_flags kind)
728{
538dd0b7 729 gtry *p;
726a989a
RB
730
731 gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY);
538dd0b7 732 p = as_a <gtry *> (gimple_alloc (GIMPLE_TRY, 0));
726a989a
RB
733 gimple_set_subcode (p, kind);
734 if (eval)
735 gimple_try_set_eval (p, eval);
736 if (cleanup)
737 gimple_try_set_cleanup (p, cleanup);
738
739 return p;
740}
741
742/* Construct a GIMPLE_WITH_CLEANUP_EXPR statement.
743
744 CLEANUP is the cleanup expression. */
745
355fe088 746gimple *
726a989a
RB
747gimple_build_wce (gimple_seq cleanup)
748{
355fe088 749 gimple *p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0);
726a989a
RB
750 if (cleanup)
751 gimple_wce_set_cleanup (p, cleanup);
752
753 return p;
754}
755
756
1d65f45c 757/* Build a GIMPLE_RESX statement. */
726a989a 758
538dd0b7 759gresx *
726a989a
RB
760gimple_build_resx (int region)
761{
538dd0b7
DM
762 gresx *p
763 = as_a <gresx *> (gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0));
daa6e488 764 p->region = region;
726a989a
RB
765 return p;
766}
767
768
769/* The helper for constructing a gimple switch statement.
770 INDEX is the switch's index.
771 NLABELS is the number of labels in the switch excluding the default.
772 DEFAULT_LABEL is the default label for the switch statement. */
773
538dd0b7 774gswitch *
1d65f45c 775gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label)
726a989a
RB
776{
777 /* nlabels + 1 default label + 1 index. */
fd8d363e 778 gcc_checking_assert (default_label);
538dd0b7
DM
779 gswitch *p = as_a <gswitch *> (gimple_build_with_ops (GIMPLE_SWITCH,
780 ERROR_MARK,
781 1 + 1 + nlabels));
726a989a 782 gimple_switch_set_index (p, index);
fd8d363e 783 gimple_switch_set_default_label (p, default_label);
726a989a
RB
784 return p;
785}
786
726a989a
RB
787/* Build a GIMPLE_SWITCH statement.
788
789 INDEX is the switch's index.
790 DEFAULT_LABEL is the default label
791 ARGS is a vector of labels excluding the default. */
792
538dd0b7 793gswitch *
9771b263 794gimple_build_switch (tree index, tree default_label, vec<tree> args)
726a989a 795{
9771b263 796 unsigned i, nlabels = args.length ();
fd8d363e 797
538dd0b7 798 gswitch *p = gimple_build_switch_nlabels (nlabels, index, default_label);
726a989a 799
1d65f45c 800 /* Copy the labels from the vector to the switch statement. */
1d65f45c 801 for (i = 0; i < nlabels; i++)
9771b263 802 gimple_switch_set_label (p, i + 1, args[i]);
726a989a
RB
803
804 return p;
805}
806
1d65f45c
RH
807/* Build a GIMPLE_EH_DISPATCH statement. */
808
538dd0b7 809geh_dispatch *
1d65f45c
RH
810gimple_build_eh_dispatch (int region)
811{
538dd0b7
DM
812 geh_dispatch *p
813 = as_a <geh_dispatch *> (
814 gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0));
daa6e488 815 p->region = region;
1d65f45c
RH
816 return p;
817}
726a989a 818
b5b8b0ac
AO
819/* Build a new GIMPLE_DEBUG_BIND statement.
820
821 VAR is bound to VALUE; block and location are taken from STMT. */
822
538dd0b7 823gdebug *
59cdeebc 824gimple_build_debug_bind (tree var, tree value, gimple *stmt MEM_STAT_DECL)
b5b8b0ac 825{
538dd0b7
DM
826 gdebug *p
827 = as_a <gdebug *> (gimple_build_with_ops_stat (GIMPLE_DEBUG,
828 (unsigned)GIMPLE_DEBUG_BIND, 2
829 PASS_MEM_STAT));
b5b8b0ac
AO
830 gimple_debug_bind_set_var (p, var);
831 gimple_debug_bind_set_value (p, value);
832 if (stmt)
5368224f 833 gimple_set_location (p, gimple_location (stmt));
b5b8b0ac
AO
834
835 return p;
836}
837
838
ddb555ed
JJ
839/* Build a new GIMPLE_DEBUG_SOURCE_BIND statement.
840
841 VAR is bound to VALUE; block and location are taken from STMT. */
842
538dd0b7 843gdebug *
59cdeebc 844gimple_build_debug_source_bind (tree var, tree value,
355fe088 845 gimple *stmt MEM_STAT_DECL)
ddb555ed 846{
538dd0b7
DM
847 gdebug *p
848 = as_a <gdebug *> (
849 gimple_build_with_ops_stat (GIMPLE_DEBUG,
850 (unsigned)GIMPLE_DEBUG_SOURCE_BIND, 2
851 PASS_MEM_STAT));
ddb555ed
JJ
852
853 gimple_debug_source_bind_set_var (p, var);
854 gimple_debug_source_bind_set_value (p, value);
855 if (stmt)
5368224f 856 gimple_set_location (p, gimple_location (stmt));
ddb555ed
JJ
857
858 return p;
859}
860
861
96a95ac1
AO
862/* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at
863 LOCATION. */
864
865gdebug *
866gimple_build_debug_begin_stmt (tree block, location_t location
867 MEM_STAT_DECL)
868{
869 gdebug *p
870 = as_a <gdebug *> (
871 gimple_build_with_ops_stat (GIMPLE_DEBUG,
872 (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0
873 PASS_MEM_STAT));
874
875 gimple_set_location (p, location);
876 gimple_set_block (p, block);
877 cfun->debug_marker_count++;
878
879 return p;
880}
881
882
58006663
AO
883/* Build a new GIMPLE_DEBUG_INLINE_ENTRY statement in BLOCK at
884 LOCATION. The BLOCK links to the inlined function. */
885
886gdebug *
887gimple_build_debug_inline_entry (tree block, location_t location
888 MEM_STAT_DECL)
889{
890 gdebug *p
891 = as_a <gdebug *> (
892 gimple_build_with_ops_stat (GIMPLE_DEBUG,
893 (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0
894 PASS_MEM_STAT));
895
896 gimple_set_location (p, location);
897 gimple_set_block (p, block);
898 cfun->debug_marker_count++;
899
900 return p;
901}
902
903
726a989a
RB
904/* Build a GIMPLE_OMP_CRITICAL statement.
905
906 BODY is the sequence of statements for which only one thread can execute.
d9a6bd32
JJ
907 NAME is optional identifier for this critical block.
908 CLAUSES are clauses for this critical block. */
726a989a 909
538dd0b7 910gomp_critical *
d9a6bd32 911gimple_build_omp_critical (gimple_seq body, tree name, tree clauses)
726a989a 912{
538dd0b7
DM
913 gomp_critical *p
914 = as_a <gomp_critical *> (gimple_alloc (GIMPLE_OMP_CRITICAL, 0));
726a989a 915 gimple_omp_critical_set_name (p, name);
d9a6bd32 916 gimple_omp_critical_set_clauses (p, clauses);
726a989a
RB
917 if (body)
918 gimple_omp_set_body (p, body);
919
920 return p;
921}
922
923/* Build a GIMPLE_OMP_FOR statement.
924
925 BODY is sequence of statements inside the for loop.
74bf76ed 926 KIND is the `for' variant.
28567c40 927 CLAUSES are any of the construct's clauses.
726a989a
RB
928 COLLAPSE is the collapse count.
929 PRE_BODY is the sequence of statements that are loop invariant. */
930
538dd0b7 931gomp_for *
74bf76ed 932gimple_build_omp_for (gimple_seq body, int kind, tree clauses, size_t collapse,
726a989a
RB
933 gimple_seq pre_body)
934{
538dd0b7 935 gomp_for *p = as_a <gomp_for *> (gimple_alloc (GIMPLE_OMP_FOR, 0));
726a989a
RB
936 if (body)
937 gimple_omp_set_body (p, body);
938 gimple_omp_for_set_clauses (p, clauses);
74bf76ed 939 gimple_omp_for_set_kind (p, kind);
daa6e488 940 p->collapse = collapse;
766090c2 941 p->iter = ggc_cleared_vec_alloc<gimple_omp_for_iter> (collapse);
daa6e488 942
726a989a
RB
943 if (pre_body)
944 gimple_omp_for_set_pre_body (p, pre_body);
945
946 return p;
947}
948
949
950/* Build a GIMPLE_OMP_PARALLEL statement.
951
952 BODY is sequence of statements which are executed in parallel.
28567c40 953 CLAUSES are the OMP parallel construct's clauses.
726a989a
RB
954 CHILD_FN is the function created for the parallel threads to execute.
955 DATA_ARG are the shared data argument(s). */
956
538dd0b7 957gomp_parallel *
b8698a0f 958gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn,
726a989a
RB
959 tree data_arg)
960{
538dd0b7
DM
961 gomp_parallel *p
962 = as_a <gomp_parallel *> (gimple_alloc (GIMPLE_OMP_PARALLEL, 0));
726a989a
RB
963 if (body)
964 gimple_omp_set_body (p, body);
965 gimple_omp_parallel_set_clauses (p, clauses);
966 gimple_omp_parallel_set_child_fn (p, child_fn);
967 gimple_omp_parallel_set_data_arg (p, data_arg);
968
969 return p;
970}
971
972
973/* Build a GIMPLE_OMP_TASK statement.
974
975 BODY is sequence of statements which are executed by the explicit task.
28567c40 976 CLAUSES are the OMP task construct's clauses.
726a989a
RB
977 CHILD_FN is the function created for the parallel threads to execute.
978 DATA_ARG are the shared data argument(s).
979 COPY_FN is the optional function for firstprivate initialization.
980 ARG_SIZE and ARG_ALIGN are size and alignment of the data block. */
981
538dd0b7 982gomp_task *
726a989a
RB
983gimple_build_omp_task (gimple_seq body, tree clauses, tree child_fn,
984 tree data_arg, tree copy_fn, tree arg_size,
985 tree arg_align)
986{
538dd0b7 987 gomp_task *p = as_a <gomp_task *> (gimple_alloc (GIMPLE_OMP_TASK, 0));
726a989a
RB
988 if (body)
989 gimple_omp_set_body (p, body);
990 gimple_omp_task_set_clauses (p, clauses);
991 gimple_omp_task_set_child_fn (p, child_fn);
992 gimple_omp_task_set_data_arg (p, data_arg);
993 gimple_omp_task_set_copy_fn (p, copy_fn);
994 gimple_omp_task_set_arg_size (p, arg_size);
995 gimple_omp_task_set_arg_align (p, arg_align);
996
997 return p;
998}
999
1000
1001/* Build a GIMPLE_OMP_SECTION statement for a sections statement.
1002
1003 BODY is the sequence of statements in the section. */
1004
355fe088 1005gimple *
726a989a
RB
1006gimple_build_omp_section (gimple_seq body)
1007{
355fe088 1008 gimple *p = gimple_alloc (GIMPLE_OMP_SECTION, 0);
726a989a
RB
1009 if (body)
1010 gimple_omp_set_body (p, body);
1011
1012 return p;
1013}
1014
1015
1016/* Build a GIMPLE_OMP_MASTER statement.
1017
1018 BODY is the sequence of statements to be executed by just the master. */
1019
355fe088 1020gimple *
726a989a
RB
1021gimple_build_omp_master (gimple_seq body)
1022{
355fe088 1023 gimple *p = gimple_alloc (GIMPLE_OMP_MASTER, 0);
726a989a
RB
1024 if (body)
1025 gimple_omp_set_body (p, body);
1026
1027 return p;
1028}
1029
b2b40051
MJ
1030/* Build a GIMPLE_OMP_GRID_BODY statement.
1031
1032 BODY is the sequence of statements to be executed by the kernel. */
1033
1034gimple *
1035gimple_build_omp_grid_body (gimple_seq body)
1036{
1037 gimple *p = gimple_alloc (GIMPLE_OMP_GRID_BODY, 0);
1038 if (body)
1039 gimple_omp_set_body (p, body);
1040
1041 return p;
1042}
726a989a 1043
acf0174b
JJ
1044/* Build a GIMPLE_OMP_TASKGROUP statement.
1045
1046 BODY is the sequence of statements to be executed by the taskgroup
28567c40
JJ
1047 construct.
1048 CLAUSES are any of the construct's clauses. */
acf0174b 1049
355fe088 1050gimple *
28567c40 1051gimple_build_omp_taskgroup (gimple_seq body, tree clauses)
acf0174b 1052{
355fe088 1053 gimple *p = gimple_alloc (GIMPLE_OMP_TASKGROUP, 0);
28567c40 1054 gimple_omp_taskgroup_set_clauses (p, clauses);
acf0174b
JJ
1055 if (body)
1056 gimple_omp_set_body (p, body);
1057
1058 return p;
1059}
1060
1061
726a989a
RB
1062/* Build a GIMPLE_OMP_CONTINUE statement.
1063
1064 CONTROL_DEF is the definition of the control variable.
1065 CONTROL_USE is the use of the control variable. */
1066
538dd0b7 1067gomp_continue *
726a989a
RB
1068gimple_build_omp_continue (tree control_def, tree control_use)
1069{
538dd0b7
DM
1070 gomp_continue *p
1071 = as_a <gomp_continue *> (gimple_alloc (GIMPLE_OMP_CONTINUE, 0));
726a989a
RB
1072 gimple_omp_continue_set_control_def (p, control_def);
1073 gimple_omp_continue_set_control_use (p, control_use);
1074 return p;
1075}
1076
1077/* Build a GIMPLE_OMP_ORDERED statement.
1078
1079 BODY is the sequence of statements inside a loop that will executed in
d9a6bd32
JJ
1080 sequence.
1081 CLAUSES are clauses for this statement. */
726a989a 1082
d9a6bd32
JJ
1083gomp_ordered *
1084gimple_build_omp_ordered (gimple_seq body, tree clauses)
726a989a 1085{
d9a6bd32
JJ
1086 gomp_ordered *p
1087 = as_a <gomp_ordered *> (gimple_alloc (GIMPLE_OMP_ORDERED, 0));
1088 gimple_omp_ordered_set_clauses (p, clauses);
726a989a
RB
1089 if (body)
1090 gimple_omp_set_body (p, body);
1091
1092 return p;
1093}
1094
1095
1096/* Build a GIMPLE_OMP_RETURN statement.
1097 WAIT_P is true if this is a non-waiting return. */
1098
355fe088 1099gimple *
726a989a
RB
1100gimple_build_omp_return (bool wait_p)
1101{
355fe088 1102 gimple *p = gimple_alloc (GIMPLE_OMP_RETURN, 0);
726a989a
RB
1103 if (wait_p)
1104 gimple_omp_return_set_nowait (p);
1105
1106 return p;
1107}
1108
1109
1110/* Build a GIMPLE_OMP_SECTIONS statement.
1111
1112 BODY is a sequence of section statements.
1113 CLAUSES are any of the OMP sections contsruct's clauses: private,
1114 firstprivate, lastprivate, reduction, and nowait. */
1115
538dd0b7 1116gomp_sections *
726a989a
RB
1117gimple_build_omp_sections (gimple_seq body, tree clauses)
1118{
538dd0b7
DM
1119 gomp_sections *p
1120 = as_a <gomp_sections *> (gimple_alloc (GIMPLE_OMP_SECTIONS, 0));
726a989a
RB
1121 if (body)
1122 gimple_omp_set_body (p, body);
1123 gimple_omp_sections_set_clauses (p, clauses);
1124
1125 return p;
1126}
1127
1128
1129/* Build a GIMPLE_OMP_SECTIONS_SWITCH. */
1130
355fe088 1131gimple *
726a989a
RB
1132gimple_build_omp_sections_switch (void)
1133{
1134 return gimple_alloc (GIMPLE_OMP_SECTIONS_SWITCH, 0);
1135}
1136
1137
1138/* Build a GIMPLE_OMP_SINGLE statement.
1139
1140 BODY is the sequence of statements that will be executed once.
1141 CLAUSES are any of the OMP single construct's clauses: private, firstprivate,
1142 copyprivate, nowait. */
1143
538dd0b7 1144gomp_single *
726a989a
RB
1145gimple_build_omp_single (gimple_seq body, tree clauses)
1146{
538dd0b7
DM
1147 gomp_single *p
1148 = as_a <gomp_single *> (gimple_alloc (GIMPLE_OMP_SINGLE, 0));
726a989a
RB
1149 if (body)
1150 gimple_omp_set_body (p, body);
1151 gimple_omp_single_set_clauses (p, clauses);
1152
1153 return p;
1154}
1155
1156
acf0174b
JJ
1157/* Build a GIMPLE_OMP_TARGET statement.
1158
1159 BODY is the sequence of statements that will be executed.
41dbbb37
TS
1160 KIND is the kind of the region.
1161 CLAUSES are any of the construct's clauses. */
acf0174b 1162
538dd0b7 1163gomp_target *
acf0174b
JJ
1164gimple_build_omp_target (gimple_seq body, int kind, tree clauses)
1165{
538dd0b7
DM
1166 gomp_target *p
1167 = as_a <gomp_target *> (gimple_alloc (GIMPLE_OMP_TARGET, 0));
acf0174b
JJ
1168 if (body)
1169 gimple_omp_set_body (p, body);
1170 gimple_omp_target_set_clauses (p, clauses);
1171 gimple_omp_target_set_kind (p, kind);
1172
1173 return p;
1174}
1175
1176
1177/* Build a GIMPLE_OMP_TEAMS statement.
1178
1179 BODY is the sequence of statements that will be executed.
1180 CLAUSES are any of the OMP teams construct's clauses. */
1181
538dd0b7 1182gomp_teams *
acf0174b
JJ
1183gimple_build_omp_teams (gimple_seq body, tree clauses)
1184{
538dd0b7 1185 gomp_teams *p = as_a <gomp_teams *> (gimple_alloc (GIMPLE_OMP_TEAMS, 0));
acf0174b
JJ
1186 if (body)
1187 gimple_omp_set_body (p, body);
1188 gimple_omp_teams_set_clauses (p, clauses);
1189
1190 return p;
1191}
1192
1193
726a989a
RB
1194/* Build a GIMPLE_OMP_ATOMIC_LOAD statement. */
1195
538dd0b7 1196gomp_atomic_load *
28567c40 1197gimple_build_omp_atomic_load (tree lhs, tree rhs, enum omp_memory_order mo)
726a989a 1198{
538dd0b7
DM
1199 gomp_atomic_load *p
1200 = as_a <gomp_atomic_load *> (gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0));
726a989a
RB
1201 gimple_omp_atomic_load_set_lhs (p, lhs);
1202 gimple_omp_atomic_load_set_rhs (p, rhs);
28567c40 1203 gimple_omp_atomic_set_memory_order (p, mo);
726a989a
RB
1204 return p;
1205}
1206
1207/* Build a GIMPLE_OMP_ATOMIC_STORE statement.
1208
1209 VAL is the value we are storing. */
1210
538dd0b7 1211gomp_atomic_store *
28567c40 1212gimple_build_omp_atomic_store (tree val, enum omp_memory_order mo)
726a989a 1213{
538dd0b7
DM
1214 gomp_atomic_store *p
1215 = as_a <gomp_atomic_store *> (gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0));
726a989a 1216 gimple_omp_atomic_store_set_val (p, val);
28567c40 1217 gimple_omp_atomic_set_memory_order (p, mo);
726a989a
RB
1218 return p;
1219}
1220
0a35513e
AH
1221/* Build a GIMPLE_TRANSACTION statement. */
1222
538dd0b7 1223gtransaction *
7c11b0fe 1224gimple_build_transaction (gimple_seq body)
0a35513e 1225{
538dd0b7
DM
1226 gtransaction *p
1227 = as_a <gtransaction *> (gimple_alloc (GIMPLE_TRANSACTION, 0));
0a35513e 1228 gimple_transaction_set_body (p, body);
7c11b0fe
RH
1229 gimple_transaction_set_label_norm (p, 0);
1230 gimple_transaction_set_label_uninst (p, 0);
1231 gimple_transaction_set_label_over (p, 0);
0a35513e
AH
1232 return p;
1233}
1234
cea094ed 1235#if defined ENABLE_GIMPLE_CHECKING
726a989a
RB
1236/* Complain of a gimple type mismatch and die. */
1237
1238void
355fe088 1239gimple_check_failed (const gimple *gs, const char *file, int line,
726a989a
RB
1240 const char *function, enum gimple_code code,
1241 enum tree_code subcode)
1242{
1243 internal_error ("gimple check: expected %s(%s), have %s(%s) in %s, at %s:%d",
1244 gimple_code_name[code],
5806f481 1245 get_tree_code_name (subcode),
726a989a 1246 gimple_code_name[gimple_code (gs)],
daa6e488
DM
1247 gs->subcode > 0
1248 ? get_tree_code_name ((enum tree_code) gs->subcode)
726a989a
RB
1249 : "",
1250 function, trim_filename (file), line);
1251}
726a989a
RB
1252#endif /* ENABLE_GIMPLE_CHECKING */
1253
1254
726a989a
RB
1255/* Link gimple statement GS to the end of the sequence *SEQ_P. If
1256 *SEQ_P is NULL, a new sequence is allocated. */
1257
1258void
355fe088 1259gimple_seq_add_stmt (gimple_seq *seq_p, gimple *gs)
726a989a
RB
1260{
1261 gimple_stmt_iterator si;
726a989a
RB
1262 if (gs == NULL)
1263 return;
1264
726a989a
RB
1265 si = gsi_last (*seq_p);
1266 gsi_insert_after (&si, gs, GSI_NEW_STMT);
1267}
1268
45b0be94
AM
1269/* Link gimple statement GS to the end of the sequence *SEQ_P. If
1270 *SEQ_P is NULL, a new sequence is allocated. This function is
1271 similar to gimple_seq_add_stmt, but does not scan the operands.
1272 During gimplification, we need to manipulate statement sequences
1273 before the def/use vectors have been constructed. */
1274
1275void
355fe088 1276gimple_seq_add_stmt_without_update (gimple_seq *seq_p, gimple *gs)
45b0be94
AM
1277{
1278 gimple_stmt_iterator si;
1279
1280 if (gs == NULL)
1281 return;
1282
1283 si = gsi_last (*seq_p);
1284 gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT);
1285}
726a989a
RB
1286
1287/* Append sequence SRC to the end of sequence *DST_P. If *DST_P is
1288 NULL, a new sequence is allocated. */
1289
1290void
1291gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
1292{
1293 gimple_stmt_iterator si;
726a989a
RB
1294 if (src == NULL)
1295 return;
1296
726a989a
RB
1297 si = gsi_last (*dst_p);
1298 gsi_insert_seq_after (&si, src, GSI_NEW_STMT);
1299}
1300
fef5a0d9
RB
1301/* Append sequence SRC to the end of sequence *DST_P. If *DST_P is
1302 NULL, a new sequence is allocated. This function is
1303 similar to gimple_seq_add_seq, but does not scan the operands. */
1304
1305void
1306gimple_seq_add_seq_without_update (gimple_seq *dst_p, gimple_seq src)
1307{
1308 gimple_stmt_iterator si;
1309 if (src == NULL)
1310 return;
1311
1312 si = gsi_last (*dst_p);
1313 gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT);
1314}
1315
45b0be94
AM
1316/* Determine whether to assign a location to the statement GS. */
1317
1318static bool
355fe088 1319should_carry_location_p (gimple *gs)
45b0be94
AM
1320{
1321 /* Don't emit a line note for a label. We particularly don't want to
1322 emit one for the break label, since it doesn't actually correspond
1323 to the beginning of the loop/switch. */
1324 if (gimple_code (gs) == GIMPLE_LABEL)
1325 return false;
1326
1327 return true;
1328}
1329
1330/* Set the location for gimple statement GS to LOCATION. */
1331
1332static void
355fe088 1333annotate_one_with_location (gimple *gs, location_t location)
45b0be94
AM
1334{
1335 if (!gimple_has_location (gs)
1336 && !gimple_do_not_emit_location_p (gs)
1337 && should_carry_location_p (gs))
1338 gimple_set_location (gs, location);
1339}
1340
1341/* Set LOCATION for all the statements after iterator GSI in sequence
1342 SEQ. If GSI is pointing to the end of the sequence, start with the
1343 first statement in SEQ. */
1344
1345void
1346annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
1347 location_t location)
1348{
1349 if (gsi_end_p (gsi))
1350 gsi = gsi_start (seq);
1351 else
1352 gsi_next (&gsi);
1353
1354 for (; !gsi_end_p (gsi); gsi_next (&gsi))
1355 annotate_one_with_location (gsi_stmt (gsi), location);
1356}
1357
1358/* Set the location for all the statements in a sequence STMT_P to LOCATION. */
1359
1360void
1361annotate_all_with_location (gimple_seq stmt_p, location_t location)
1362{
1363 gimple_stmt_iterator i;
1364
1365 if (gimple_seq_empty_p (stmt_p))
1366 return;
1367
1368 for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
1369 {
355fe088 1370 gimple *gs = gsi_stmt (i);
45b0be94
AM
1371 annotate_one_with_location (gs, location);
1372 }
1373}
726a989a
RB
1374
1375/* Helper function of empty_body_p. Return true if STMT is an empty
1376 statement. */
1377
1378static bool
355fe088 1379empty_stmt_p (gimple *stmt)
726a989a
RB
1380{
1381 if (gimple_code (stmt) == GIMPLE_NOP)
1382 return true;
538dd0b7
DM
1383 if (gbind *bind_stmt = dyn_cast <gbind *> (stmt))
1384 return empty_body_p (gimple_bind_body (bind_stmt));
726a989a
RB
1385 return false;
1386}
1387
1388
1389/* Return true if BODY contains nothing but empty statements. */
1390
1391bool
1392empty_body_p (gimple_seq body)
1393{
1394 gimple_stmt_iterator i;
1395
726a989a
RB
1396 if (gimple_seq_empty_p (body))
1397 return true;
1398 for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i))
b5b8b0ac
AO
1399 if (!empty_stmt_p (gsi_stmt (i))
1400 && !is_gimple_debug (gsi_stmt (i)))
726a989a
RB
1401 return false;
1402
1403 return true;
1404}
1405
1406
1407/* Perform a deep copy of sequence SRC and return the result. */
1408
1409gimple_seq
1410gimple_seq_copy (gimple_seq src)
1411{
1412 gimple_stmt_iterator gsi;
355a7673 1413 gimple_seq new_seq = NULL;
355fe088 1414 gimple *stmt;
726a989a
RB
1415
1416 for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi))
1417 {
1418 stmt = gimple_copy (gsi_stmt (gsi));
82d6e6fc 1419 gimple_seq_add_stmt (&new_seq, stmt);
726a989a
RB
1420 }
1421
82d6e6fc 1422 return new_seq;
726a989a
RB
1423}
1424
1425
726a989a 1426
25583c4f
RS
1427/* Return true if calls C1 and C2 are known to go to the same function. */
1428
1429bool
355fe088 1430gimple_call_same_target_p (const gimple *c1, const gimple *c2)
25583c4f
RS
1431{
1432 if (gimple_call_internal_p (c1))
1433 return (gimple_call_internal_p (c2)
8ab78162 1434 && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2)
3433ee35
NS
1435 && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1))
1436 || c1 == c2));
25583c4f
RS
1437 else
1438 return (gimple_call_fn (c1) == gimple_call_fn (c2)
1439 || (gimple_call_fndecl (c1)
1440 && gimple_call_fndecl (c1) == gimple_call_fndecl (c2)));
1441}
1442
726a989a
RB
1443/* Detect flags from a GIMPLE_CALL. This is just like
1444 call_expr_flags, but for gimple tuples. */
1445
1446int
355fe088 1447gimple_call_flags (const gimple *stmt)
726a989a 1448{
0e02fb26 1449 int flags = 0;
726a989a 1450
0e02fb26 1451 if (gimple_call_internal_p (stmt))
25583c4f 1452 flags = internal_fn_flags (gimple_call_internal_fn (stmt));
726a989a 1453 else
0e02fb26
RB
1454 {
1455 tree decl = gimple_call_fndecl (stmt);
1456 if (decl)
1457 flags = flags_from_decl_or_type (decl);
1458 flags |= flags_from_decl_or_type (gimple_call_fntype (stmt));
1459 }
726a989a 1460
daa6e488 1461 if (stmt->subcode & GF_CALL_NOTHROW)
9bb1a81b
JM
1462 flags |= ECF_NOTHROW;
1463
4c640e26
EB
1464 if (stmt->subcode & GF_CALL_BY_DESCRIPTOR)
1465 flags |= ECF_BY_DESCRIPTOR;
1466
726a989a
RB
1467 return flags;
1468}
1469
25583c4f
RS
1470/* Return the "fn spec" string for call STMT. */
1471
b78475cf 1472static const_tree
538dd0b7 1473gimple_call_fnspec (const gcall *stmt)
25583c4f
RS
1474{
1475 tree type, attr;
1476
b78475cf
YG
1477 if (gimple_call_internal_p (stmt))
1478 return internal_fn_fnspec (gimple_call_internal_fn (stmt));
1479
25583c4f
RS
1480 type = gimple_call_fntype (stmt);
1481 if (!type)
1482 return NULL_TREE;
1483
1484 attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
1485 if (!attr)
1486 return NULL_TREE;
1487
1488 return TREE_VALUE (TREE_VALUE (attr));
1489}
1490
0b7b376d
RG
1491/* Detects argument flags for argument number ARG on call STMT. */
1492
1493int
538dd0b7 1494gimple_call_arg_flags (const gcall *stmt, unsigned arg)
0b7b376d 1495{
b78475cf 1496 const_tree attr = gimple_call_fnspec (stmt);
0b7b376d 1497
25583c4f 1498 if (!attr || 1 + arg >= (unsigned) TREE_STRING_LENGTH (attr))
0b7b376d
RG
1499 return 0;
1500
1501 switch (TREE_STRING_POINTER (attr)[1 + arg])
1502 {
1503 case 'x':
1504 case 'X':
1505 return EAF_UNUSED;
1506
1507 case 'R':
1508 return EAF_DIRECT | EAF_NOCLOBBER | EAF_NOESCAPE;
1509
1510 case 'r':
1511 return EAF_NOCLOBBER | EAF_NOESCAPE;
1512
1513 case 'W':
1514 return EAF_DIRECT | EAF_NOESCAPE;
1515
1516 case 'w':
1517 return EAF_NOESCAPE;
1518
1519 case '.':
1520 default:
1521 return 0;
1522 }
1523}
1524
1525/* Detects return flags for the call STMT. */
1526
1527int
538dd0b7 1528gimple_call_return_flags (const gcall *stmt)
0b7b376d 1529{
b78475cf 1530 const_tree attr;
0b7b376d
RG
1531
1532 if (gimple_call_flags (stmt) & ECF_MALLOC)
1533 return ERF_NOALIAS;
1534
25583c4f
RS
1535 attr = gimple_call_fnspec (stmt);
1536 if (!attr || TREE_STRING_LENGTH (attr) < 1)
0b7b376d
RG
1537 return 0;
1538
1539 switch (TREE_STRING_POINTER (attr)[0])
1540 {
1541 case '1':
1542 case '2':
1543 case '3':
1544 case '4':
1545 return ERF_RETURNS_ARG | (TREE_STRING_POINTER (attr)[0] - '1');
1546
1547 case 'm':
1548 return ERF_NOALIAS;
1549
1550 case '.':
1551 default:
1552 return 0;
1553 }
1554}
726a989a 1555
3dbe9454 1556
288aaa5f
AH
1557/* Return true if call STMT is known to return a non-zero result. */
1558
1559bool
1560gimple_call_nonnull_result_p (gcall *call)
1561{
1562 tree fndecl = gimple_call_fndecl (call);
1563 if (!fndecl)
1564 return false;
1565 if (flag_delete_null_pointer_checks && !flag_check_new
1566 && DECL_IS_OPERATOR_NEW (fndecl)
1567 && !TREE_NOTHROW (fndecl))
1568 return true;
1569
1570 /* References are always non-NULL. */
1571 if (flag_delete_null_pointer_checks
1572 && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE)
1573 return true;
1574
1575 if (flag_delete_null_pointer_checks
1576 && lookup_attribute ("returns_nonnull",
1577 TYPE_ATTRIBUTES (gimple_call_fntype (call))))
1578 return true;
1579 return gimple_alloca_call_p (call);
1580}
1581
1582
1583/* If CALL returns a non-null result in an argument, return that arg. */
1584
1585tree
1586gimple_call_nonnull_arg (gcall *call)
1587{
1588 tree fndecl = gimple_call_fndecl (call);
1589 if (!fndecl)
1590 return NULL_TREE;
1591
1592 unsigned rf = gimple_call_return_flags (call);
1593 if (rf & ERF_RETURNS_ARG)
1594 {
1595 unsigned argnum = rf & ERF_RETURN_ARG_MASK;
1596 if (argnum < gimple_call_num_args (call))
1597 {
1598 tree arg = gimple_call_arg (call, argnum);
1599 if (SSA_VAR_P (arg)
1600 && infer_nonnull_range_by_attribute (call, arg))
1601 return arg;
1602 }
1603 }
1604 return NULL_TREE;
1605}
1606
1607
726a989a
RB
1608/* Return true if GS is a copy assignment. */
1609
1610bool
355fe088 1611gimple_assign_copy_p (gimple *gs)
726a989a 1612{
3dbe9454
RG
1613 return (gimple_assign_single_p (gs)
1614 && is_gimple_val (gimple_op (gs, 1)));
726a989a
RB
1615}
1616
1617
1618/* Return true if GS is a SSA_NAME copy assignment. */
1619
1620bool
355fe088 1621gimple_assign_ssa_name_copy_p (gimple *gs)
726a989a 1622{
3dbe9454 1623 return (gimple_assign_single_p (gs)
726a989a
RB
1624 && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME
1625 && TREE_CODE (gimple_assign_rhs1 (gs)) == SSA_NAME);
1626}
1627
1628
726a989a
RB
1629/* Return true if GS is an assignment with a unary RHS, but the
1630 operator has no effect on the assigned value. The logic is adapted
1631 from STRIP_NOPS. This predicate is intended to be used in tuplifying
1632 instances in which STRIP_NOPS was previously applied to the RHS of
1633 an assignment.
1634
1635 NOTE: In the use cases that led to the creation of this function
1636 and of gimple_assign_single_p, it is typical to test for either
1637 condition and to proceed in the same manner. In each case, the
1638 assigned value is represented by the single RHS operand of the
1639 assignment. I suspect there may be cases where gimple_assign_copy_p,
1640 gimple_assign_single_p, or equivalent logic is used where a similar
1641 treatment of unary NOPs is appropriate. */
b8698a0f 1642
726a989a 1643bool
355fe088 1644gimple_assign_unary_nop_p (gimple *gs)
726a989a 1645{
3dbe9454 1646 return (is_gimple_assign (gs)
1a87cf0c 1647 && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs))
726a989a
RB
1648 || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR)
1649 && gimple_assign_rhs1 (gs) != error_mark_node
1650 && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs)))
1651 == TYPE_MODE (TREE_TYPE (gimple_assign_rhs1 (gs)))));
1652}
1653
1654/* Set BB to be the basic block holding G. */
1655
1656void
355fe088 1657gimple_set_bb (gimple *stmt, basic_block bb)
726a989a 1658{
daa6e488 1659 stmt->bb = bb;
726a989a 1660
45b62594
RB
1661 if (gimple_code (stmt) != GIMPLE_LABEL)
1662 return;
1663
726a989a
RB
1664 /* If the statement is a label, add the label to block-to-labels map
1665 so that we can speed up edge creation for GIMPLE_GOTOs. */
45b62594 1666 if (cfun->cfg)
726a989a
RB
1667 {
1668 tree t;
1669 int uid;
1670
538dd0b7 1671 t = gimple_label_label (as_a <glabel *> (stmt));
726a989a
RB
1672 uid = LABEL_DECL_UID (t);
1673 if (uid == -1)
1674 {
99729d91
DM
1675 unsigned old_len =
1676 vec_safe_length (label_to_block_map_for_fn (cfun));
726a989a
RB
1677 LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++;
1678 if (old_len <= (unsigned) uid)
1679 {
5006671f 1680 unsigned new_len = 3 * uid / 2 + 1;
726a989a 1681
99729d91
DM
1682 vec_safe_grow_cleared (label_to_block_map_for_fn (cfun),
1683 new_len);
726a989a
RB
1684 }
1685 }
1686
99729d91 1687 (*label_to_block_map_for_fn (cfun))[uid] = bb;
726a989a
RB
1688 }
1689}
1690
1691
726a989a
RB
1692/* Modify the RHS of the assignment pointed-to by GSI using the
1693 operands in the expression tree EXPR.
1694
1695 NOTE: The statement pointed-to by GSI may be reallocated if it
1696 did not have enough operand slots.
1697
1698 This function is useful to convert an existing tree expression into
1699 the flat representation used for the RHS of a GIMPLE assignment.
1700 It will reallocate memory as needed to expand or shrink the number
1701 of operand slots needed to represent EXPR.
1702
1703 NOTE: If you find yourself building a tree and then calling this
1704 function, you are most certainly doing it the slow way. It is much
1705 better to build a new assignment or to use the function
1706 gimple_assign_set_rhs_with_ops, which does not require an
1707 expression tree to be built. */
1708
1709void
1710gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr)
1711{
1712 enum tree_code subcode;
0354c0c7 1713 tree op1, op2, op3;
726a989a 1714
d1e2bb2d 1715 extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3);
00d66391 1716 gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3);
726a989a
RB
1717}
1718
1719
1720/* Set the RHS of assignment statement pointed-to by GSI to CODE with
0354c0c7 1721 operands OP1, OP2 and OP3.
726a989a
RB
1722
1723 NOTE: The statement pointed-to by GSI may be reallocated if it
1724 did not have enough operand slots. */
1725
1726void
00d66391
JJ
1727gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
1728 tree op1, tree op2, tree op3)
726a989a
RB
1729{
1730 unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
355fe088 1731 gimple *stmt = gsi_stmt (*gsi);
d9611f55 1732 gimple *old_stmt = stmt;
726a989a
RB
1733
1734 /* If the new CODE needs more operands, allocate a new statement. */
1735 if (gimple_num_ops (stmt) < new_rhs_ops + 1)
1736 {
d9611f55
RB
1737 tree lhs = gimple_assign_lhs (old_stmt);
1738 stmt = gimple_alloc (gimple_code (old_stmt), new_rhs_ops + 1);
1739 memcpy (stmt, old_stmt, gimple_size (gimple_code (old_stmt)));
1740 gimple_init_singleton (stmt);
726a989a
RB
1741
1742 /* The LHS needs to be reset as this also changes the SSA name
1743 on the LHS. */
1744 gimple_assign_set_lhs (stmt, lhs);
1745 }
1746
1747 gimple_set_num_ops (stmt, new_rhs_ops + 1);
1748 gimple_set_subcode (stmt, code);
1749 gimple_assign_set_rhs1 (stmt, op1);
1750 if (new_rhs_ops > 1)
1751 gimple_assign_set_rhs2 (stmt, op2);
0354c0c7
BS
1752 if (new_rhs_ops > 2)
1753 gimple_assign_set_rhs3 (stmt, op3);
d9611f55
RB
1754 if (stmt != old_stmt)
1755 gsi_replace (gsi, stmt, true);
726a989a
RB
1756}
1757
1758
1759/* Return the LHS of a statement that performs an assignment,
1760 either a GIMPLE_ASSIGN or a GIMPLE_CALL. Returns NULL_TREE
1761 for a call to a function that returns no value, or for a
1762 statement other than an assignment or a call. */
1763
1764tree
355fe088 1765gimple_get_lhs (const gimple *stmt)
726a989a 1766{
e0c68ce9 1767 enum gimple_code code = gimple_code (stmt);
726a989a
RB
1768
1769 if (code == GIMPLE_ASSIGN)
1770 return gimple_assign_lhs (stmt);
1771 else if (code == GIMPLE_CALL)
1772 return gimple_call_lhs (stmt);
1773 else
1774 return NULL_TREE;
1775}
1776
1777
1778/* Set the LHS of a statement that performs an assignment,
1779 either a GIMPLE_ASSIGN or a GIMPLE_CALL. */
1780
1781void
355fe088 1782gimple_set_lhs (gimple *stmt, tree lhs)
726a989a 1783{
e0c68ce9 1784 enum gimple_code code = gimple_code (stmt);
726a989a
RB
1785
1786 if (code == GIMPLE_ASSIGN)
1787 gimple_assign_set_lhs (stmt, lhs);
1788 else if (code == GIMPLE_CALL)
1789 gimple_call_set_lhs (stmt, lhs);
1790 else
c3284718 1791 gcc_unreachable ();
726a989a
RB
1792}
1793
1794
1795/* Return a deep copy of statement STMT. All the operands from STMT
1796 are reallocated and copied using unshare_expr. The DEF, USE, VDEF
355a7673
MM
1797 and VUSE operand arrays are set to empty in the new copy. The new
1798 copy isn't part of any sequence. */
726a989a 1799
355fe088
TS
1800gimple *
1801gimple_copy (gimple *stmt)
726a989a
RB
1802{
1803 enum gimple_code code = gimple_code (stmt);
1804 unsigned num_ops = gimple_num_ops (stmt);
355fe088 1805 gimple *copy = gimple_alloc (code, num_ops);
726a989a
RB
1806 unsigned i;
1807
1808 /* Shallow copy all the fields from STMT. */
1809 memcpy (copy, stmt, gimple_size (code));
355a7673 1810 gimple_init_singleton (copy);
726a989a
RB
1811
1812 /* If STMT has sub-statements, deep-copy them as well. */
1813 if (gimple_has_substatements (stmt))
1814 {
1815 gimple_seq new_seq;
1816 tree t;
1817
1818 switch (gimple_code (stmt))
1819 {
1820 case GIMPLE_BIND:
538dd0b7
DM
1821 {
1822 gbind *bind_stmt = as_a <gbind *> (stmt);
1823 gbind *bind_copy = as_a <gbind *> (copy);
1824 new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt));
1825 gimple_bind_set_body (bind_copy, new_seq);
1826 gimple_bind_set_vars (bind_copy,
1827 unshare_expr (gimple_bind_vars (bind_stmt)));
1828 gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt));
1829 }
726a989a
RB
1830 break;
1831
1832 case GIMPLE_CATCH:
538dd0b7
DM
1833 {
1834 gcatch *catch_stmt = as_a <gcatch *> (stmt);
1835 gcatch *catch_copy = as_a <gcatch *> (copy);
1836 new_seq = gimple_seq_copy (gimple_catch_handler (catch_stmt));
1837 gimple_catch_set_handler (catch_copy, new_seq);
1838 t = unshare_expr (gimple_catch_types (catch_stmt));
1839 gimple_catch_set_types (catch_copy, t);
1840 }
726a989a
RB
1841 break;
1842
1843 case GIMPLE_EH_FILTER:
538dd0b7
DM
1844 {
1845 geh_filter *eh_filter_stmt = as_a <geh_filter *> (stmt);
1846 geh_filter *eh_filter_copy = as_a <geh_filter *> (copy);
1847 new_seq
1848 = gimple_seq_copy (gimple_eh_filter_failure (eh_filter_stmt));
1849 gimple_eh_filter_set_failure (eh_filter_copy, new_seq);
1850 t = unshare_expr (gimple_eh_filter_types (eh_filter_stmt));
1851 gimple_eh_filter_set_types (eh_filter_copy, t);
1852 }
726a989a
RB
1853 break;
1854
0a35513e 1855 case GIMPLE_EH_ELSE:
538dd0b7
DM
1856 {
1857 geh_else *eh_else_stmt = as_a <geh_else *> (stmt);
1858 geh_else *eh_else_copy = as_a <geh_else *> (copy);
1859 new_seq = gimple_seq_copy (gimple_eh_else_n_body (eh_else_stmt));
1860 gimple_eh_else_set_n_body (eh_else_copy, new_seq);
1861 new_seq = gimple_seq_copy (gimple_eh_else_e_body (eh_else_stmt));
1862 gimple_eh_else_set_e_body (eh_else_copy, new_seq);
1863 }
0a35513e
AH
1864 break;
1865
726a989a 1866 case GIMPLE_TRY:
538dd0b7
DM
1867 {
1868 gtry *try_stmt = as_a <gtry *> (stmt);
1869 gtry *try_copy = as_a <gtry *> (copy);
1870 new_seq = gimple_seq_copy (gimple_try_eval (try_stmt));
1871 gimple_try_set_eval (try_copy, new_seq);
1872 new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt));
1873 gimple_try_set_cleanup (try_copy, new_seq);
1874 }
726a989a
RB
1875 break;
1876
1877 case GIMPLE_OMP_FOR:
1878 new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt));
1879 gimple_omp_for_set_pre_body (copy, new_seq);
1880 t = unshare_expr (gimple_omp_for_clauses (stmt));
1881 gimple_omp_for_set_clauses (copy, t);
daa6e488 1882 {
538dd0b7 1883 gomp_for *omp_for_copy = as_a <gomp_for *> (copy);
766090c2
TS
1884 omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter>
1885 ( gimple_omp_for_collapse (stmt));
daa6e488 1886 }
726a989a
RB
1887 for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
1888 {
1889 gimple_omp_for_set_cond (copy, i,
1890 gimple_omp_for_cond (stmt, i));
1891 gimple_omp_for_set_index (copy, i,
1892 gimple_omp_for_index (stmt, i));
1893 t = unshare_expr (gimple_omp_for_initial (stmt, i));
1894 gimple_omp_for_set_initial (copy, i, t);
1895 t = unshare_expr (gimple_omp_for_final (stmt, i));
1896 gimple_omp_for_set_final (copy, i, t);
1897 t = unshare_expr (gimple_omp_for_incr (stmt, i));
1898 gimple_omp_for_set_incr (copy, i, t);
1899 }
1900 goto copy_omp_body;
1901
1902 case GIMPLE_OMP_PARALLEL:
538dd0b7
DM
1903 {
1904 gomp_parallel *omp_par_stmt = as_a <gomp_parallel *> (stmt);
1905 gomp_parallel *omp_par_copy = as_a <gomp_parallel *> (copy);
1906 t = unshare_expr (gimple_omp_parallel_clauses (omp_par_stmt));
1907 gimple_omp_parallel_set_clauses (omp_par_copy, t);
1908 t = unshare_expr (gimple_omp_parallel_child_fn (omp_par_stmt));
1909 gimple_omp_parallel_set_child_fn (omp_par_copy, t);
1910 t = unshare_expr (gimple_omp_parallel_data_arg (omp_par_stmt));
1911 gimple_omp_parallel_set_data_arg (omp_par_copy, t);
1912 }
726a989a
RB
1913 goto copy_omp_body;
1914
1915 case GIMPLE_OMP_TASK:
1916 t = unshare_expr (gimple_omp_task_clauses (stmt));
1917 gimple_omp_task_set_clauses (copy, t);
1918 t = unshare_expr (gimple_omp_task_child_fn (stmt));
1919 gimple_omp_task_set_child_fn (copy, t);
1920 t = unshare_expr (gimple_omp_task_data_arg (stmt));
1921 gimple_omp_task_set_data_arg (copy, t);
1922 t = unshare_expr (gimple_omp_task_copy_fn (stmt));
1923 gimple_omp_task_set_copy_fn (copy, t);
1924 t = unshare_expr (gimple_omp_task_arg_size (stmt));
1925 gimple_omp_task_set_arg_size (copy, t);
1926 t = unshare_expr (gimple_omp_task_arg_align (stmt));
1927 gimple_omp_task_set_arg_align (copy, t);
1928 goto copy_omp_body;
1929
1930 case GIMPLE_OMP_CRITICAL:
d9a6bd32
JJ
1931 t = unshare_expr (gimple_omp_critical_name
1932 (as_a <gomp_critical *> (stmt)));
538dd0b7 1933 gimple_omp_critical_set_name (as_a <gomp_critical *> (copy), t);
d9a6bd32
JJ
1934 t = unshare_expr (gimple_omp_critical_clauses
1935 (as_a <gomp_critical *> (stmt)));
1936 gimple_omp_critical_set_clauses (as_a <gomp_critical *> (copy), t);
1937 goto copy_omp_body;
1938
1939 case GIMPLE_OMP_ORDERED:
1940 t = unshare_expr (gimple_omp_ordered_clauses
1941 (as_a <gomp_ordered *> (stmt)));
1942 gimple_omp_ordered_set_clauses (as_a <gomp_ordered *> (copy), t);
726a989a
RB
1943 goto copy_omp_body;
1944
28567c40
JJ
1945 case GIMPLE_OMP_TASKGROUP:
1946 t = unshare_expr (gimple_omp_taskgroup_clauses (stmt));
1947 gimple_omp_taskgroup_set_clauses (copy, t);
1948 goto copy_omp_body;
1949
726a989a
RB
1950 case GIMPLE_OMP_SECTIONS:
1951 t = unshare_expr (gimple_omp_sections_clauses (stmt));
1952 gimple_omp_sections_set_clauses (copy, t);
1953 t = unshare_expr (gimple_omp_sections_control (stmt));
1954 gimple_omp_sections_set_control (copy, t);
8a866b82 1955 goto copy_omp_body;
726a989a
RB
1956
1957 case GIMPLE_OMP_SINGLE:
8a866b82
TV
1958 {
1959 gomp_single *omp_single_copy = as_a <gomp_single *> (copy);
1960 t = unshare_expr (gimple_omp_single_clauses (stmt));
1961 gimple_omp_single_set_clauses (omp_single_copy, t);
1962 }
1963 goto copy_omp_body;
1964
acf0174b 1965 case GIMPLE_OMP_TARGET:
8a866b82
TV
1966 {
1967 gomp_target *omp_target_stmt = as_a <gomp_target *> (stmt);
1968 gomp_target *omp_target_copy = as_a <gomp_target *> (copy);
1969 t = unshare_expr (gimple_omp_target_clauses (omp_target_stmt));
1970 gimple_omp_target_set_clauses (omp_target_copy, t);
1971 t = unshare_expr (gimple_omp_target_data_arg (omp_target_stmt));
1972 gimple_omp_target_set_data_arg (omp_target_copy, t);
1973 }
1974 goto copy_omp_body;
1975
acf0174b 1976 case GIMPLE_OMP_TEAMS:
8a866b82
TV
1977 {
1978 gomp_teams *omp_teams_copy = as_a <gomp_teams *> (copy);
1979 t = unshare_expr (gimple_omp_teams_clauses (stmt));
1980 gimple_omp_teams_set_clauses (omp_teams_copy, t);
1981 }
1982 /* FALLTHRU */
1983
726a989a
RB
1984 case GIMPLE_OMP_SECTION:
1985 case GIMPLE_OMP_MASTER:
b2b40051 1986 case GIMPLE_OMP_GRID_BODY:
726a989a
RB
1987 copy_omp_body:
1988 new_seq = gimple_seq_copy (gimple_omp_body (stmt));
1989 gimple_omp_set_body (copy, new_seq);
1990 break;
1991
0a35513e 1992 case GIMPLE_TRANSACTION:
538dd0b7
DM
1993 new_seq = gimple_seq_copy (gimple_transaction_body (
1994 as_a <gtransaction *> (stmt)));
1995 gimple_transaction_set_body (as_a <gtransaction *> (copy),
1996 new_seq);
0a35513e
AH
1997 break;
1998
726a989a
RB
1999 case GIMPLE_WITH_CLEANUP_EXPR:
2000 new_seq = gimple_seq_copy (gimple_wce_cleanup (stmt));
2001 gimple_wce_set_cleanup (copy, new_seq);
2002 break;
2003
2004 default:
2005 gcc_unreachable ();
2006 }
2007 }
2008
2009 /* Make copy of operands. */
483ef49f
RG
2010 for (i = 0; i < num_ops; i++)
2011 gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i)));
726a989a 2012
483ef49f
RG
2013 if (gimple_has_mem_ops (stmt))
2014 {
2015 gimple_set_vdef (copy, gimple_vdef (stmt));
2016 gimple_set_vuse (copy, gimple_vuse (stmt));
2017 }
726a989a 2018
483ef49f
RG
2019 /* Clear out SSA operand vectors on COPY. */
2020 if (gimple_has_ops (stmt))
2021 {
483ef49f 2022 gimple_set_use_ops (copy, NULL);
726a989a 2023
5006671f
RG
2024 /* SSA operands need to be updated. */
2025 gimple_set_modified (copy, true);
726a989a
RB
2026 }
2027
96a95ac1
AO
2028 if (gimple_debug_nonbind_marker_p (stmt))
2029 cfun->debug_marker_count++;
2030
726a989a
RB
2031 return copy;
2032}
2033
2034
726a989a
RB
2035/* Return true if statement S has side-effects. We consider a
2036 statement to have side effects if:
2037
2038 - It is a GIMPLE_CALL not marked with ECF_PURE or ECF_CONST.
2039 - Any of its operands are marked TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS. */
2040
2041bool
355fe088 2042gimple_has_side_effects (const gimple *s)
726a989a 2043{
b5b8b0ac
AO
2044 if (is_gimple_debug (s))
2045 return false;
2046
726a989a
RB
2047 /* We don't have to scan the arguments to check for
2048 volatile arguments, though, at present, we still
2049 do a scan to check for TREE_SIDE_EFFECTS. */
2050 if (gimple_has_volatile_ops (s))
2051 return true;
2052
179184e3 2053 if (gimple_code (s) == GIMPLE_ASM
538dd0b7 2054 && gimple_asm_volatile_p (as_a <const gasm *> (s)))
179184e3
RG
2055 return true;
2056
726a989a
RB
2057 if (is_gimple_call (s))
2058 {
723afc44 2059 int flags = gimple_call_flags (s);
726a989a 2060
723afc44
RG
2061 /* An infinite loop is considered a side effect. */
2062 if (!(flags & (ECF_CONST | ECF_PURE))
2063 || (flags & ECF_LOOPING_CONST_OR_PURE))
726a989a
RB
2064 return true;
2065
726a989a
RB
2066 return false;
2067 }
726a989a
RB
2068
2069 return false;
2070}
2071
726a989a 2072/* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p.
e1fd038a
SP
2073 Return true if S can trap. When INCLUDE_MEM is true, check whether
2074 the memory operations could trap. When INCLUDE_STORES is true and
2075 S is a GIMPLE_ASSIGN, the LHS of the assignment is also checked. */
726a989a 2076
e1fd038a 2077bool
355fe088 2078gimple_could_trap_p_1 (gimple *s, bool include_mem, bool include_stores)
726a989a 2079{
726a989a
RB
2080 tree t, div = NULL_TREE;
2081 enum tree_code op;
2082
e1fd038a
SP
2083 if (include_mem)
2084 {
2085 unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0;
726a989a 2086
e1fd038a
SP
2087 for (i = start; i < gimple_num_ops (s); i++)
2088 if (tree_could_trap_p (gimple_op (s, i)))
2089 return true;
2090 }
726a989a
RB
2091
2092 switch (gimple_code (s))
2093 {
2094 case GIMPLE_ASM:
538dd0b7 2095 return gimple_asm_volatile_p (as_a <gasm *> (s));
726a989a
RB
2096
2097 case GIMPLE_CALL:
2098 t = gimple_call_fndecl (s);
2099 /* Assume that calls to weak functions may trap. */
2100 if (!t || !DECL_P (t) || DECL_WEAK (t))
2101 return true;
2102 return false;
2103
2104 case GIMPLE_ASSIGN:
2105 t = gimple_expr_type (s);
2106 op = gimple_assign_rhs_code (s);
2107 if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS)
2108 div = gimple_assign_rhs2 (s);
2109 return (operation_could_trap_p (op, FLOAT_TYPE_P (t),
2110 (INTEGRAL_TYPE_P (t)
2111 && TYPE_OVERFLOW_TRAPS (t)),
2112 div));
2113
46ec7a06
RB
2114 case GIMPLE_COND:
2115 t = TREE_TYPE (gimple_cond_lhs (s));
2116 return operation_could_trap_p (gimple_cond_code (s),
2117 FLOAT_TYPE_P (t), false, NULL_TREE);
2118
726a989a
RB
2119 default:
2120 break;
2121 }
2122
2123 return false;
726a989a
RB
2124}
2125
726a989a
RB
2126/* Return true if statement S can trap. */
2127
2128bool
355fe088 2129gimple_could_trap_p (gimple *s)
726a989a 2130{
e1fd038a 2131 return gimple_could_trap_p_1 (s, true, true);
726a989a
RB
2132}
2133
726a989a
RB
2134/* Return true if RHS of a GIMPLE_ASSIGN S can trap. */
2135
2136bool
355fe088 2137gimple_assign_rhs_could_trap_p (gimple *s)
726a989a
RB
2138{
2139 gcc_assert (is_gimple_assign (s));
e1fd038a 2140 return gimple_could_trap_p_1 (s, true, false);
726a989a
RB
2141}
2142
2143
2144/* Print debugging information for gimple stmts generated. */
2145
2146void
2147dump_gimple_statistics (void)
2148{
33b366c3
ML
2149 int i;
2150 uint64_t total_tuples = 0, total_bytes = 0;
726a989a 2151
7aa6d18a
SB
2152 if (! GATHER_STATISTICS)
2153 {
33b366c3 2154 fprintf (stderr, "No GIMPLE statistics\n");
7aa6d18a
SB
2155 return;
2156 }
2157
726a989a
RB
2158 fprintf (stderr, "\nGIMPLE statements\n");
2159 fprintf (stderr, "Kind Stmts Bytes\n");
2160 fprintf (stderr, "---------------------------------------\n");
2161 for (i = 0; i < (int) gimple_alloc_kind_all; ++i)
2162 {
40ce7fa6
ML
2163 fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n",
2164 gimple_alloc_kind_names[i],
2165 SIZE_AMOUNT (gimple_alloc_counts[i]),
2166 SIZE_AMOUNT (gimple_alloc_sizes[i]));
726a989a
RB
2167 total_tuples += gimple_alloc_counts[i];
2168 total_bytes += gimple_alloc_sizes[i];
2169 }
2170 fprintf (stderr, "---------------------------------------\n");
40ce7fa6
ML
2171 fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n", "Total",
2172 SIZE_AMOUNT (total_tuples), SIZE_AMOUNT (total_bytes));
726a989a 2173 fprintf (stderr, "---------------------------------------\n");
726a989a
RB
2174}
2175
2176
726a989a
RB
2177/* Return the number of operands needed on the RHS of a GIMPLE
2178 assignment for an expression with tree code CODE. */
2179
2180unsigned
2181get_gimple_rhs_num_ops (enum tree_code code)
2182{
2183 enum gimple_rhs_class rhs_class = get_gimple_rhs_class (code);
2184
2185 if (rhs_class == GIMPLE_UNARY_RHS || rhs_class == GIMPLE_SINGLE_RHS)
2186 return 1;
2187 else if (rhs_class == GIMPLE_BINARY_RHS)
2188 return 2;
0354c0c7
BS
2189 else if (rhs_class == GIMPLE_TERNARY_RHS)
2190 return 3;
726a989a
RB
2191 else
2192 gcc_unreachable ();
2193}
2194
2195#define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
2196 (unsigned char) \
2197 ((TYPE) == tcc_unary ? GIMPLE_UNARY_RHS \
2198 : ((TYPE) == tcc_binary \
2199 || (TYPE) == tcc_comparison) ? GIMPLE_BINARY_RHS \
2200 : ((TYPE) == tcc_constant \
2201 || (TYPE) == tcc_declaration \
2202 || (TYPE) == tcc_reference) ? GIMPLE_SINGLE_RHS \
2203 : ((SYM) == TRUTH_AND_EXPR \
2204 || (SYM) == TRUTH_OR_EXPR \
2205 || (SYM) == TRUTH_XOR_EXPR) ? GIMPLE_BINARY_RHS \
2206 : (SYM) == TRUTH_NOT_EXPR ? GIMPLE_UNARY_RHS \
4e71066d
RG
2207 : ((SYM) == COND_EXPR \
2208 || (SYM) == WIDEN_MULT_PLUS_EXPR \
16949072 2209 || (SYM) == WIDEN_MULT_MINUS_EXPR \
f471fe72 2210 || (SYM) == DOT_PROD_EXPR \
79d652a5 2211 || (SYM) == SAD_EXPR \
f471fe72 2212 || (SYM) == REALIGN_LOAD_EXPR \
4e71066d 2213 || (SYM) == VEC_COND_EXPR \
2205ed25 2214 || (SYM) == VEC_PERM_EXPR \
c566cc9f 2215 || (SYM) == BIT_INSERT_EXPR) ? GIMPLE_TERNARY_RHS \
4e71066d 2216 : ((SYM) == CONSTRUCTOR \
726a989a
RB
2217 || (SYM) == OBJ_TYPE_REF \
2218 || (SYM) == ASSERT_EXPR \
2219 || (SYM) == ADDR_EXPR \
2220 || (SYM) == WITH_SIZE_EXPR \
4e71066d 2221 || (SYM) == SSA_NAME) ? GIMPLE_SINGLE_RHS \
726a989a
RB
2222 : GIMPLE_INVALID_RHS),
2223#define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS,
2224
2225const unsigned char gimple_rhs_class_table[] = {
2226#include "all-tree.def"
2227};
2228
2229#undef DEFTREECODE
2230#undef END_OF_BASE_TREE_CODES
2231
726a989a
RB
2232/* Canonicalize a tree T for use in a COND_EXPR as conditional. Returns
2233 a canonicalized tree that is valid for a COND_EXPR or NULL_TREE, if
2234 we failed to create one. */
2235
2236tree
2237canonicalize_cond_expr_cond (tree t)
2238{
b66a1bac
RG
2239 /* Strip conversions around boolean operations. */
2240 if (CONVERT_EXPR_P (t)
9b80d091
KT
2241 && (truth_value_p (TREE_CODE (TREE_OPERAND (t, 0)))
2242 || TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0)))
2243 == BOOLEAN_TYPE))
b66a1bac
RG
2244 t = TREE_OPERAND (t, 0);
2245
726a989a 2246 /* For !x use x == 0. */
12430896 2247 if (TREE_CODE (t) == TRUTH_NOT_EXPR)
726a989a
RB
2248 {
2249 tree top0 = TREE_OPERAND (t, 0);
2250 t = build2 (EQ_EXPR, TREE_TYPE (t),
2251 top0, build_int_cst (TREE_TYPE (top0), 0));
2252 }
2253 /* For cmp ? 1 : 0 use cmp. */
2254 else if (TREE_CODE (t) == COND_EXPR
2255 && COMPARISON_CLASS_P (TREE_OPERAND (t, 0))
2256 && integer_onep (TREE_OPERAND (t, 1))
2257 && integer_zerop (TREE_OPERAND (t, 2)))
2258 {
2259 tree top0 = TREE_OPERAND (t, 0);
2260 t = build2 (TREE_CODE (top0), TREE_TYPE (t),
2261 TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1));
2262 }
4481581f
JL
2263 /* For x ^ y use x != y. */
2264 else if (TREE_CODE (t) == BIT_XOR_EXPR)
2265 t = build2 (NE_EXPR, TREE_TYPE (t),
2266 TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
2267
726a989a
RB
2268 if (is_gimple_condexpr (t))
2269 return t;
2270
2271 return NULL_TREE;
2272}
2273
e6c99067
DN
2274/* Build a GIMPLE_CALL identical to STMT but skipping the arguments in
2275 the positions marked by the set ARGS_TO_SKIP. */
2276
538dd0b7
DM
2277gcall *
2278gimple_call_copy_skip_args (gcall *stmt, bitmap args_to_skip)
c6f7cfc1
JH
2279{
2280 int i;
c6f7cfc1 2281 int nargs = gimple_call_num_args (stmt);
ef062b13 2282 auto_vec<tree> vargs (nargs);
538dd0b7 2283 gcall *new_stmt;
c6f7cfc1
JH
2284
2285 for (i = 0; i < nargs; i++)
2286 if (!bitmap_bit_p (args_to_skip, i))
9771b263 2287 vargs.quick_push (gimple_call_arg (stmt, i));
c6f7cfc1 2288
25583c4f
RS
2289 if (gimple_call_internal_p (stmt))
2290 new_stmt = gimple_build_call_internal_vec (gimple_call_internal_fn (stmt),
2291 vargs);
2292 else
2293 new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs);
ef062b13 2294
c6f7cfc1
JH
2295 if (gimple_call_lhs (stmt))
2296 gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
2297
5006671f
RG
2298 gimple_set_vuse (new_stmt, gimple_vuse (stmt));
2299 gimple_set_vdef (new_stmt, gimple_vdef (stmt));
2300
c6f7cfc1
JH
2301 if (gimple_has_location (stmt))
2302 gimple_set_location (new_stmt, gimple_location (stmt));
8d2adc24 2303 gimple_call_copy_flags (new_stmt, stmt);
c6f7cfc1 2304 gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
5006671f
RG
2305
2306 gimple_set_modified (new_stmt, true);
2307
c6f7cfc1
JH
2308 return new_stmt;
2309}
2310
5006671f 2311
d7f09764 2312
d025732d
EB
2313/* Return true if the field decls F1 and F2 are at the same offset.
2314
91f2fae8 2315 This is intended to be used on GIMPLE types only. */
d7f09764 2316
1e4bc4eb 2317bool
d025732d 2318gimple_compare_field_offset (tree f1, tree f2)
d7f09764
DN
2319{
2320 if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2))
d025732d
EB
2321 {
2322 tree offset1 = DECL_FIELD_OFFSET (f1);
2323 tree offset2 = DECL_FIELD_OFFSET (f2);
2324 return ((offset1 == offset2
2325 /* Once gimplification is done, self-referential offsets are
2326 instantiated as operand #2 of the COMPONENT_REF built for
2327 each access and reset. Therefore, they are not relevant
2328 anymore and fields are interchangeable provided that they
2329 represent the same access. */
2330 || (TREE_CODE (offset1) == PLACEHOLDER_EXPR
2331 && TREE_CODE (offset2) == PLACEHOLDER_EXPR
2332 && (DECL_SIZE (f1) == DECL_SIZE (f2)
2333 || (TREE_CODE (DECL_SIZE (f1)) == PLACEHOLDER_EXPR
2334 && TREE_CODE (DECL_SIZE (f2)) == PLACEHOLDER_EXPR)
2335 || operand_equal_p (DECL_SIZE (f1), DECL_SIZE (f2), 0))
2336 && DECL_ALIGN (f1) == DECL_ALIGN (f2))
2337 || operand_equal_p (offset1, offset2, 0))
2338 && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1),
2339 DECL_FIELD_BIT_OFFSET (f2)));
2340 }
d7f09764
DN
2341
2342 /* Fortran and C do not always agree on what DECL_OFFSET_ALIGN
2343 should be, so handle differing ones specially by decomposing
2344 the offset into a byte and bit offset manually. */
9541ffee
RS
2345 if (tree_fits_shwi_p (DECL_FIELD_OFFSET (f1))
2346 && tree_fits_shwi_p (DECL_FIELD_OFFSET (f2)))
d7f09764
DN
2347 {
2348 unsigned HOST_WIDE_INT byte_offset1, byte_offset2;
2349 unsigned HOST_WIDE_INT bit_offset1, bit_offset2;
2350 bit_offset1 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f1));
2351 byte_offset1 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f1))
2352 + bit_offset1 / BITS_PER_UNIT);
2353 bit_offset2 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f2));
2354 byte_offset2 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f2))
2355 + bit_offset2 / BITS_PER_UNIT);
2356 if (byte_offset1 != byte_offset2)
2357 return false;
2358 return bit_offset1 % BITS_PER_UNIT == bit_offset2 % BITS_PER_UNIT;
2359 }
2360
2361 return false;
2362}
2363
d7f09764
DN
2364
2365/* Return a type the same as TYPE except unsigned or
2366 signed according to UNSIGNEDP. */
2367
2368static tree
2369gimple_signed_or_unsigned_type (bool unsignedp, tree type)
2370{
2371 tree type1;
78a7c317 2372 int i;
d7f09764
DN
2373
2374 type1 = TYPE_MAIN_VARIANT (type);
2375 if (type1 == signed_char_type_node
2376 || type1 == char_type_node
2377 || type1 == unsigned_char_type_node)
2378 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2379 if (type1 == integer_type_node || type1 == unsigned_type_node)
2380 return unsignedp ? unsigned_type_node : integer_type_node;
2381 if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
2382 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2383 if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
2384 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2385 if (type1 == long_long_integer_type_node
2386 || type1 == long_long_unsigned_type_node)
2387 return unsignedp
2388 ? long_long_unsigned_type_node
2389 : long_long_integer_type_node;
78a7c317
DD
2390
2391 for (i = 0; i < NUM_INT_N_ENTS; i ++)
2392 if (int_n_enabled_p[i]
2393 && (type1 == int_n_trees[i].unsigned_type
2394 || type1 == int_n_trees[i].signed_type))
2395 return unsignedp
2396 ? int_n_trees[i].unsigned_type
2397 : int_n_trees[i].signed_type;
2398
d7f09764
DN
2399#if HOST_BITS_PER_WIDE_INT >= 64
2400 if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
2401 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2402#endif
2403 if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
2404 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2405 if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
2406 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2407 if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
2408 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2409 if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node)
2410 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2411
2412#define GIMPLE_FIXED_TYPES(NAME) \
2413 if (type1 == short_ ## NAME ## _type_node \
2414 || type1 == unsigned_short_ ## NAME ## _type_node) \
2415 return unsignedp ? unsigned_short_ ## NAME ## _type_node \
2416 : short_ ## NAME ## _type_node; \
2417 if (type1 == NAME ## _type_node \
2418 || type1 == unsigned_ ## NAME ## _type_node) \
2419 return unsignedp ? unsigned_ ## NAME ## _type_node \
2420 : NAME ## _type_node; \
2421 if (type1 == long_ ## NAME ## _type_node \
2422 || type1 == unsigned_long_ ## NAME ## _type_node) \
2423 return unsignedp ? unsigned_long_ ## NAME ## _type_node \
2424 : long_ ## NAME ## _type_node; \
2425 if (type1 == long_long_ ## NAME ## _type_node \
2426 || type1 == unsigned_long_long_ ## NAME ## _type_node) \
2427 return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \
2428 : long_long_ ## NAME ## _type_node;
2429
2430#define GIMPLE_FIXED_MODE_TYPES(NAME) \
2431 if (type1 == NAME ## _type_node \
2432 || type1 == u ## NAME ## _type_node) \
2433 return unsignedp ? u ## NAME ## _type_node \
2434 : NAME ## _type_node;
2435
2436#define GIMPLE_FIXED_TYPES_SAT(NAME) \
2437 if (type1 == sat_ ## short_ ## NAME ## _type_node \
2438 || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \
2439 return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \
2440 : sat_ ## short_ ## NAME ## _type_node; \
2441 if (type1 == sat_ ## NAME ## _type_node \
2442 || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \
2443 return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \
2444 : sat_ ## NAME ## _type_node; \
2445 if (type1 == sat_ ## long_ ## NAME ## _type_node \
2446 || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \
2447 return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \
2448 : sat_ ## long_ ## NAME ## _type_node; \
2449 if (type1 == sat_ ## long_long_ ## NAME ## _type_node \
2450 || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \
2451 return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \
2452 : sat_ ## long_long_ ## NAME ## _type_node;
2453
2454#define GIMPLE_FIXED_MODE_TYPES_SAT(NAME) \
2455 if (type1 == sat_ ## NAME ## _type_node \
2456 || type1 == sat_ ## u ## NAME ## _type_node) \
2457 return unsignedp ? sat_ ## u ## NAME ## _type_node \
2458 : sat_ ## NAME ## _type_node;
2459
2460 GIMPLE_FIXED_TYPES (fract);
2461 GIMPLE_FIXED_TYPES_SAT (fract);
2462 GIMPLE_FIXED_TYPES (accum);
2463 GIMPLE_FIXED_TYPES_SAT (accum);
2464
2465 GIMPLE_FIXED_MODE_TYPES (qq);
2466 GIMPLE_FIXED_MODE_TYPES (hq);
2467 GIMPLE_FIXED_MODE_TYPES (sq);
2468 GIMPLE_FIXED_MODE_TYPES (dq);
2469 GIMPLE_FIXED_MODE_TYPES (tq);
2470 GIMPLE_FIXED_MODE_TYPES_SAT (qq);
2471 GIMPLE_FIXED_MODE_TYPES_SAT (hq);
2472 GIMPLE_FIXED_MODE_TYPES_SAT (sq);
2473 GIMPLE_FIXED_MODE_TYPES_SAT (dq);
2474 GIMPLE_FIXED_MODE_TYPES_SAT (tq);
2475 GIMPLE_FIXED_MODE_TYPES (ha);
2476 GIMPLE_FIXED_MODE_TYPES (sa);
2477 GIMPLE_FIXED_MODE_TYPES (da);
2478 GIMPLE_FIXED_MODE_TYPES (ta);
2479 GIMPLE_FIXED_MODE_TYPES_SAT (ha);
2480 GIMPLE_FIXED_MODE_TYPES_SAT (sa);
2481 GIMPLE_FIXED_MODE_TYPES_SAT (da);
2482 GIMPLE_FIXED_MODE_TYPES_SAT (ta);
2483
2484 /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not
2485 the precision; they have precision set to match their range, but
2486 may use a wider mode to match an ABI. If we change modes, we may
2487 wind up with bad conversions. For INTEGER_TYPEs in C, must check
2488 the precision as well, so as to yield correct results for
2489 bit-field types. C++ does not have these separate bit-field
2490 types, and producing a signed or unsigned variant of an
2491 ENUMERAL_TYPE may cause other problems as well. */
2492 if (!INTEGRAL_TYPE_P (type)
2493 || TYPE_UNSIGNED (type) == unsignedp)
2494 return type;
2495
2496#define TYPE_OK(node) \
2497 (TYPE_MODE (type) == TYPE_MODE (node) \
2498 && TYPE_PRECISION (type) == TYPE_PRECISION (node))
2499 if (TYPE_OK (signed_char_type_node))
2500 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2501 if (TYPE_OK (integer_type_node))
2502 return unsignedp ? unsigned_type_node : integer_type_node;
2503 if (TYPE_OK (short_integer_type_node))
2504 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2505 if (TYPE_OK (long_integer_type_node))
2506 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2507 if (TYPE_OK (long_long_integer_type_node))
2508 return (unsignedp
2509 ? long_long_unsigned_type_node
2510 : long_long_integer_type_node);
78a7c317
DD
2511
2512 for (i = 0; i < NUM_INT_N_ENTS; i ++)
2513 if (int_n_enabled_p[i]
2514 && TYPE_MODE (type) == int_n_data[i].m
2515 && TYPE_PRECISION (type) == int_n_data[i].bitsize)
2516 return unsignedp
2517 ? int_n_trees[i].unsigned_type
2518 : int_n_trees[i].signed_type;
d7f09764
DN
2519
2520#if HOST_BITS_PER_WIDE_INT >= 64
2521 if (TYPE_OK (intTI_type_node))
2522 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2523#endif
2524 if (TYPE_OK (intDI_type_node))
2525 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2526 if (TYPE_OK (intSI_type_node))
2527 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2528 if (TYPE_OK (intHI_type_node))
2529 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2530 if (TYPE_OK (intQI_type_node))
2531 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2532
2533#undef GIMPLE_FIXED_TYPES
2534#undef GIMPLE_FIXED_MODE_TYPES
2535#undef GIMPLE_FIXED_TYPES_SAT
2536#undef GIMPLE_FIXED_MODE_TYPES_SAT
2537#undef TYPE_OK
2538
2539 return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
2540}
2541
2542
2543/* Return an unsigned type the same as TYPE in other respects. */
2544
2545tree
2546gimple_unsigned_type (tree type)
2547{
2548 return gimple_signed_or_unsigned_type (true, type);
2549}
2550
2551
2552/* Return a signed type the same as TYPE in other respects. */
2553
2554tree
2555gimple_signed_type (tree type)
2556{
2557 return gimple_signed_or_unsigned_type (false, type);
2558}
2559
2560
2561/* Return the typed-based alias set for T, which may be an expression
2562 or a type. Return -1 if we don't do anything special. */
2563
2564alias_set_type
2565gimple_get_alias_set (tree t)
2566{
d7f09764
DN
2567 /* That's all the expressions we handle specially. */
2568 if (!TYPE_P (t))
2569 return -1;
2570
2571 /* For convenience, follow the C standard when dealing with
2572 character types. Any object may be accessed via an lvalue that
2573 has character type. */
2574 if (t == char_type_node
2575 || t == signed_char_type_node
2576 || t == unsigned_char_type_node)
2577 return 0;
2578
2579 /* Allow aliasing between signed and unsigned variants of the same
2580 type. We treat the signed variant as canonical. */
2581 if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
2582 {
2583 tree t1 = gimple_signed_type (t);
2584
2585 /* t1 == t can happen for boolean nodes which are always unsigned. */
2586 if (t1 != t)
2587 return get_alias_set (t1);
2588 }
d7f09764
DN
2589
2590 return -1;
2591}
2592
2593
ccacdf06
RG
2594/* Helper for gimple_ior_addresses_taken_1. */
2595
2596static bool
355fe088 2597gimple_ior_addresses_taken_1 (gimple *, tree addr, tree, void *data)
ccacdf06
RG
2598{
2599 bitmap addresses_taken = (bitmap)data;
2ea9dc64
RG
2600 addr = get_base_address (addr);
2601 if (addr
2602 && DECL_P (addr))
ccacdf06
RG
2603 {
2604 bitmap_set_bit (addresses_taken, DECL_UID (addr));
2605 return true;
2606 }
2607 return false;
2608}
2609
2610/* Set the bit for the uid of all decls that have their address taken
2611 in STMT in the ADDRESSES_TAKEN bitmap. Returns true if there
2612 were any in this stmt. */
2613
2614bool
355fe088 2615gimple_ior_addresses_taken (bitmap addresses_taken, gimple *stmt)
ccacdf06
RG
2616{
2617 return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL,
2618 gimple_ior_addresses_taken_1);
2619}
2620
4537ec0c 2621
5c944c6c
RB
2622/* Return true when STMTs arguments and return value match those of FNDECL,
2623 a decl of a builtin function. */
3626621a 2624
5c944c6c 2625bool
355fe088 2626gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
3626621a 2627{
5c944c6c
RB
2628 gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN);
2629
2630 tree ret = gimple_call_lhs (stmt);
2631 if (ret
2ad3adf1
JJ
2632 && !useless_type_conversion_p (TREE_TYPE (ret),
2633 TREE_TYPE (TREE_TYPE (fndecl))))
5c944c6c
RB
2634 return false;
2635
3626621a
RB
2636 tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
2637 unsigned nargs = gimple_call_num_args (stmt);
2638 for (unsigned i = 0; i < nargs; ++i)
2639 {
2640 /* Variadic args follow. */
2641 if (!targs)
2642 return true;
2643 tree arg = gimple_call_arg (stmt, i);
fd39794a
JJ
2644 tree type = TREE_VALUE (targs);
2645 if (!useless_type_conversion_p (type, TREE_TYPE (arg))
2646 /* char/short integral arguments are promoted to int
2647 by several frontends if targetm.calls.promote_prototypes
2648 is true. Allow such promotion too. */
2649 && !(INTEGRAL_TYPE_P (type)
2650 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
2651 && targetm.calls.promote_prototypes (TREE_TYPE (fndecl))
2652 && useless_type_conversion_p (integer_type_node,
2653 TREE_TYPE (arg))))
3626621a
RB
2654 return false;
2655 targs = TREE_CHAIN (targs);
2656 }
2657 if (targs && !VOID_TYPE_P (TREE_VALUE (targs)))
2658 return false;
2659 return true;
2660}
2661
5c944c6c
RB
2662/* Return true when STMT is builtins call. */
2663
2664bool
355fe088 2665gimple_call_builtin_p (const gimple *stmt)
5c944c6c
RB
2666{
2667 tree fndecl;
2668 if (is_gimple_call (stmt)
2669 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
2670 && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN)
2671 return gimple_builtin_call_types_compatible_p (stmt, fndecl);
2672 return false;
2673}
2674
3626621a
RB
2675/* Return true when STMT is builtins call to CLASS. */
2676
2677bool
355fe088 2678gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass)
3626621a
RB
2679{
2680 tree fndecl;
2681 if (is_gimple_call (stmt)
2682 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
2683 && DECL_BUILT_IN_CLASS (fndecl) == klass)
5c944c6c 2684 return gimple_builtin_call_types_compatible_p (stmt, fndecl);
3626621a
RB
2685 return false;
2686}
2687
2688/* Return true when STMT is builtins call to CODE of CLASS. */
c54c785d
JH
2689
2690bool
355fe088 2691gimple_call_builtin_p (const gimple *stmt, enum built_in_function code)
c54c785d
JH
2692{
2693 tree fndecl;
3626621a
RB
2694 if (is_gimple_call (stmt)
2695 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
3d78e008 2696 && fndecl_built_in_p (fndecl, code))
5c944c6c 2697 return gimple_builtin_call_types_compatible_p (stmt, fndecl);
3626621a 2698 return false;
c54c785d
JH
2699}
2700
00175cb2
RS
2701/* If CALL is a call to a combined_fn (i.e. an internal function or
2702 a normal built-in function), return its code, otherwise return
2703 CFN_LAST. */
2704
2705combined_fn
2706gimple_call_combined_fn (const gimple *stmt)
2707{
2708 if (const gcall *call = dyn_cast <const gcall *> (stmt))
2709 {
2710 if (gimple_call_internal_p (call))
2711 return as_combined_fn (gimple_call_internal_fn (call));
2712
2713 tree fndecl = gimple_call_fndecl (stmt);
2714 if (fndecl
3d78e008 2715 && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
00175cb2
RS
2716 && gimple_builtin_call_types_compatible_p (stmt, fndecl))
2717 return as_combined_fn (DECL_FUNCTION_CODE (fndecl));
2718 }
2719 return CFN_LAST;
2720}
2721
edcdea5b
NF
2722/* Return true if STMT clobbers memory. STMT is required to be a
2723 GIMPLE_ASM. */
2724
2725bool
538dd0b7 2726gimple_asm_clobbers_memory_p (const gasm *stmt)
edcdea5b
NF
2727{
2728 unsigned i;
2729
2730 for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
2731 {
2732 tree op = gimple_asm_clobber_op (stmt, i);
2733 if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
2734 return true;
2735 }
2736
93671519
BE
2737 /* Non-empty basic ASM implicitly clobbers memory. */
2738 if (gimple_asm_input_p (stmt) && strlen (gimple_asm_string (stmt)) != 0)
2739 return true;
2740
edcdea5b
NF
2741 return false;
2742}
475b8f37 2743
80560f95
AM
2744/* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE. */
2745
2746void
2747dump_decl_set (FILE *file, bitmap set)
2748{
2749 if (set)
2750 {
2751 bitmap_iterator bi;
2752 unsigned i;
2753
2754 fprintf (file, "{ ");
2755
2756 EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
2757 {
2758 fprintf (file, "D.%u", i);
2759 fprintf (file, " ");
2760 }
2761
2762 fprintf (file, "}");
2763 }
2764 else
2765 fprintf (file, "NIL");
2766}
7a300452 2767
3d9c733e
AM
2768/* Return true when CALL is a call stmt that definitely doesn't
2769 free any memory or makes it unavailable otherwise. */
2770bool
355fe088 2771nonfreeing_call_p (gimple *call)
3d9c733e
AM
2772{
2773 if (gimple_call_builtin_p (call, BUILT_IN_NORMAL)
2774 && gimple_call_flags (call) & ECF_LEAF)
2775 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call)))
2776 {
2777 /* Just in case these become ECF_LEAF in the future. */
2778 case BUILT_IN_FREE:
2779 case BUILT_IN_TM_FREE:
2780 case BUILT_IN_REALLOC:
2781 case BUILT_IN_STACK_RESTORE:
2782 return false;
2783 default:
2784 return true;
2785 }
8413ca87
JJ
2786 else if (gimple_call_internal_p (call))
2787 switch (gimple_call_internal_fn (call))
2788 {
2789 case IFN_ABNORMAL_DISPATCHER:
2790 return true;
6dc4a604 2791 case IFN_ASAN_MARK:
56b7aede 2792 return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON;
8413ca87
JJ
2793 default:
2794 if (gimple_call_flags (call) & ECF_LEAF)
2795 return true;
2796 return false;
2797 }
3d9c733e 2798
8413ca87
JJ
2799 tree fndecl = gimple_call_fndecl (call);
2800 if (!fndecl)
2801 return false;
2802 struct cgraph_node *n = cgraph_node::get (fndecl);
2803 if (!n)
2804 return false;
2805 enum availability availability;
2806 n = n->function_symbol (&availability);
2807 if (!n || availability <= AVAIL_INTERPOSABLE)
2808 return false;
2809 return n->nonfreeing_fn;
3d9c733e 2810}
8fdc414d 2811
c000cd7c
BS
2812/* Return true when CALL is a call stmt that definitely need not
2813 be considered to be a memory barrier. */
2814bool
2815nonbarrier_call_p (gimple *call)
2816{
2817 if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST))
2818 return true;
2819 /* Should extend this to have a nonbarrier_fn flag, just as above in
2820 the nonfreeing case. */
2821 return false;
2822}
2823
8fdc414d
JL
2824/* Callback for walk_stmt_load_store_ops.
2825
2826 Return TRUE if OP will dereference the tree stored in DATA, FALSE
2827 otherwise.
2828
2829 This routine only makes a superficial check for a dereference. Thus
2830 it must only be used if it is safe to return a false negative. */
2831static bool
355fe088 2832check_loadstore (gimple *, tree op, tree, void *data)
8fdc414d 2833{
6626f970
RH
2834 if (TREE_CODE (op) == MEM_REF || TREE_CODE (op) == TARGET_MEM_REF)
2835 {
2836 /* Some address spaces may legitimately dereference zero. */
2837 addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op));
2838 if (targetm.addr_space.zero_address_valid (as))
2839 return false;
2840
2841 return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0);
2842 }
8fdc414d
JL
2843 return false;
2844}
2845
ae93744d 2846
76787f70
MLI
2847/* Return true if OP can be inferred to be non-NULL after STMT executes,
2848 either by using a pointer dereference or attributes. */
2849bool
355fe088 2850infer_nonnull_range (gimple *stmt, tree op)
76787f70
MLI
2851{
2852 return infer_nonnull_range_by_dereference (stmt, op)
2853 || infer_nonnull_range_by_attribute (stmt, op);
2854}
8fdc414d 2855
76787f70
MLI
2856/* Return true if OP can be inferred to be non-NULL after STMT
2857 executes by using a pointer dereference. */
8fdc414d 2858bool
355fe088 2859infer_nonnull_range_by_dereference (gimple *stmt, tree op)
8fdc414d
JL
2860{
2861 /* We can only assume that a pointer dereference will yield
2862 non-NULL if -fdelete-null-pointer-checks is enabled. */
2863 if (!flag_delete_null_pointer_checks
2864 || !POINTER_TYPE_P (TREE_TYPE (op))
2865 || gimple_code (stmt) == GIMPLE_ASM)
2866 return false;
2867
76787f70
MLI
2868 if (walk_stmt_load_store_ops (stmt, (void *)op,
2869 check_loadstore, check_loadstore))
8fdc414d
JL
2870 return true;
2871
76787f70
MLI
2872 return false;
2873}
2874
2875/* Return true if OP can be inferred to be a non-NULL after STMT
2876 executes by using attributes. */
2877bool
355fe088 2878infer_nonnull_range_by_attribute (gimple *stmt, tree op)
76787f70
MLI
2879{
2880 /* We can only assume that a pointer dereference will yield
2881 non-NULL if -fdelete-null-pointer-checks is enabled. */
2882 if (!flag_delete_null_pointer_checks
2883 || !POINTER_TYPE_P (TREE_TYPE (op))
2884 || gimple_code (stmt) == GIMPLE_ASM)
2885 return false;
2886
2887 if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt))
8fdc414d
JL
2888 {
2889 tree fntype = gimple_call_fntype (stmt);
2890 tree attrs = TYPE_ATTRIBUTES (fntype);
2891 for (; attrs; attrs = TREE_CHAIN (attrs))
2892 {
2893 attrs = lookup_attribute ("nonnull", attrs);
2894
2895 /* If "nonnull" wasn't specified, we know nothing about
2896 the argument. */
2897 if (attrs == NULL_TREE)
2898 return false;
2899
2900 /* If "nonnull" applies to all the arguments, then ARG
2901 is non-null if it's in the argument list. */
2902 if (TREE_VALUE (attrs) == NULL_TREE)
2903 {
2904 for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++)
2905 {
36f291f7
PP
2906 if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i)))
2907 && operand_equal_p (op, gimple_call_arg (stmt, i), 0))
8fdc414d
JL
2908 return true;
2909 }
2910 return false;
2911 }
2912
2913 /* Now see if op appears in the nonnull list. */
2914 for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
2915 {
e37dcf45
MP
2916 unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
2917 if (idx < gimple_call_num_args (stmt))
2918 {
2919 tree arg = gimple_call_arg (stmt, idx);
2920 if (operand_equal_p (op, arg, 0))
2921 return true;
2922 }
8fdc414d
JL
2923 }
2924 }
2925 }
2926
2927 /* If this function is marked as returning non-null, then we can
2928 infer OP is non-null if it is used in the return statement. */
76787f70
MLI
2929 if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
2930 if (gimple_return_retval (return_stmt)
2931 && operand_equal_p (gimple_return_retval (return_stmt), op, 0)
2932 && lookup_attribute ("returns_nonnull",
2933 TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
2934 return true;
8fdc414d
JL
2935
2936 return false;
2937}
45b0be94
AM
2938
2939/* Compare two case labels. Because the front end should already have
2940 made sure that case ranges do not overlap, it is enough to only compare
2941 the CASE_LOW values of each case label. */
2942
2943static int
2944compare_case_labels (const void *p1, const void *p2)
2945{
2946 const_tree const case1 = *(const_tree const*)p1;
2947 const_tree const case2 = *(const_tree const*)p2;
2948
2949 /* The 'default' case label always goes first. */
2950 if (!CASE_LOW (case1))
2951 return -1;
2952 else if (!CASE_LOW (case2))
2953 return 1;
2954 else
2955 return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
2956}
2957
2958/* Sort the case labels in LABEL_VEC in place in ascending order. */
2959
2960void
2961sort_case_labels (vec<tree> label_vec)
2962{
2963 label_vec.qsort (compare_case_labels);
2964}
2965\f
2966/* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement.
2967
2968 LABELS is a vector that contains all case labels to look at.
2969
2970 INDEX_TYPE is the type of the switch index expression. Case labels
2971 in LABELS are discarded if their values are not in the value range
2972 covered by INDEX_TYPE. The remaining case label values are folded
2973 to INDEX_TYPE.
2974
2975 If a default case exists in LABELS, it is removed from LABELS and
2976 returned in DEFAULT_CASEP. If no default case exists, but the
2977 case labels already cover the whole range of INDEX_TYPE, a default
2978 case is returned pointing to one of the existing case labels.
2979 Otherwise DEFAULT_CASEP is set to NULL_TREE.
2980
2981 DEFAULT_CASEP may be NULL, in which case the above comment doesn't
2982 apply and no action is taken regardless of whether a default case is
2983 found or not. */
2984
2985void
2986preprocess_case_label_vec_for_gimple (vec<tree> labels,
2987 tree index_type,
2988 tree *default_casep)
2989{
2990 tree min_value, max_value;
2991 tree default_case = NULL_TREE;
2992 size_t i, len;
2993
2994 i = 0;
2995 min_value = TYPE_MIN_VALUE (index_type);
2996 max_value = TYPE_MAX_VALUE (index_type);
2997 while (i < labels.length ())
2998 {
2999 tree elt = labels[i];
3000 tree low = CASE_LOW (elt);
3001 tree high = CASE_HIGH (elt);
3002 bool remove_element = FALSE;
3003
3004 if (low)
3005 {
3006 gcc_checking_assert (TREE_CODE (low) == INTEGER_CST);
3007 gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST);
3008
3009 /* This is a non-default case label, i.e. it has a value.
3010
3011 See if the case label is reachable within the range of
3012 the index type. Remove out-of-range case values. Turn
3013 case ranges into a canonical form (high > low strictly)
3014 and convert the case label values to the index type.
3015
3016 NB: The type of gimple_switch_index() may be the promoted
3017 type, but the case labels retain the original type. */
3018
3019 if (high)
3020 {
3021 /* This is a case range. Discard empty ranges.
3022 If the bounds or the range are equal, turn this
3023 into a simple (one-value) case. */
3024 int cmp = tree_int_cst_compare (high, low);
3025 if (cmp < 0)
3026 remove_element = TRUE;
3027 else if (cmp == 0)
3028 high = NULL_TREE;
3029 }
3030
3031 if (! high)
3032 {
3033 /* If the simple case value is unreachable, ignore it. */
3034 if ((TREE_CODE (min_value) == INTEGER_CST
3035 && tree_int_cst_compare (low, min_value) < 0)
3036 || (TREE_CODE (max_value) == INTEGER_CST
3037 && tree_int_cst_compare (low, max_value) > 0))
3038 remove_element = TRUE;
3039 else
3040 low = fold_convert (index_type, low);
3041 }
3042 else
3043 {
3044 /* If the entire case range is unreachable, ignore it. */
3045 if ((TREE_CODE (min_value) == INTEGER_CST
3046 && tree_int_cst_compare (high, min_value) < 0)
3047 || (TREE_CODE (max_value) == INTEGER_CST
3048 && tree_int_cst_compare (low, max_value) > 0))
3049 remove_element = TRUE;
3050 else
3051 {
3052 /* If the lower bound is less than the index type's
3053 minimum value, truncate the range bounds. */
3054 if (TREE_CODE (min_value) == INTEGER_CST
3055 && tree_int_cst_compare (low, min_value) < 0)
3056 low = min_value;
3057 low = fold_convert (index_type, low);
3058
3059 /* If the upper bound is greater than the index type's
3060 maximum value, truncate the range bounds. */
3061 if (TREE_CODE (max_value) == INTEGER_CST
3062 && tree_int_cst_compare (high, max_value) > 0)
3063 high = max_value;
3064 high = fold_convert (index_type, high);
3065
3066 /* We may have folded a case range to a one-value case. */
3067 if (tree_int_cst_equal (low, high))
3068 high = NULL_TREE;
3069 }
3070 }
3071
3072 CASE_LOW (elt) = low;
3073 CASE_HIGH (elt) = high;
3074 }
3075 else
3076 {
3077 gcc_assert (!default_case);
3078 default_case = elt;
3079 /* The default case must be passed separately to the
3080 gimple_build_switch routine. But if DEFAULT_CASEP
3081 is NULL, we do not remove the default case (it would
3082 be completely lost). */
3083 if (default_casep)
3084 remove_element = TRUE;
3085 }
3086
3087 if (remove_element)
3088 labels.ordered_remove (i);
3089 else
3090 i++;
3091 }
3092 len = i;
3093
3094 if (!labels.is_empty ())
3095 sort_case_labels (labels);
3096
3097 if (default_casep && !default_case)
3098 {
3099 /* If the switch has no default label, add one, so that we jump
3100 around the switch body. If the labels already cover the whole
3101 range of the switch index_type, add the default label pointing
3102 to one of the existing labels. */
3103 if (len
3104 && TYPE_MIN_VALUE (index_type)
3105 && TYPE_MAX_VALUE (index_type)
3106 && tree_int_cst_equal (CASE_LOW (labels[0]),
3107 TYPE_MIN_VALUE (index_type)))
3108 {
3109 tree low, high = CASE_HIGH (labels[len - 1]);
3110 if (!high)
3111 high = CASE_LOW (labels[len - 1]);
3112 if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type)))
3113 {
938da3a5 3114 tree widest_label = labels[0];
45b0be94
AM
3115 for (i = 1; i < len; i++)
3116 {
3117 high = CASE_LOW (labels[i]);
3118 low = CASE_HIGH (labels[i - 1]);
3119 if (!low)
3120 low = CASE_LOW (labels[i - 1]);
938da3a5
PP
3121
3122 if (CASE_HIGH (labels[i]) != NULL_TREE
3123 && (CASE_HIGH (widest_label) == NULL_TREE
8e6cdc90
RS
3124 || (wi::gtu_p
3125 (wi::to_wide (CASE_HIGH (labels[i]))
3126 - wi::to_wide (CASE_LOW (labels[i])),
3127 wi::to_wide (CASE_HIGH (widest_label))
3128 - wi::to_wide (CASE_LOW (widest_label))))))
938da3a5
PP
3129 widest_label = labels[i];
3130
8e6cdc90 3131 if (wi::to_wide (low) + 1 != wi::to_wide (high))
45b0be94
AM
3132 break;
3133 }
3134 if (i == len)
3135 {
938da3a5
PP
3136 /* Designate the label with the widest range to be the
3137 default label. */
3138 tree label = CASE_LABEL (widest_label);
45b0be94
AM
3139 default_case = build_case_label (NULL_TREE, NULL_TREE,
3140 label);
3141 }
3142 }
3143 }
3144 }
3145
3146 if (default_casep)
3147 *default_casep = default_case;
3148}
5be5c238
AM
3149
3150/* Set the location of all statements in SEQ to LOC. */
3151
3152void
3153gimple_seq_set_location (gimple_seq seq, location_t loc)
3154{
3155 for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
3156 gimple_set_location (gsi_stmt (i), loc);
3157}
73049af5
JJ
3158
3159/* Release SSA_NAMEs in SEQ as well as the GIMPLE statements. */
3160
3161void
3162gimple_seq_discard (gimple_seq seq)
3163{
3164 gimple_stmt_iterator gsi;
3165
3166 for (gsi = gsi_start (seq); !gsi_end_p (gsi); )
3167 {
355fe088 3168 gimple *stmt = gsi_stmt (gsi);
73049af5
JJ
3169 gsi_remove (&gsi, true);
3170 release_defs (stmt);
3171 ggc_free (stmt);
3172 }
3173}
0b986c6a
JH
3174
3175/* See if STMT now calls function that takes no parameters and if so, drop
3176 call arguments. This is used when devirtualization machinery redirects
538374e1 3177 to __builtin_unreachable or __cxa_pure_virtual. */
0b986c6a
JH
3178
3179void
355fe088 3180maybe_remove_unused_call_args (struct function *fn, gimple *stmt)
0b986c6a
JH
3181{
3182 tree decl = gimple_call_fndecl (stmt);
3183 if (TYPE_ARG_TYPES (TREE_TYPE (decl))
3184 && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node
3185 && gimple_call_num_args (stmt))
3186 {
3187 gimple_set_num_ops (stmt, 3);
3188 update_stmt_fn (fn, stmt);
3189 }
3190}
d9b950dd 3191
ce120587
JH
3192/* Return false if STMT will likely expand to real function call. */
3193
3194bool
3195gimple_inexpensive_call_p (gcall *stmt)
3196{
3197 if (gimple_call_internal_p (stmt))
3198 return true;
3199 tree decl = gimple_call_fndecl (stmt);
3200 if (decl && is_inexpensive_builtin (decl))
3201 return true;
3202 return false;
3203}
3204
d9b950dd
DM
3205#if CHECKING_P
3206
3207namespace selftest {
3208
3209/* Selftests for core gimple structures. */
3210
3211/* Verify that STMT is pretty-printed as EXPECTED.
3212 Helper function for selftests. */
3213
3214static void
3215verify_gimple_pp (const char *expected, gimple *stmt)
3216{
3217 pretty_printer pp;
4af78ef8 3218 pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */);
d9b950dd
DM
3219 ASSERT_STREQ (expected, pp_formatted_text (&pp));
3220}
3221
3222/* Build a GIMPLE_ASSIGN equivalent to
3223 tmp = 5;
3224 and verify various properties of it. */
3225
3226static void
3227test_assign_single ()
3228{
3229 tree type = integer_type_node;
3230 tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3231 get_identifier ("tmp"),
3232 type);
3233 tree rhs = build_int_cst (type, 5);
3234 gassign *stmt = gimple_build_assign (lhs, rhs);
3235 verify_gimple_pp ("tmp = 5;", stmt);
3236
3237 ASSERT_TRUE (is_gimple_assign (stmt));
3238 ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
3239 ASSERT_EQ (lhs, gimple_get_lhs (stmt));
3240 ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt));
3241 ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt));
3242 ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
3243 ASSERT_TRUE (gimple_assign_single_p (stmt));
3244 ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt));
3245}
3246
3247/* Build a GIMPLE_ASSIGN equivalent to
3248 tmp = a * b;
3249 and verify various properties of it. */
3250
3251static void
3252test_assign_binop ()
3253{
3254 tree type = integer_type_node;
3255 tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3256 get_identifier ("tmp"),
3257 type);
3258 tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3259 get_identifier ("a"),
3260 type);
3261 tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3262 get_identifier ("b"),
3263 type);
3264 gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b);
3265 verify_gimple_pp ("tmp = a * b;", stmt);
3266
3267 ASSERT_TRUE (is_gimple_assign (stmt));
3268 ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
3269 ASSERT_EQ (lhs, gimple_get_lhs (stmt));
3270 ASSERT_EQ (a, gimple_assign_rhs1 (stmt));
3271 ASSERT_EQ (b, gimple_assign_rhs2 (stmt));
3272 ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
3273 ASSERT_FALSE (gimple_assign_single_p (stmt));
3274 ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt));
3275}
3276
3277/* Build a GIMPLE_NOP and verify various properties of it. */
3278
3279static void
3280test_nop_stmt ()
3281{
3282 gimple *stmt = gimple_build_nop ();
3283 verify_gimple_pp ("GIMPLE_NOP", stmt);
3284 ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt));
3285 ASSERT_EQ (NULL, gimple_get_lhs (stmt));
3286 ASSERT_FALSE (gimple_assign_single_p (stmt));
3287}
3288
3289/* Build a GIMPLE_RETURN equivalent to
3290 return 7;
3291 and verify various properties of it. */
3292
3293static void
3294test_return_stmt ()
3295{
3296 tree type = integer_type_node;
3297 tree val = build_int_cst (type, 7);
3298 greturn *stmt = gimple_build_return (val);
3299 verify_gimple_pp ("return 7;", stmt);
3300
3301 ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
3302 ASSERT_EQ (NULL, gimple_get_lhs (stmt));
3303 ASSERT_EQ (val, gimple_return_retval (stmt));
3304 ASSERT_FALSE (gimple_assign_single_p (stmt));
3305}
3306
3307/* Build a GIMPLE_RETURN equivalent to
3308 return;
3309 and verify various properties of it. */
3310
3311static void
3312test_return_without_value ()
3313{
3314 greturn *stmt = gimple_build_return (NULL);
3315 verify_gimple_pp ("return;", stmt);
3316
3317 ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
3318 ASSERT_EQ (NULL, gimple_get_lhs (stmt));
3319 ASSERT_EQ (NULL, gimple_return_retval (stmt));
3320 ASSERT_FALSE (gimple_assign_single_p (stmt));
3321}
3322
3323/* Run all of the selftests within this file. */
3324
3325void
3326gimple_c_tests ()
3327{
3328 test_assign_single ();
3329 test_assign_binop ();
3330 test_nop_stmt ();
3331 test_return_stmt ();
3332 test_return_without_value ();
3333}
3334
3335} // namespace selftest
3336
3337
3338#endif /* CHECKING_P */
This page took 4.784165 seconds and 5 git commands to generate.