]> gcc.gnu.org Git - gcc.git/blame - gcc/gimple.c
re PR tree-optimization/88031 (ICE in vectorizable_reduction, at tree-vect-loop.c...
[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
RB
1448{
1449 int flags;
1450 tree decl = gimple_call_fndecl (stmt);
726a989a
RB
1451
1452 if (decl)
1453 flags = flags_from_decl_or_type (decl);
25583c4f
RS
1454 else if (gimple_call_internal_p (stmt))
1455 flags = internal_fn_flags (gimple_call_internal_fn (stmt));
726a989a 1456 else
97e03fa1 1457 flags = flags_from_decl_or_type (gimple_call_fntype (stmt));
726a989a 1458
daa6e488 1459 if (stmt->subcode & GF_CALL_NOTHROW)
9bb1a81b
JM
1460 flags |= ECF_NOTHROW;
1461
4c640e26
EB
1462 if (stmt->subcode & GF_CALL_BY_DESCRIPTOR)
1463 flags |= ECF_BY_DESCRIPTOR;
1464
726a989a
RB
1465 return flags;
1466}
1467
25583c4f
RS
1468/* Return the "fn spec" string for call STMT. */
1469
b78475cf 1470static const_tree
538dd0b7 1471gimple_call_fnspec (const gcall *stmt)
25583c4f
RS
1472{
1473 tree type, attr;
1474
b78475cf
YG
1475 if (gimple_call_internal_p (stmt))
1476 return internal_fn_fnspec (gimple_call_internal_fn (stmt));
1477
25583c4f
RS
1478 type = gimple_call_fntype (stmt);
1479 if (!type)
1480 return NULL_TREE;
1481
1482 attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
1483 if (!attr)
1484 return NULL_TREE;
1485
1486 return TREE_VALUE (TREE_VALUE (attr));
1487}
1488
0b7b376d
RG
1489/* Detects argument flags for argument number ARG on call STMT. */
1490
1491int
538dd0b7 1492gimple_call_arg_flags (const gcall *stmt, unsigned arg)
0b7b376d 1493{
b78475cf 1494 const_tree attr = gimple_call_fnspec (stmt);
0b7b376d 1495
25583c4f 1496 if (!attr || 1 + arg >= (unsigned) TREE_STRING_LENGTH (attr))
0b7b376d
RG
1497 return 0;
1498
1499 switch (TREE_STRING_POINTER (attr)[1 + arg])
1500 {
1501 case 'x':
1502 case 'X':
1503 return EAF_UNUSED;
1504
1505 case 'R':
1506 return EAF_DIRECT | EAF_NOCLOBBER | EAF_NOESCAPE;
1507
1508 case 'r':
1509 return EAF_NOCLOBBER | EAF_NOESCAPE;
1510
1511 case 'W':
1512 return EAF_DIRECT | EAF_NOESCAPE;
1513
1514 case 'w':
1515 return EAF_NOESCAPE;
1516
1517 case '.':
1518 default:
1519 return 0;
1520 }
1521}
1522
1523/* Detects return flags for the call STMT. */
1524
1525int
538dd0b7 1526gimple_call_return_flags (const gcall *stmt)
0b7b376d 1527{
b78475cf 1528 const_tree attr;
0b7b376d
RG
1529
1530 if (gimple_call_flags (stmt) & ECF_MALLOC)
1531 return ERF_NOALIAS;
1532
25583c4f
RS
1533 attr = gimple_call_fnspec (stmt);
1534 if (!attr || TREE_STRING_LENGTH (attr) < 1)
0b7b376d
RG
1535 return 0;
1536
1537 switch (TREE_STRING_POINTER (attr)[0])
1538 {
1539 case '1':
1540 case '2':
1541 case '3':
1542 case '4':
1543 return ERF_RETURNS_ARG | (TREE_STRING_POINTER (attr)[0] - '1');
1544
1545 case 'm':
1546 return ERF_NOALIAS;
1547
1548 case '.':
1549 default:
1550 return 0;
1551 }
1552}
726a989a 1553
3dbe9454 1554
288aaa5f
AH
1555/* Return true if call STMT is known to return a non-zero result. */
1556
1557bool
1558gimple_call_nonnull_result_p (gcall *call)
1559{
1560 tree fndecl = gimple_call_fndecl (call);
1561 if (!fndecl)
1562 return false;
1563 if (flag_delete_null_pointer_checks && !flag_check_new
1564 && DECL_IS_OPERATOR_NEW (fndecl)
1565 && !TREE_NOTHROW (fndecl))
1566 return true;
1567
1568 /* References are always non-NULL. */
1569 if (flag_delete_null_pointer_checks
1570 && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE)
1571 return true;
1572
1573 if (flag_delete_null_pointer_checks
1574 && lookup_attribute ("returns_nonnull",
1575 TYPE_ATTRIBUTES (gimple_call_fntype (call))))
1576 return true;
1577 return gimple_alloca_call_p (call);
1578}
1579
1580
1581/* If CALL returns a non-null result in an argument, return that arg. */
1582
1583tree
1584gimple_call_nonnull_arg (gcall *call)
1585{
1586 tree fndecl = gimple_call_fndecl (call);
1587 if (!fndecl)
1588 return NULL_TREE;
1589
1590 unsigned rf = gimple_call_return_flags (call);
1591 if (rf & ERF_RETURNS_ARG)
1592 {
1593 unsigned argnum = rf & ERF_RETURN_ARG_MASK;
1594 if (argnum < gimple_call_num_args (call))
1595 {
1596 tree arg = gimple_call_arg (call, argnum);
1597 if (SSA_VAR_P (arg)
1598 && infer_nonnull_range_by_attribute (call, arg))
1599 return arg;
1600 }
1601 }
1602 return NULL_TREE;
1603}
1604
1605
726a989a
RB
1606/* Return true if GS is a copy assignment. */
1607
1608bool
355fe088 1609gimple_assign_copy_p (gimple *gs)
726a989a 1610{
3dbe9454
RG
1611 return (gimple_assign_single_p (gs)
1612 && is_gimple_val (gimple_op (gs, 1)));
726a989a
RB
1613}
1614
1615
1616/* Return true if GS is a SSA_NAME copy assignment. */
1617
1618bool
355fe088 1619gimple_assign_ssa_name_copy_p (gimple *gs)
726a989a 1620{
3dbe9454 1621 return (gimple_assign_single_p (gs)
726a989a
RB
1622 && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME
1623 && TREE_CODE (gimple_assign_rhs1 (gs)) == SSA_NAME);
1624}
1625
1626
726a989a
RB
1627/* Return true if GS is an assignment with a unary RHS, but the
1628 operator has no effect on the assigned value. The logic is adapted
1629 from STRIP_NOPS. This predicate is intended to be used in tuplifying
1630 instances in which STRIP_NOPS was previously applied to the RHS of
1631 an assignment.
1632
1633 NOTE: In the use cases that led to the creation of this function
1634 and of gimple_assign_single_p, it is typical to test for either
1635 condition and to proceed in the same manner. In each case, the
1636 assigned value is represented by the single RHS operand of the
1637 assignment. I suspect there may be cases where gimple_assign_copy_p,
1638 gimple_assign_single_p, or equivalent logic is used where a similar
1639 treatment of unary NOPs is appropriate. */
b8698a0f 1640
726a989a 1641bool
355fe088 1642gimple_assign_unary_nop_p (gimple *gs)
726a989a 1643{
3dbe9454 1644 return (is_gimple_assign (gs)
1a87cf0c 1645 && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs))
726a989a
RB
1646 || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR)
1647 && gimple_assign_rhs1 (gs) != error_mark_node
1648 && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs)))
1649 == TYPE_MODE (TREE_TYPE (gimple_assign_rhs1 (gs)))));
1650}
1651
1652/* Set BB to be the basic block holding G. */
1653
1654void
355fe088 1655gimple_set_bb (gimple *stmt, basic_block bb)
726a989a 1656{
daa6e488 1657 stmt->bb = bb;
726a989a 1658
45b62594
RB
1659 if (gimple_code (stmt) != GIMPLE_LABEL)
1660 return;
1661
726a989a
RB
1662 /* If the statement is a label, add the label to block-to-labels map
1663 so that we can speed up edge creation for GIMPLE_GOTOs. */
45b62594 1664 if (cfun->cfg)
726a989a
RB
1665 {
1666 tree t;
1667 int uid;
1668
538dd0b7 1669 t = gimple_label_label (as_a <glabel *> (stmt));
726a989a
RB
1670 uid = LABEL_DECL_UID (t);
1671 if (uid == -1)
1672 {
99729d91
DM
1673 unsigned old_len =
1674 vec_safe_length (label_to_block_map_for_fn (cfun));
726a989a
RB
1675 LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++;
1676 if (old_len <= (unsigned) uid)
1677 {
5006671f 1678 unsigned new_len = 3 * uid / 2 + 1;
726a989a 1679
99729d91
DM
1680 vec_safe_grow_cleared (label_to_block_map_for_fn (cfun),
1681 new_len);
726a989a
RB
1682 }
1683 }
1684
99729d91 1685 (*label_to_block_map_for_fn (cfun))[uid] = bb;
726a989a
RB
1686 }
1687}
1688
1689
726a989a
RB
1690/* Modify the RHS of the assignment pointed-to by GSI using the
1691 operands in the expression tree EXPR.
1692
1693 NOTE: The statement pointed-to by GSI may be reallocated if it
1694 did not have enough operand slots.
1695
1696 This function is useful to convert an existing tree expression into
1697 the flat representation used for the RHS of a GIMPLE assignment.
1698 It will reallocate memory as needed to expand or shrink the number
1699 of operand slots needed to represent EXPR.
1700
1701 NOTE: If you find yourself building a tree and then calling this
1702 function, you are most certainly doing it the slow way. It is much
1703 better to build a new assignment or to use the function
1704 gimple_assign_set_rhs_with_ops, which does not require an
1705 expression tree to be built. */
1706
1707void
1708gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr)
1709{
1710 enum tree_code subcode;
0354c0c7 1711 tree op1, op2, op3;
726a989a 1712
d1e2bb2d 1713 extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3);
00d66391 1714 gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3);
726a989a
RB
1715}
1716
1717
1718/* Set the RHS of assignment statement pointed-to by GSI to CODE with
0354c0c7 1719 operands OP1, OP2 and OP3.
726a989a
RB
1720
1721 NOTE: The statement pointed-to by GSI may be reallocated if it
1722 did not have enough operand slots. */
1723
1724void
00d66391
JJ
1725gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
1726 tree op1, tree op2, tree op3)
726a989a
RB
1727{
1728 unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
355fe088 1729 gimple *stmt = gsi_stmt (*gsi);
726a989a
RB
1730
1731 /* If the new CODE needs more operands, allocate a new statement. */
1732 if (gimple_num_ops (stmt) < new_rhs_ops + 1)
1733 {
1734 tree lhs = gimple_assign_lhs (stmt);
355fe088 1735 gimple *new_stmt = gimple_alloc (gimple_code (stmt), new_rhs_ops + 1);
726a989a 1736 memcpy (new_stmt, stmt, gimple_size (gimple_code (stmt)));
355a7673 1737 gimple_init_singleton (new_stmt);
a8697b27 1738 gsi_replace (gsi, new_stmt, false);
726a989a
RB
1739 stmt = new_stmt;
1740
1741 /* The LHS needs to be reset as this also changes the SSA name
1742 on the LHS. */
1743 gimple_assign_set_lhs (stmt, lhs);
1744 }
1745
1746 gimple_set_num_ops (stmt, new_rhs_ops + 1);
1747 gimple_set_subcode (stmt, code);
1748 gimple_assign_set_rhs1 (stmt, op1);
1749 if (new_rhs_ops > 1)
1750 gimple_assign_set_rhs2 (stmt, op2);
0354c0c7
BS
1751 if (new_rhs_ops > 2)
1752 gimple_assign_set_rhs3 (stmt, op3);
726a989a
RB
1753}
1754
1755
1756/* Return the LHS of a statement that performs an assignment,
1757 either a GIMPLE_ASSIGN or a GIMPLE_CALL. Returns NULL_TREE
1758 for a call to a function that returns no value, or for a
1759 statement other than an assignment or a call. */
1760
1761tree
355fe088 1762gimple_get_lhs (const gimple *stmt)
726a989a 1763{
e0c68ce9 1764 enum gimple_code code = gimple_code (stmt);
726a989a
RB
1765
1766 if (code == GIMPLE_ASSIGN)
1767 return gimple_assign_lhs (stmt);
1768 else if (code == GIMPLE_CALL)
1769 return gimple_call_lhs (stmt);
1770 else
1771 return NULL_TREE;
1772}
1773
1774
1775/* Set the LHS of a statement that performs an assignment,
1776 either a GIMPLE_ASSIGN or a GIMPLE_CALL. */
1777
1778void
355fe088 1779gimple_set_lhs (gimple *stmt, tree lhs)
726a989a 1780{
e0c68ce9 1781 enum gimple_code code = gimple_code (stmt);
726a989a
RB
1782
1783 if (code == GIMPLE_ASSIGN)
1784 gimple_assign_set_lhs (stmt, lhs);
1785 else if (code == GIMPLE_CALL)
1786 gimple_call_set_lhs (stmt, lhs);
1787 else
c3284718 1788 gcc_unreachable ();
726a989a
RB
1789}
1790
1791
1792/* Return a deep copy of statement STMT. All the operands from STMT
1793 are reallocated and copied using unshare_expr. The DEF, USE, VDEF
355a7673
MM
1794 and VUSE operand arrays are set to empty in the new copy. The new
1795 copy isn't part of any sequence. */
726a989a 1796
355fe088
TS
1797gimple *
1798gimple_copy (gimple *stmt)
726a989a
RB
1799{
1800 enum gimple_code code = gimple_code (stmt);
1801 unsigned num_ops = gimple_num_ops (stmt);
355fe088 1802 gimple *copy = gimple_alloc (code, num_ops);
726a989a
RB
1803 unsigned i;
1804
1805 /* Shallow copy all the fields from STMT. */
1806 memcpy (copy, stmt, gimple_size (code));
355a7673 1807 gimple_init_singleton (copy);
726a989a
RB
1808
1809 /* If STMT has sub-statements, deep-copy them as well. */
1810 if (gimple_has_substatements (stmt))
1811 {
1812 gimple_seq new_seq;
1813 tree t;
1814
1815 switch (gimple_code (stmt))
1816 {
1817 case GIMPLE_BIND:
538dd0b7
DM
1818 {
1819 gbind *bind_stmt = as_a <gbind *> (stmt);
1820 gbind *bind_copy = as_a <gbind *> (copy);
1821 new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt));
1822 gimple_bind_set_body (bind_copy, new_seq);
1823 gimple_bind_set_vars (bind_copy,
1824 unshare_expr (gimple_bind_vars (bind_stmt)));
1825 gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt));
1826 }
726a989a
RB
1827 break;
1828
1829 case GIMPLE_CATCH:
538dd0b7
DM
1830 {
1831 gcatch *catch_stmt = as_a <gcatch *> (stmt);
1832 gcatch *catch_copy = as_a <gcatch *> (copy);
1833 new_seq = gimple_seq_copy (gimple_catch_handler (catch_stmt));
1834 gimple_catch_set_handler (catch_copy, new_seq);
1835 t = unshare_expr (gimple_catch_types (catch_stmt));
1836 gimple_catch_set_types (catch_copy, t);
1837 }
726a989a
RB
1838 break;
1839
1840 case GIMPLE_EH_FILTER:
538dd0b7
DM
1841 {
1842 geh_filter *eh_filter_stmt = as_a <geh_filter *> (stmt);
1843 geh_filter *eh_filter_copy = as_a <geh_filter *> (copy);
1844 new_seq
1845 = gimple_seq_copy (gimple_eh_filter_failure (eh_filter_stmt));
1846 gimple_eh_filter_set_failure (eh_filter_copy, new_seq);
1847 t = unshare_expr (gimple_eh_filter_types (eh_filter_stmt));
1848 gimple_eh_filter_set_types (eh_filter_copy, t);
1849 }
726a989a
RB
1850 break;
1851
0a35513e 1852 case GIMPLE_EH_ELSE:
538dd0b7
DM
1853 {
1854 geh_else *eh_else_stmt = as_a <geh_else *> (stmt);
1855 geh_else *eh_else_copy = as_a <geh_else *> (copy);
1856 new_seq = gimple_seq_copy (gimple_eh_else_n_body (eh_else_stmt));
1857 gimple_eh_else_set_n_body (eh_else_copy, new_seq);
1858 new_seq = gimple_seq_copy (gimple_eh_else_e_body (eh_else_stmt));
1859 gimple_eh_else_set_e_body (eh_else_copy, new_seq);
1860 }
0a35513e
AH
1861 break;
1862
726a989a 1863 case GIMPLE_TRY:
538dd0b7
DM
1864 {
1865 gtry *try_stmt = as_a <gtry *> (stmt);
1866 gtry *try_copy = as_a <gtry *> (copy);
1867 new_seq = gimple_seq_copy (gimple_try_eval (try_stmt));
1868 gimple_try_set_eval (try_copy, new_seq);
1869 new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt));
1870 gimple_try_set_cleanup (try_copy, new_seq);
1871 }
726a989a
RB
1872 break;
1873
1874 case GIMPLE_OMP_FOR:
1875 new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt));
1876 gimple_omp_for_set_pre_body (copy, new_seq);
1877 t = unshare_expr (gimple_omp_for_clauses (stmt));
1878 gimple_omp_for_set_clauses (copy, t);
daa6e488 1879 {
538dd0b7 1880 gomp_for *omp_for_copy = as_a <gomp_for *> (copy);
766090c2
TS
1881 omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter>
1882 ( gimple_omp_for_collapse (stmt));
daa6e488 1883 }
726a989a
RB
1884 for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
1885 {
1886 gimple_omp_for_set_cond (copy, i,
1887 gimple_omp_for_cond (stmt, i));
1888 gimple_omp_for_set_index (copy, i,
1889 gimple_omp_for_index (stmt, i));
1890 t = unshare_expr (gimple_omp_for_initial (stmt, i));
1891 gimple_omp_for_set_initial (copy, i, t);
1892 t = unshare_expr (gimple_omp_for_final (stmt, i));
1893 gimple_omp_for_set_final (copy, i, t);
1894 t = unshare_expr (gimple_omp_for_incr (stmt, i));
1895 gimple_omp_for_set_incr (copy, i, t);
1896 }
1897 goto copy_omp_body;
1898
1899 case GIMPLE_OMP_PARALLEL:
538dd0b7
DM
1900 {
1901 gomp_parallel *omp_par_stmt = as_a <gomp_parallel *> (stmt);
1902 gomp_parallel *omp_par_copy = as_a <gomp_parallel *> (copy);
1903 t = unshare_expr (gimple_omp_parallel_clauses (omp_par_stmt));
1904 gimple_omp_parallel_set_clauses (omp_par_copy, t);
1905 t = unshare_expr (gimple_omp_parallel_child_fn (omp_par_stmt));
1906 gimple_omp_parallel_set_child_fn (omp_par_copy, t);
1907 t = unshare_expr (gimple_omp_parallel_data_arg (omp_par_stmt));
1908 gimple_omp_parallel_set_data_arg (omp_par_copy, t);
1909 }
726a989a
RB
1910 goto copy_omp_body;
1911
1912 case GIMPLE_OMP_TASK:
1913 t = unshare_expr (gimple_omp_task_clauses (stmt));
1914 gimple_omp_task_set_clauses (copy, t);
1915 t = unshare_expr (gimple_omp_task_child_fn (stmt));
1916 gimple_omp_task_set_child_fn (copy, t);
1917 t = unshare_expr (gimple_omp_task_data_arg (stmt));
1918 gimple_omp_task_set_data_arg (copy, t);
1919 t = unshare_expr (gimple_omp_task_copy_fn (stmt));
1920 gimple_omp_task_set_copy_fn (copy, t);
1921 t = unshare_expr (gimple_omp_task_arg_size (stmt));
1922 gimple_omp_task_set_arg_size (copy, t);
1923 t = unshare_expr (gimple_omp_task_arg_align (stmt));
1924 gimple_omp_task_set_arg_align (copy, t);
1925 goto copy_omp_body;
1926
1927 case GIMPLE_OMP_CRITICAL:
d9a6bd32
JJ
1928 t = unshare_expr (gimple_omp_critical_name
1929 (as_a <gomp_critical *> (stmt)));
538dd0b7 1930 gimple_omp_critical_set_name (as_a <gomp_critical *> (copy), t);
d9a6bd32
JJ
1931 t = unshare_expr (gimple_omp_critical_clauses
1932 (as_a <gomp_critical *> (stmt)));
1933 gimple_omp_critical_set_clauses (as_a <gomp_critical *> (copy), t);
1934 goto copy_omp_body;
1935
1936 case GIMPLE_OMP_ORDERED:
1937 t = unshare_expr (gimple_omp_ordered_clauses
1938 (as_a <gomp_ordered *> (stmt)));
1939 gimple_omp_ordered_set_clauses (as_a <gomp_ordered *> (copy), t);
726a989a
RB
1940 goto copy_omp_body;
1941
28567c40
JJ
1942 case GIMPLE_OMP_TASKGROUP:
1943 t = unshare_expr (gimple_omp_taskgroup_clauses (stmt));
1944 gimple_omp_taskgroup_set_clauses (copy, t);
1945 goto copy_omp_body;
1946
726a989a
RB
1947 case GIMPLE_OMP_SECTIONS:
1948 t = unshare_expr (gimple_omp_sections_clauses (stmt));
1949 gimple_omp_sections_set_clauses (copy, t);
1950 t = unshare_expr (gimple_omp_sections_control (stmt));
1951 gimple_omp_sections_set_control (copy, t);
8a866b82 1952 goto copy_omp_body;
726a989a
RB
1953
1954 case GIMPLE_OMP_SINGLE:
8a866b82
TV
1955 {
1956 gomp_single *omp_single_copy = as_a <gomp_single *> (copy);
1957 t = unshare_expr (gimple_omp_single_clauses (stmt));
1958 gimple_omp_single_set_clauses (omp_single_copy, t);
1959 }
1960 goto copy_omp_body;
1961
acf0174b 1962 case GIMPLE_OMP_TARGET:
8a866b82
TV
1963 {
1964 gomp_target *omp_target_stmt = as_a <gomp_target *> (stmt);
1965 gomp_target *omp_target_copy = as_a <gomp_target *> (copy);
1966 t = unshare_expr (gimple_omp_target_clauses (omp_target_stmt));
1967 gimple_omp_target_set_clauses (omp_target_copy, t);
1968 t = unshare_expr (gimple_omp_target_data_arg (omp_target_stmt));
1969 gimple_omp_target_set_data_arg (omp_target_copy, t);
1970 }
1971 goto copy_omp_body;
1972
acf0174b 1973 case GIMPLE_OMP_TEAMS:
8a866b82
TV
1974 {
1975 gomp_teams *omp_teams_copy = as_a <gomp_teams *> (copy);
1976 t = unshare_expr (gimple_omp_teams_clauses (stmt));
1977 gimple_omp_teams_set_clauses (omp_teams_copy, t);
1978 }
1979 /* FALLTHRU */
1980
726a989a
RB
1981 case GIMPLE_OMP_SECTION:
1982 case GIMPLE_OMP_MASTER:
b2b40051 1983 case GIMPLE_OMP_GRID_BODY:
726a989a
RB
1984 copy_omp_body:
1985 new_seq = gimple_seq_copy (gimple_omp_body (stmt));
1986 gimple_omp_set_body (copy, new_seq);
1987 break;
1988
0a35513e 1989 case GIMPLE_TRANSACTION:
538dd0b7
DM
1990 new_seq = gimple_seq_copy (gimple_transaction_body (
1991 as_a <gtransaction *> (stmt)));
1992 gimple_transaction_set_body (as_a <gtransaction *> (copy),
1993 new_seq);
0a35513e
AH
1994 break;
1995
726a989a
RB
1996 case GIMPLE_WITH_CLEANUP_EXPR:
1997 new_seq = gimple_seq_copy (gimple_wce_cleanup (stmt));
1998 gimple_wce_set_cleanup (copy, new_seq);
1999 break;
2000
2001 default:
2002 gcc_unreachable ();
2003 }
2004 }
2005
2006 /* Make copy of operands. */
483ef49f
RG
2007 for (i = 0; i < num_ops; i++)
2008 gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i)));
726a989a 2009
483ef49f
RG
2010 if (gimple_has_mem_ops (stmt))
2011 {
2012 gimple_set_vdef (copy, gimple_vdef (stmt));
2013 gimple_set_vuse (copy, gimple_vuse (stmt));
2014 }
726a989a 2015
483ef49f
RG
2016 /* Clear out SSA operand vectors on COPY. */
2017 if (gimple_has_ops (stmt))
2018 {
483ef49f 2019 gimple_set_use_ops (copy, NULL);
726a989a 2020
5006671f
RG
2021 /* SSA operands need to be updated. */
2022 gimple_set_modified (copy, true);
726a989a
RB
2023 }
2024
96a95ac1
AO
2025 if (gimple_debug_nonbind_marker_p (stmt))
2026 cfun->debug_marker_count++;
2027
726a989a
RB
2028 return copy;
2029}
2030
2031
726a989a
RB
2032/* Return true if statement S has side-effects. We consider a
2033 statement to have side effects if:
2034
2035 - It is a GIMPLE_CALL not marked with ECF_PURE or ECF_CONST.
2036 - Any of its operands are marked TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS. */
2037
2038bool
355fe088 2039gimple_has_side_effects (const gimple *s)
726a989a 2040{
b5b8b0ac
AO
2041 if (is_gimple_debug (s))
2042 return false;
2043
726a989a
RB
2044 /* We don't have to scan the arguments to check for
2045 volatile arguments, though, at present, we still
2046 do a scan to check for TREE_SIDE_EFFECTS. */
2047 if (gimple_has_volatile_ops (s))
2048 return true;
2049
179184e3 2050 if (gimple_code (s) == GIMPLE_ASM
538dd0b7 2051 && gimple_asm_volatile_p (as_a <const gasm *> (s)))
179184e3
RG
2052 return true;
2053
726a989a
RB
2054 if (is_gimple_call (s))
2055 {
723afc44 2056 int flags = gimple_call_flags (s);
726a989a 2057
723afc44
RG
2058 /* An infinite loop is considered a side effect. */
2059 if (!(flags & (ECF_CONST | ECF_PURE))
2060 || (flags & ECF_LOOPING_CONST_OR_PURE))
726a989a
RB
2061 return true;
2062
726a989a
RB
2063 return false;
2064 }
726a989a
RB
2065
2066 return false;
2067}
2068
726a989a 2069/* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p.
e1fd038a
SP
2070 Return true if S can trap. When INCLUDE_MEM is true, check whether
2071 the memory operations could trap. When INCLUDE_STORES is true and
2072 S is a GIMPLE_ASSIGN, the LHS of the assignment is also checked. */
726a989a 2073
e1fd038a 2074bool
355fe088 2075gimple_could_trap_p_1 (gimple *s, bool include_mem, bool include_stores)
726a989a 2076{
726a989a
RB
2077 tree t, div = NULL_TREE;
2078 enum tree_code op;
2079
e1fd038a
SP
2080 if (include_mem)
2081 {
2082 unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0;
726a989a 2083
e1fd038a
SP
2084 for (i = start; i < gimple_num_ops (s); i++)
2085 if (tree_could_trap_p (gimple_op (s, i)))
2086 return true;
2087 }
726a989a
RB
2088
2089 switch (gimple_code (s))
2090 {
2091 case GIMPLE_ASM:
538dd0b7 2092 return gimple_asm_volatile_p (as_a <gasm *> (s));
726a989a
RB
2093
2094 case GIMPLE_CALL:
2095 t = gimple_call_fndecl (s);
2096 /* Assume that calls to weak functions may trap. */
2097 if (!t || !DECL_P (t) || DECL_WEAK (t))
2098 return true;
2099 return false;
2100
2101 case GIMPLE_ASSIGN:
2102 t = gimple_expr_type (s);
2103 op = gimple_assign_rhs_code (s);
2104 if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS)
2105 div = gimple_assign_rhs2 (s);
2106 return (operation_could_trap_p (op, FLOAT_TYPE_P (t),
2107 (INTEGRAL_TYPE_P (t)
2108 && TYPE_OVERFLOW_TRAPS (t)),
2109 div));
2110
46ec7a06
RB
2111 case GIMPLE_COND:
2112 t = TREE_TYPE (gimple_cond_lhs (s));
2113 return operation_could_trap_p (gimple_cond_code (s),
2114 FLOAT_TYPE_P (t), false, NULL_TREE);
2115
726a989a
RB
2116 default:
2117 break;
2118 }
2119
2120 return false;
726a989a
RB
2121}
2122
726a989a
RB
2123/* Return true if statement S can trap. */
2124
2125bool
355fe088 2126gimple_could_trap_p (gimple *s)
726a989a 2127{
e1fd038a 2128 return gimple_could_trap_p_1 (s, true, true);
726a989a
RB
2129}
2130
726a989a
RB
2131/* Return true if RHS of a GIMPLE_ASSIGN S can trap. */
2132
2133bool
355fe088 2134gimple_assign_rhs_could_trap_p (gimple *s)
726a989a
RB
2135{
2136 gcc_assert (is_gimple_assign (s));
e1fd038a 2137 return gimple_could_trap_p_1 (s, true, false);
726a989a
RB
2138}
2139
2140
2141/* Print debugging information for gimple stmts generated. */
2142
2143void
2144dump_gimple_statistics (void)
2145{
33b366c3
ML
2146 int i;
2147 uint64_t total_tuples = 0, total_bytes = 0;
726a989a 2148
7aa6d18a
SB
2149 if (! GATHER_STATISTICS)
2150 {
33b366c3 2151 fprintf (stderr, "No GIMPLE statistics\n");
7aa6d18a
SB
2152 return;
2153 }
2154
726a989a
RB
2155 fprintf (stderr, "\nGIMPLE statements\n");
2156 fprintf (stderr, "Kind Stmts Bytes\n");
2157 fprintf (stderr, "---------------------------------------\n");
2158 for (i = 0; i < (int) gimple_alloc_kind_all; ++i)
2159 {
40ce7fa6
ML
2160 fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n",
2161 gimple_alloc_kind_names[i],
2162 SIZE_AMOUNT (gimple_alloc_counts[i]),
2163 SIZE_AMOUNT (gimple_alloc_sizes[i]));
726a989a
RB
2164 total_tuples += gimple_alloc_counts[i];
2165 total_bytes += gimple_alloc_sizes[i];
2166 }
2167 fprintf (stderr, "---------------------------------------\n");
40ce7fa6
ML
2168 fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n", "Total",
2169 SIZE_AMOUNT (total_tuples), SIZE_AMOUNT (total_bytes));
726a989a 2170 fprintf (stderr, "---------------------------------------\n");
726a989a
RB
2171}
2172
2173
726a989a
RB
2174/* Return the number of operands needed on the RHS of a GIMPLE
2175 assignment for an expression with tree code CODE. */
2176
2177unsigned
2178get_gimple_rhs_num_ops (enum tree_code code)
2179{
2180 enum gimple_rhs_class rhs_class = get_gimple_rhs_class (code);
2181
2182 if (rhs_class == GIMPLE_UNARY_RHS || rhs_class == GIMPLE_SINGLE_RHS)
2183 return 1;
2184 else if (rhs_class == GIMPLE_BINARY_RHS)
2185 return 2;
0354c0c7
BS
2186 else if (rhs_class == GIMPLE_TERNARY_RHS)
2187 return 3;
726a989a
RB
2188 else
2189 gcc_unreachable ();
2190}
2191
2192#define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
2193 (unsigned char) \
2194 ((TYPE) == tcc_unary ? GIMPLE_UNARY_RHS \
2195 : ((TYPE) == tcc_binary \
2196 || (TYPE) == tcc_comparison) ? GIMPLE_BINARY_RHS \
2197 : ((TYPE) == tcc_constant \
2198 || (TYPE) == tcc_declaration \
2199 || (TYPE) == tcc_reference) ? GIMPLE_SINGLE_RHS \
2200 : ((SYM) == TRUTH_AND_EXPR \
2201 || (SYM) == TRUTH_OR_EXPR \
2202 || (SYM) == TRUTH_XOR_EXPR) ? GIMPLE_BINARY_RHS \
2203 : (SYM) == TRUTH_NOT_EXPR ? GIMPLE_UNARY_RHS \
4e71066d
RG
2204 : ((SYM) == COND_EXPR \
2205 || (SYM) == WIDEN_MULT_PLUS_EXPR \
16949072 2206 || (SYM) == WIDEN_MULT_MINUS_EXPR \
f471fe72 2207 || (SYM) == DOT_PROD_EXPR \
79d652a5 2208 || (SYM) == SAD_EXPR \
f471fe72 2209 || (SYM) == REALIGN_LOAD_EXPR \
4e71066d 2210 || (SYM) == VEC_COND_EXPR \
2205ed25 2211 || (SYM) == VEC_PERM_EXPR \
c566cc9f 2212 || (SYM) == BIT_INSERT_EXPR) ? GIMPLE_TERNARY_RHS \
4e71066d 2213 : ((SYM) == CONSTRUCTOR \
726a989a
RB
2214 || (SYM) == OBJ_TYPE_REF \
2215 || (SYM) == ASSERT_EXPR \
2216 || (SYM) == ADDR_EXPR \
2217 || (SYM) == WITH_SIZE_EXPR \
4e71066d 2218 || (SYM) == SSA_NAME) ? GIMPLE_SINGLE_RHS \
726a989a
RB
2219 : GIMPLE_INVALID_RHS),
2220#define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS,
2221
2222const unsigned char gimple_rhs_class_table[] = {
2223#include "all-tree.def"
2224};
2225
2226#undef DEFTREECODE
2227#undef END_OF_BASE_TREE_CODES
2228
726a989a
RB
2229/* Canonicalize a tree T for use in a COND_EXPR as conditional. Returns
2230 a canonicalized tree that is valid for a COND_EXPR or NULL_TREE, if
2231 we failed to create one. */
2232
2233tree
2234canonicalize_cond_expr_cond (tree t)
2235{
b66a1bac
RG
2236 /* Strip conversions around boolean operations. */
2237 if (CONVERT_EXPR_P (t)
9b80d091
KT
2238 && (truth_value_p (TREE_CODE (TREE_OPERAND (t, 0)))
2239 || TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0)))
2240 == BOOLEAN_TYPE))
b66a1bac
RG
2241 t = TREE_OPERAND (t, 0);
2242
726a989a 2243 /* For !x use x == 0. */
12430896 2244 if (TREE_CODE (t) == TRUTH_NOT_EXPR)
726a989a
RB
2245 {
2246 tree top0 = TREE_OPERAND (t, 0);
2247 t = build2 (EQ_EXPR, TREE_TYPE (t),
2248 top0, build_int_cst (TREE_TYPE (top0), 0));
2249 }
2250 /* For cmp ? 1 : 0 use cmp. */
2251 else if (TREE_CODE (t) == COND_EXPR
2252 && COMPARISON_CLASS_P (TREE_OPERAND (t, 0))
2253 && integer_onep (TREE_OPERAND (t, 1))
2254 && integer_zerop (TREE_OPERAND (t, 2)))
2255 {
2256 tree top0 = TREE_OPERAND (t, 0);
2257 t = build2 (TREE_CODE (top0), TREE_TYPE (t),
2258 TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1));
2259 }
4481581f
JL
2260 /* For x ^ y use x != y. */
2261 else if (TREE_CODE (t) == BIT_XOR_EXPR)
2262 t = build2 (NE_EXPR, TREE_TYPE (t),
2263 TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
2264
726a989a
RB
2265 if (is_gimple_condexpr (t))
2266 return t;
2267
2268 return NULL_TREE;
2269}
2270
e6c99067
DN
2271/* Build a GIMPLE_CALL identical to STMT but skipping the arguments in
2272 the positions marked by the set ARGS_TO_SKIP. */
2273
538dd0b7
DM
2274gcall *
2275gimple_call_copy_skip_args (gcall *stmt, bitmap args_to_skip)
c6f7cfc1
JH
2276{
2277 int i;
c6f7cfc1 2278 int nargs = gimple_call_num_args (stmt);
ef062b13 2279 auto_vec<tree> vargs (nargs);
538dd0b7 2280 gcall *new_stmt;
c6f7cfc1
JH
2281
2282 for (i = 0; i < nargs; i++)
2283 if (!bitmap_bit_p (args_to_skip, i))
9771b263 2284 vargs.quick_push (gimple_call_arg (stmt, i));
c6f7cfc1 2285
25583c4f
RS
2286 if (gimple_call_internal_p (stmt))
2287 new_stmt = gimple_build_call_internal_vec (gimple_call_internal_fn (stmt),
2288 vargs);
2289 else
2290 new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs);
ef062b13 2291
c6f7cfc1
JH
2292 if (gimple_call_lhs (stmt))
2293 gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
2294
5006671f
RG
2295 gimple_set_vuse (new_stmt, gimple_vuse (stmt));
2296 gimple_set_vdef (new_stmt, gimple_vdef (stmt));
2297
c6f7cfc1
JH
2298 if (gimple_has_location (stmt))
2299 gimple_set_location (new_stmt, gimple_location (stmt));
8d2adc24 2300 gimple_call_copy_flags (new_stmt, stmt);
c6f7cfc1 2301 gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
5006671f
RG
2302
2303 gimple_set_modified (new_stmt, true);
2304
c6f7cfc1
JH
2305 return new_stmt;
2306}
2307
5006671f 2308
d7f09764 2309
d025732d
EB
2310/* Return true if the field decls F1 and F2 are at the same offset.
2311
91f2fae8 2312 This is intended to be used on GIMPLE types only. */
d7f09764 2313
1e4bc4eb 2314bool
d025732d 2315gimple_compare_field_offset (tree f1, tree f2)
d7f09764
DN
2316{
2317 if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2))
d025732d
EB
2318 {
2319 tree offset1 = DECL_FIELD_OFFSET (f1);
2320 tree offset2 = DECL_FIELD_OFFSET (f2);
2321 return ((offset1 == offset2
2322 /* Once gimplification is done, self-referential offsets are
2323 instantiated as operand #2 of the COMPONENT_REF built for
2324 each access and reset. Therefore, they are not relevant
2325 anymore and fields are interchangeable provided that they
2326 represent the same access. */
2327 || (TREE_CODE (offset1) == PLACEHOLDER_EXPR
2328 && TREE_CODE (offset2) == PLACEHOLDER_EXPR
2329 && (DECL_SIZE (f1) == DECL_SIZE (f2)
2330 || (TREE_CODE (DECL_SIZE (f1)) == PLACEHOLDER_EXPR
2331 && TREE_CODE (DECL_SIZE (f2)) == PLACEHOLDER_EXPR)
2332 || operand_equal_p (DECL_SIZE (f1), DECL_SIZE (f2), 0))
2333 && DECL_ALIGN (f1) == DECL_ALIGN (f2))
2334 || operand_equal_p (offset1, offset2, 0))
2335 && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1),
2336 DECL_FIELD_BIT_OFFSET (f2)));
2337 }
d7f09764
DN
2338
2339 /* Fortran and C do not always agree on what DECL_OFFSET_ALIGN
2340 should be, so handle differing ones specially by decomposing
2341 the offset into a byte and bit offset manually. */
9541ffee
RS
2342 if (tree_fits_shwi_p (DECL_FIELD_OFFSET (f1))
2343 && tree_fits_shwi_p (DECL_FIELD_OFFSET (f2)))
d7f09764
DN
2344 {
2345 unsigned HOST_WIDE_INT byte_offset1, byte_offset2;
2346 unsigned HOST_WIDE_INT bit_offset1, bit_offset2;
2347 bit_offset1 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f1));
2348 byte_offset1 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f1))
2349 + bit_offset1 / BITS_PER_UNIT);
2350 bit_offset2 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f2));
2351 byte_offset2 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f2))
2352 + bit_offset2 / BITS_PER_UNIT);
2353 if (byte_offset1 != byte_offset2)
2354 return false;
2355 return bit_offset1 % BITS_PER_UNIT == bit_offset2 % BITS_PER_UNIT;
2356 }
2357
2358 return false;
2359}
2360
d7f09764
DN
2361
2362/* Return a type the same as TYPE except unsigned or
2363 signed according to UNSIGNEDP. */
2364
2365static tree
2366gimple_signed_or_unsigned_type (bool unsignedp, tree type)
2367{
2368 tree type1;
78a7c317 2369 int i;
d7f09764
DN
2370
2371 type1 = TYPE_MAIN_VARIANT (type);
2372 if (type1 == signed_char_type_node
2373 || type1 == char_type_node
2374 || type1 == unsigned_char_type_node)
2375 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2376 if (type1 == integer_type_node || type1 == unsigned_type_node)
2377 return unsignedp ? unsigned_type_node : integer_type_node;
2378 if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
2379 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2380 if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
2381 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2382 if (type1 == long_long_integer_type_node
2383 || type1 == long_long_unsigned_type_node)
2384 return unsignedp
2385 ? long_long_unsigned_type_node
2386 : long_long_integer_type_node;
78a7c317
DD
2387
2388 for (i = 0; i < NUM_INT_N_ENTS; i ++)
2389 if (int_n_enabled_p[i]
2390 && (type1 == int_n_trees[i].unsigned_type
2391 || type1 == int_n_trees[i].signed_type))
2392 return unsignedp
2393 ? int_n_trees[i].unsigned_type
2394 : int_n_trees[i].signed_type;
2395
d7f09764
DN
2396#if HOST_BITS_PER_WIDE_INT >= 64
2397 if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
2398 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2399#endif
2400 if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
2401 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2402 if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
2403 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2404 if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
2405 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2406 if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node)
2407 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2408
2409#define GIMPLE_FIXED_TYPES(NAME) \
2410 if (type1 == short_ ## NAME ## _type_node \
2411 || type1 == unsigned_short_ ## NAME ## _type_node) \
2412 return unsignedp ? unsigned_short_ ## NAME ## _type_node \
2413 : short_ ## NAME ## _type_node; \
2414 if (type1 == NAME ## _type_node \
2415 || type1 == unsigned_ ## NAME ## _type_node) \
2416 return unsignedp ? unsigned_ ## NAME ## _type_node \
2417 : NAME ## _type_node; \
2418 if (type1 == long_ ## NAME ## _type_node \
2419 || type1 == unsigned_long_ ## NAME ## _type_node) \
2420 return unsignedp ? unsigned_long_ ## NAME ## _type_node \
2421 : long_ ## NAME ## _type_node; \
2422 if (type1 == long_long_ ## NAME ## _type_node \
2423 || type1 == unsigned_long_long_ ## NAME ## _type_node) \
2424 return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \
2425 : long_long_ ## NAME ## _type_node;
2426
2427#define GIMPLE_FIXED_MODE_TYPES(NAME) \
2428 if (type1 == NAME ## _type_node \
2429 || type1 == u ## NAME ## _type_node) \
2430 return unsignedp ? u ## NAME ## _type_node \
2431 : NAME ## _type_node;
2432
2433#define GIMPLE_FIXED_TYPES_SAT(NAME) \
2434 if (type1 == sat_ ## short_ ## NAME ## _type_node \
2435 || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \
2436 return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \
2437 : sat_ ## short_ ## NAME ## _type_node; \
2438 if (type1 == sat_ ## NAME ## _type_node \
2439 || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \
2440 return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \
2441 : sat_ ## NAME ## _type_node; \
2442 if (type1 == sat_ ## long_ ## NAME ## _type_node \
2443 || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \
2444 return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \
2445 : sat_ ## long_ ## NAME ## _type_node; \
2446 if (type1 == sat_ ## long_long_ ## NAME ## _type_node \
2447 || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \
2448 return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \
2449 : sat_ ## long_long_ ## NAME ## _type_node;
2450
2451#define GIMPLE_FIXED_MODE_TYPES_SAT(NAME) \
2452 if (type1 == sat_ ## NAME ## _type_node \
2453 || type1 == sat_ ## u ## NAME ## _type_node) \
2454 return unsignedp ? sat_ ## u ## NAME ## _type_node \
2455 : sat_ ## NAME ## _type_node;
2456
2457 GIMPLE_FIXED_TYPES (fract);
2458 GIMPLE_FIXED_TYPES_SAT (fract);
2459 GIMPLE_FIXED_TYPES (accum);
2460 GIMPLE_FIXED_TYPES_SAT (accum);
2461
2462 GIMPLE_FIXED_MODE_TYPES (qq);
2463 GIMPLE_FIXED_MODE_TYPES (hq);
2464 GIMPLE_FIXED_MODE_TYPES (sq);
2465 GIMPLE_FIXED_MODE_TYPES (dq);
2466 GIMPLE_FIXED_MODE_TYPES (tq);
2467 GIMPLE_FIXED_MODE_TYPES_SAT (qq);
2468 GIMPLE_FIXED_MODE_TYPES_SAT (hq);
2469 GIMPLE_FIXED_MODE_TYPES_SAT (sq);
2470 GIMPLE_FIXED_MODE_TYPES_SAT (dq);
2471 GIMPLE_FIXED_MODE_TYPES_SAT (tq);
2472 GIMPLE_FIXED_MODE_TYPES (ha);
2473 GIMPLE_FIXED_MODE_TYPES (sa);
2474 GIMPLE_FIXED_MODE_TYPES (da);
2475 GIMPLE_FIXED_MODE_TYPES (ta);
2476 GIMPLE_FIXED_MODE_TYPES_SAT (ha);
2477 GIMPLE_FIXED_MODE_TYPES_SAT (sa);
2478 GIMPLE_FIXED_MODE_TYPES_SAT (da);
2479 GIMPLE_FIXED_MODE_TYPES_SAT (ta);
2480
2481 /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not
2482 the precision; they have precision set to match their range, but
2483 may use a wider mode to match an ABI. If we change modes, we may
2484 wind up with bad conversions. For INTEGER_TYPEs in C, must check
2485 the precision as well, so as to yield correct results for
2486 bit-field types. C++ does not have these separate bit-field
2487 types, and producing a signed or unsigned variant of an
2488 ENUMERAL_TYPE may cause other problems as well. */
2489 if (!INTEGRAL_TYPE_P (type)
2490 || TYPE_UNSIGNED (type) == unsignedp)
2491 return type;
2492
2493#define TYPE_OK(node) \
2494 (TYPE_MODE (type) == TYPE_MODE (node) \
2495 && TYPE_PRECISION (type) == TYPE_PRECISION (node))
2496 if (TYPE_OK (signed_char_type_node))
2497 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2498 if (TYPE_OK (integer_type_node))
2499 return unsignedp ? unsigned_type_node : integer_type_node;
2500 if (TYPE_OK (short_integer_type_node))
2501 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2502 if (TYPE_OK (long_integer_type_node))
2503 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2504 if (TYPE_OK (long_long_integer_type_node))
2505 return (unsignedp
2506 ? long_long_unsigned_type_node
2507 : long_long_integer_type_node);
78a7c317
DD
2508
2509 for (i = 0; i < NUM_INT_N_ENTS; i ++)
2510 if (int_n_enabled_p[i]
2511 && TYPE_MODE (type) == int_n_data[i].m
2512 && TYPE_PRECISION (type) == int_n_data[i].bitsize)
2513 return unsignedp
2514 ? int_n_trees[i].unsigned_type
2515 : int_n_trees[i].signed_type;
d7f09764
DN
2516
2517#if HOST_BITS_PER_WIDE_INT >= 64
2518 if (TYPE_OK (intTI_type_node))
2519 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2520#endif
2521 if (TYPE_OK (intDI_type_node))
2522 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2523 if (TYPE_OK (intSI_type_node))
2524 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2525 if (TYPE_OK (intHI_type_node))
2526 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2527 if (TYPE_OK (intQI_type_node))
2528 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2529
2530#undef GIMPLE_FIXED_TYPES
2531#undef GIMPLE_FIXED_MODE_TYPES
2532#undef GIMPLE_FIXED_TYPES_SAT
2533#undef GIMPLE_FIXED_MODE_TYPES_SAT
2534#undef TYPE_OK
2535
2536 return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
2537}
2538
2539
2540/* Return an unsigned type the same as TYPE in other respects. */
2541
2542tree
2543gimple_unsigned_type (tree type)
2544{
2545 return gimple_signed_or_unsigned_type (true, type);
2546}
2547
2548
2549/* Return a signed type the same as TYPE in other respects. */
2550
2551tree
2552gimple_signed_type (tree type)
2553{
2554 return gimple_signed_or_unsigned_type (false, type);
2555}
2556
2557
2558/* Return the typed-based alias set for T, which may be an expression
2559 or a type. Return -1 if we don't do anything special. */
2560
2561alias_set_type
2562gimple_get_alias_set (tree t)
2563{
d7f09764
DN
2564 /* That's all the expressions we handle specially. */
2565 if (!TYPE_P (t))
2566 return -1;
2567
2568 /* For convenience, follow the C standard when dealing with
2569 character types. Any object may be accessed via an lvalue that
2570 has character type. */
2571 if (t == char_type_node
2572 || t == signed_char_type_node
2573 || t == unsigned_char_type_node)
2574 return 0;
2575
2576 /* Allow aliasing between signed and unsigned variants of the same
2577 type. We treat the signed variant as canonical. */
2578 if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
2579 {
2580 tree t1 = gimple_signed_type (t);
2581
2582 /* t1 == t can happen for boolean nodes which are always unsigned. */
2583 if (t1 != t)
2584 return get_alias_set (t1);
2585 }
d7f09764
DN
2586
2587 return -1;
2588}
2589
2590
ccacdf06
RG
2591/* Helper for gimple_ior_addresses_taken_1. */
2592
2593static bool
355fe088 2594gimple_ior_addresses_taken_1 (gimple *, tree addr, tree, void *data)
ccacdf06
RG
2595{
2596 bitmap addresses_taken = (bitmap)data;
2ea9dc64
RG
2597 addr = get_base_address (addr);
2598 if (addr
2599 && DECL_P (addr))
ccacdf06
RG
2600 {
2601 bitmap_set_bit (addresses_taken, DECL_UID (addr));
2602 return true;
2603 }
2604 return false;
2605}
2606
2607/* Set the bit for the uid of all decls that have their address taken
2608 in STMT in the ADDRESSES_TAKEN bitmap. Returns true if there
2609 were any in this stmt. */
2610
2611bool
355fe088 2612gimple_ior_addresses_taken (bitmap addresses_taken, gimple *stmt)
ccacdf06
RG
2613{
2614 return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL,
2615 gimple_ior_addresses_taken_1);
2616}
2617
4537ec0c 2618
5c944c6c
RB
2619/* Return true when STMTs arguments and return value match those of FNDECL,
2620 a decl of a builtin function. */
3626621a 2621
5c944c6c 2622bool
355fe088 2623gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
3626621a 2624{
5c944c6c
RB
2625 gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN);
2626
2627 tree ret = gimple_call_lhs (stmt);
2628 if (ret
2ad3adf1
JJ
2629 && !useless_type_conversion_p (TREE_TYPE (ret),
2630 TREE_TYPE (TREE_TYPE (fndecl))))
5c944c6c
RB
2631 return false;
2632
3626621a
RB
2633 tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
2634 unsigned nargs = gimple_call_num_args (stmt);
2635 for (unsigned i = 0; i < nargs; ++i)
2636 {
2637 /* Variadic args follow. */
2638 if (!targs)
2639 return true;
2640 tree arg = gimple_call_arg (stmt, i);
fd39794a
JJ
2641 tree type = TREE_VALUE (targs);
2642 if (!useless_type_conversion_p (type, TREE_TYPE (arg))
2643 /* char/short integral arguments are promoted to int
2644 by several frontends if targetm.calls.promote_prototypes
2645 is true. Allow such promotion too. */
2646 && !(INTEGRAL_TYPE_P (type)
2647 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
2648 && targetm.calls.promote_prototypes (TREE_TYPE (fndecl))
2649 && useless_type_conversion_p (integer_type_node,
2650 TREE_TYPE (arg))))
3626621a
RB
2651 return false;
2652 targs = TREE_CHAIN (targs);
2653 }
2654 if (targs && !VOID_TYPE_P (TREE_VALUE (targs)))
2655 return false;
2656 return true;
2657}
2658
5c944c6c
RB
2659/* Return true when STMT is builtins call. */
2660
2661bool
355fe088 2662gimple_call_builtin_p (const gimple *stmt)
5c944c6c
RB
2663{
2664 tree fndecl;
2665 if (is_gimple_call (stmt)
2666 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
2667 && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN)
2668 return gimple_builtin_call_types_compatible_p (stmt, fndecl);
2669 return false;
2670}
2671
3626621a
RB
2672/* Return true when STMT is builtins call to CLASS. */
2673
2674bool
355fe088 2675gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass)
3626621a
RB
2676{
2677 tree fndecl;
2678 if (is_gimple_call (stmt)
2679 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
2680 && DECL_BUILT_IN_CLASS (fndecl) == klass)
5c944c6c 2681 return gimple_builtin_call_types_compatible_p (stmt, fndecl);
3626621a
RB
2682 return false;
2683}
2684
2685/* Return true when STMT is builtins call to CODE of CLASS. */
c54c785d
JH
2686
2687bool
355fe088 2688gimple_call_builtin_p (const gimple *stmt, enum built_in_function code)
c54c785d
JH
2689{
2690 tree fndecl;
3626621a
RB
2691 if (is_gimple_call (stmt)
2692 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
3d78e008 2693 && fndecl_built_in_p (fndecl, code))
5c944c6c 2694 return gimple_builtin_call_types_compatible_p (stmt, fndecl);
3626621a 2695 return false;
c54c785d
JH
2696}
2697
00175cb2
RS
2698/* If CALL is a call to a combined_fn (i.e. an internal function or
2699 a normal built-in function), return its code, otherwise return
2700 CFN_LAST. */
2701
2702combined_fn
2703gimple_call_combined_fn (const gimple *stmt)
2704{
2705 if (const gcall *call = dyn_cast <const gcall *> (stmt))
2706 {
2707 if (gimple_call_internal_p (call))
2708 return as_combined_fn (gimple_call_internal_fn (call));
2709
2710 tree fndecl = gimple_call_fndecl (stmt);
2711 if (fndecl
3d78e008 2712 && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
00175cb2
RS
2713 && gimple_builtin_call_types_compatible_p (stmt, fndecl))
2714 return as_combined_fn (DECL_FUNCTION_CODE (fndecl));
2715 }
2716 return CFN_LAST;
2717}
2718
edcdea5b
NF
2719/* Return true if STMT clobbers memory. STMT is required to be a
2720 GIMPLE_ASM. */
2721
2722bool
538dd0b7 2723gimple_asm_clobbers_memory_p (const gasm *stmt)
edcdea5b
NF
2724{
2725 unsigned i;
2726
2727 for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
2728 {
2729 tree op = gimple_asm_clobber_op (stmt, i);
2730 if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
2731 return true;
2732 }
2733
93671519
BE
2734 /* Non-empty basic ASM implicitly clobbers memory. */
2735 if (gimple_asm_input_p (stmt) && strlen (gimple_asm_string (stmt)) != 0)
2736 return true;
2737
edcdea5b
NF
2738 return false;
2739}
475b8f37 2740
80560f95
AM
2741/* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE. */
2742
2743void
2744dump_decl_set (FILE *file, bitmap set)
2745{
2746 if (set)
2747 {
2748 bitmap_iterator bi;
2749 unsigned i;
2750
2751 fprintf (file, "{ ");
2752
2753 EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
2754 {
2755 fprintf (file, "D.%u", i);
2756 fprintf (file, " ");
2757 }
2758
2759 fprintf (file, "}");
2760 }
2761 else
2762 fprintf (file, "NIL");
2763}
7a300452 2764
3d9c733e
AM
2765/* Return true when CALL is a call stmt that definitely doesn't
2766 free any memory or makes it unavailable otherwise. */
2767bool
355fe088 2768nonfreeing_call_p (gimple *call)
3d9c733e
AM
2769{
2770 if (gimple_call_builtin_p (call, BUILT_IN_NORMAL)
2771 && gimple_call_flags (call) & ECF_LEAF)
2772 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call)))
2773 {
2774 /* Just in case these become ECF_LEAF in the future. */
2775 case BUILT_IN_FREE:
2776 case BUILT_IN_TM_FREE:
2777 case BUILT_IN_REALLOC:
2778 case BUILT_IN_STACK_RESTORE:
2779 return false;
2780 default:
2781 return true;
2782 }
8413ca87
JJ
2783 else if (gimple_call_internal_p (call))
2784 switch (gimple_call_internal_fn (call))
2785 {
2786 case IFN_ABNORMAL_DISPATCHER:
2787 return true;
6dc4a604 2788 case IFN_ASAN_MARK:
56b7aede 2789 return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON;
8413ca87
JJ
2790 default:
2791 if (gimple_call_flags (call) & ECF_LEAF)
2792 return true;
2793 return false;
2794 }
3d9c733e 2795
8413ca87
JJ
2796 tree fndecl = gimple_call_fndecl (call);
2797 if (!fndecl)
2798 return false;
2799 struct cgraph_node *n = cgraph_node::get (fndecl);
2800 if (!n)
2801 return false;
2802 enum availability availability;
2803 n = n->function_symbol (&availability);
2804 if (!n || availability <= AVAIL_INTERPOSABLE)
2805 return false;
2806 return n->nonfreeing_fn;
3d9c733e 2807}
8fdc414d 2808
c000cd7c
BS
2809/* Return true when CALL is a call stmt that definitely need not
2810 be considered to be a memory barrier. */
2811bool
2812nonbarrier_call_p (gimple *call)
2813{
2814 if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST))
2815 return true;
2816 /* Should extend this to have a nonbarrier_fn flag, just as above in
2817 the nonfreeing case. */
2818 return false;
2819}
2820
8fdc414d
JL
2821/* Callback for walk_stmt_load_store_ops.
2822
2823 Return TRUE if OP will dereference the tree stored in DATA, FALSE
2824 otherwise.
2825
2826 This routine only makes a superficial check for a dereference. Thus
2827 it must only be used if it is safe to return a false negative. */
2828static bool
355fe088 2829check_loadstore (gimple *, tree op, tree, void *data)
8fdc414d 2830{
6626f970
RH
2831 if (TREE_CODE (op) == MEM_REF || TREE_CODE (op) == TARGET_MEM_REF)
2832 {
2833 /* Some address spaces may legitimately dereference zero. */
2834 addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op));
2835 if (targetm.addr_space.zero_address_valid (as))
2836 return false;
2837
2838 return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0);
2839 }
8fdc414d
JL
2840 return false;
2841}
2842
ae93744d 2843
76787f70
MLI
2844/* Return true if OP can be inferred to be non-NULL after STMT executes,
2845 either by using a pointer dereference or attributes. */
2846bool
355fe088 2847infer_nonnull_range (gimple *stmt, tree op)
76787f70
MLI
2848{
2849 return infer_nonnull_range_by_dereference (stmt, op)
2850 || infer_nonnull_range_by_attribute (stmt, op);
2851}
8fdc414d 2852
76787f70
MLI
2853/* Return true if OP can be inferred to be non-NULL after STMT
2854 executes by using a pointer dereference. */
8fdc414d 2855bool
355fe088 2856infer_nonnull_range_by_dereference (gimple *stmt, tree op)
8fdc414d
JL
2857{
2858 /* We can only assume that a pointer dereference will yield
2859 non-NULL if -fdelete-null-pointer-checks is enabled. */
2860 if (!flag_delete_null_pointer_checks
2861 || !POINTER_TYPE_P (TREE_TYPE (op))
2862 || gimple_code (stmt) == GIMPLE_ASM)
2863 return false;
2864
76787f70
MLI
2865 if (walk_stmt_load_store_ops (stmt, (void *)op,
2866 check_loadstore, check_loadstore))
8fdc414d
JL
2867 return true;
2868
76787f70
MLI
2869 return false;
2870}
2871
2872/* Return true if OP can be inferred to be a non-NULL after STMT
2873 executes by using attributes. */
2874bool
355fe088 2875infer_nonnull_range_by_attribute (gimple *stmt, tree op)
76787f70
MLI
2876{
2877 /* We can only assume that a pointer dereference will yield
2878 non-NULL if -fdelete-null-pointer-checks is enabled. */
2879 if (!flag_delete_null_pointer_checks
2880 || !POINTER_TYPE_P (TREE_TYPE (op))
2881 || gimple_code (stmt) == GIMPLE_ASM)
2882 return false;
2883
2884 if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt))
8fdc414d
JL
2885 {
2886 tree fntype = gimple_call_fntype (stmt);
2887 tree attrs = TYPE_ATTRIBUTES (fntype);
2888 for (; attrs; attrs = TREE_CHAIN (attrs))
2889 {
2890 attrs = lookup_attribute ("nonnull", attrs);
2891
2892 /* If "nonnull" wasn't specified, we know nothing about
2893 the argument. */
2894 if (attrs == NULL_TREE)
2895 return false;
2896
2897 /* If "nonnull" applies to all the arguments, then ARG
2898 is non-null if it's in the argument list. */
2899 if (TREE_VALUE (attrs) == NULL_TREE)
2900 {
2901 for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++)
2902 {
36f291f7
PP
2903 if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i)))
2904 && operand_equal_p (op, gimple_call_arg (stmt, i), 0))
8fdc414d
JL
2905 return true;
2906 }
2907 return false;
2908 }
2909
2910 /* Now see if op appears in the nonnull list. */
2911 for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
2912 {
e37dcf45
MP
2913 unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
2914 if (idx < gimple_call_num_args (stmt))
2915 {
2916 tree arg = gimple_call_arg (stmt, idx);
2917 if (operand_equal_p (op, arg, 0))
2918 return true;
2919 }
8fdc414d
JL
2920 }
2921 }
2922 }
2923
2924 /* If this function is marked as returning non-null, then we can
2925 infer OP is non-null if it is used in the return statement. */
76787f70
MLI
2926 if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
2927 if (gimple_return_retval (return_stmt)
2928 && operand_equal_p (gimple_return_retval (return_stmt), op, 0)
2929 && lookup_attribute ("returns_nonnull",
2930 TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
2931 return true;
8fdc414d
JL
2932
2933 return false;
2934}
45b0be94
AM
2935
2936/* Compare two case labels. Because the front end should already have
2937 made sure that case ranges do not overlap, it is enough to only compare
2938 the CASE_LOW values of each case label. */
2939
2940static int
2941compare_case_labels (const void *p1, const void *p2)
2942{
2943 const_tree const case1 = *(const_tree const*)p1;
2944 const_tree const case2 = *(const_tree const*)p2;
2945
2946 /* The 'default' case label always goes first. */
2947 if (!CASE_LOW (case1))
2948 return -1;
2949 else if (!CASE_LOW (case2))
2950 return 1;
2951 else
2952 return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
2953}
2954
2955/* Sort the case labels in LABEL_VEC in place in ascending order. */
2956
2957void
2958sort_case_labels (vec<tree> label_vec)
2959{
2960 label_vec.qsort (compare_case_labels);
2961}
2962\f
2963/* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement.
2964
2965 LABELS is a vector that contains all case labels to look at.
2966
2967 INDEX_TYPE is the type of the switch index expression. Case labels
2968 in LABELS are discarded if their values are not in the value range
2969 covered by INDEX_TYPE. The remaining case label values are folded
2970 to INDEX_TYPE.
2971
2972 If a default case exists in LABELS, it is removed from LABELS and
2973 returned in DEFAULT_CASEP. If no default case exists, but the
2974 case labels already cover the whole range of INDEX_TYPE, a default
2975 case is returned pointing to one of the existing case labels.
2976 Otherwise DEFAULT_CASEP is set to NULL_TREE.
2977
2978 DEFAULT_CASEP may be NULL, in which case the above comment doesn't
2979 apply and no action is taken regardless of whether a default case is
2980 found or not. */
2981
2982void
2983preprocess_case_label_vec_for_gimple (vec<tree> labels,
2984 tree index_type,
2985 tree *default_casep)
2986{
2987 tree min_value, max_value;
2988 tree default_case = NULL_TREE;
2989 size_t i, len;
2990
2991 i = 0;
2992 min_value = TYPE_MIN_VALUE (index_type);
2993 max_value = TYPE_MAX_VALUE (index_type);
2994 while (i < labels.length ())
2995 {
2996 tree elt = labels[i];
2997 tree low = CASE_LOW (elt);
2998 tree high = CASE_HIGH (elt);
2999 bool remove_element = FALSE;
3000
3001 if (low)
3002 {
3003 gcc_checking_assert (TREE_CODE (low) == INTEGER_CST);
3004 gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST);
3005
3006 /* This is a non-default case label, i.e. it has a value.
3007
3008 See if the case label is reachable within the range of
3009 the index type. Remove out-of-range case values. Turn
3010 case ranges into a canonical form (high > low strictly)
3011 and convert the case label values to the index type.
3012
3013 NB: The type of gimple_switch_index() may be the promoted
3014 type, but the case labels retain the original type. */
3015
3016 if (high)
3017 {
3018 /* This is a case range. Discard empty ranges.
3019 If the bounds or the range are equal, turn this
3020 into a simple (one-value) case. */
3021 int cmp = tree_int_cst_compare (high, low);
3022 if (cmp < 0)
3023 remove_element = TRUE;
3024 else if (cmp == 0)
3025 high = NULL_TREE;
3026 }
3027
3028 if (! high)
3029 {
3030 /* If the simple case value is unreachable, ignore it. */
3031 if ((TREE_CODE (min_value) == INTEGER_CST
3032 && tree_int_cst_compare (low, min_value) < 0)
3033 || (TREE_CODE (max_value) == INTEGER_CST
3034 && tree_int_cst_compare (low, max_value) > 0))
3035 remove_element = TRUE;
3036 else
3037 low = fold_convert (index_type, low);
3038 }
3039 else
3040 {
3041 /* If the entire case range is unreachable, ignore it. */
3042 if ((TREE_CODE (min_value) == INTEGER_CST
3043 && tree_int_cst_compare (high, min_value) < 0)
3044 || (TREE_CODE (max_value) == INTEGER_CST
3045 && tree_int_cst_compare (low, max_value) > 0))
3046 remove_element = TRUE;
3047 else
3048 {
3049 /* If the lower bound is less than the index type's
3050 minimum value, truncate the range bounds. */
3051 if (TREE_CODE (min_value) == INTEGER_CST
3052 && tree_int_cst_compare (low, min_value) < 0)
3053 low = min_value;
3054 low = fold_convert (index_type, low);
3055
3056 /* If the upper bound is greater than the index type's
3057 maximum value, truncate the range bounds. */
3058 if (TREE_CODE (max_value) == INTEGER_CST
3059 && tree_int_cst_compare (high, max_value) > 0)
3060 high = max_value;
3061 high = fold_convert (index_type, high);
3062
3063 /* We may have folded a case range to a one-value case. */
3064 if (tree_int_cst_equal (low, high))
3065 high = NULL_TREE;
3066 }
3067 }
3068
3069 CASE_LOW (elt) = low;
3070 CASE_HIGH (elt) = high;
3071 }
3072 else
3073 {
3074 gcc_assert (!default_case);
3075 default_case = elt;
3076 /* The default case must be passed separately to the
3077 gimple_build_switch routine. But if DEFAULT_CASEP
3078 is NULL, we do not remove the default case (it would
3079 be completely lost). */
3080 if (default_casep)
3081 remove_element = TRUE;
3082 }
3083
3084 if (remove_element)
3085 labels.ordered_remove (i);
3086 else
3087 i++;
3088 }
3089 len = i;
3090
3091 if (!labels.is_empty ())
3092 sort_case_labels (labels);
3093
3094 if (default_casep && !default_case)
3095 {
3096 /* If the switch has no default label, add one, so that we jump
3097 around the switch body. If the labels already cover the whole
3098 range of the switch index_type, add the default label pointing
3099 to one of the existing labels. */
3100 if (len
3101 && TYPE_MIN_VALUE (index_type)
3102 && TYPE_MAX_VALUE (index_type)
3103 && tree_int_cst_equal (CASE_LOW (labels[0]),
3104 TYPE_MIN_VALUE (index_type)))
3105 {
3106 tree low, high = CASE_HIGH (labels[len - 1]);
3107 if (!high)
3108 high = CASE_LOW (labels[len - 1]);
3109 if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type)))
3110 {
938da3a5 3111 tree widest_label = labels[0];
45b0be94
AM
3112 for (i = 1; i < len; i++)
3113 {
3114 high = CASE_LOW (labels[i]);
3115 low = CASE_HIGH (labels[i - 1]);
3116 if (!low)
3117 low = CASE_LOW (labels[i - 1]);
938da3a5
PP
3118
3119 if (CASE_HIGH (labels[i]) != NULL_TREE
3120 && (CASE_HIGH (widest_label) == NULL_TREE
8e6cdc90
RS
3121 || (wi::gtu_p
3122 (wi::to_wide (CASE_HIGH (labels[i]))
3123 - wi::to_wide (CASE_LOW (labels[i])),
3124 wi::to_wide (CASE_HIGH (widest_label))
3125 - wi::to_wide (CASE_LOW (widest_label))))))
938da3a5
PP
3126 widest_label = labels[i];
3127
8e6cdc90 3128 if (wi::to_wide (low) + 1 != wi::to_wide (high))
45b0be94
AM
3129 break;
3130 }
3131 if (i == len)
3132 {
938da3a5
PP
3133 /* Designate the label with the widest range to be the
3134 default label. */
3135 tree label = CASE_LABEL (widest_label);
45b0be94
AM
3136 default_case = build_case_label (NULL_TREE, NULL_TREE,
3137 label);
3138 }
3139 }
3140 }
3141 }
3142
3143 if (default_casep)
3144 *default_casep = default_case;
3145}
5be5c238
AM
3146
3147/* Set the location of all statements in SEQ to LOC. */
3148
3149void
3150gimple_seq_set_location (gimple_seq seq, location_t loc)
3151{
3152 for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
3153 gimple_set_location (gsi_stmt (i), loc);
3154}
73049af5
JJ
3155
3156/* Release SSA_NAMEs in SEQ as well as the GIMPLE statements. */
3157
3158void
3159gimple_seq_discard (gimple_seq seq)
3160{
3161 gimple_stmt_iterator gsi;
3162
3163 for (gsi = gsi_start (seq); !gsi_end_p (gsi); )
3164 {
355fe088 3165 gimple *stmt = gsi_stmt (gsi);
73049af5
JJ
3166 gsi_remove (&gsi, true);
3167 release_defs (stmt);
3168 ggc_free (stmt);
3169 }
3170}
0b986c6a
JH
3171
3172/* See if STMT now calls function that takes no parameters and if so, drop
3173 call arguments. This is used when devirtualization machinery redirects
538374e1 3174 to __builtin_unreachable or __cxa_pure_virtual. */
0b986c6a
JH
3175
3176void
355fe088 3177maybe_remove_unused_call_args (struct function *fn, gimple *stmt)
0b986c6a
JH
3178{
3179 tree decl = gimple_call_fndecl (stmt);
3180 if (TYPE_ARG_TYPES (TREE_TYPE (decl))
3181 && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node
3182 && gimple_call_num_args (stmt))
3183 {
3184 gimple_set_num_ops (stmt, 3);
3185 update_stmt_fn (fn, stmt);
3186 }
3187}
d9b950dd 3188
ce120587
JH
3189/* Return false if STMT will likely expand to real function call. */
3190
3191bool
3192gimple_inexpensive_call_p (gcall *stmt)
3193{
3194 if (gimple_call_internal_p (stmt))
3195 return true;
3196 tree decl = gimple_call_fndecl (stmt);
3197 if (decl && is_inexpensive_builtin (decl))
3198 return true;
3199 return false;
3200}
3201
d9b950dd
DM
3202#if CHECKING_P
3203
3204namespace selftest {
3205
3206/* Selftests for core gimple structures. */
3207
3208/* Verify that STMT is pretty-printed as EXPECTED.
3209 Helper function for selftests. */
3210
3211static void
3212verify_gimple_pp (const char *expected, gimple *stmt)
3213{
3214 pretty_printer pp;
4af78ef8 3215 pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */);
d9b950dd
DM
3216 ASSERT_STREQ (expected, pp_formatted_text (&pp));
3217}
3218
3219/* Build a GIMPLE_ASSIGN equivalent to
3220 tmp = 5;
3221 and verify various properties of it. */
3222
3223static void
3224test_assign_single ()
3225{
3226 tree type = integer_type_node;
3227 tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3228 get_identifier ("tmp"),
3229 type);
3230 tree rhs = build_int_cst (type, 5);
3231 gassign *stmt = gimple_build_assign (lhs, rhs);
3232 verify_gimple_pp ("tmp = 5;", stmt);
3233
3234 ASSERT_TRUE (is_gimple_assign (stmt));
3235 ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
3236 ASSERT_EQ (lhs, gimple_get_lhs (stmt));
3237 ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt));
3238 ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt));
3239 ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
3240 ASSERT_TRUE (gimple_assign_single_p (stmt));
3241 ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt));
3242}
3243
3244/* Build a GIMPLE_ASSIGN equivalent to
3245 tmp = a * b;
3246 and verify various properties of it. */
3247
3248static void
3249test_assign_binop ()
3250{
3251 tree type = integer_type_node;
3252 tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3253 get_identifier ("tmp"),
3254 type);
3255 tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3256 get_identifier ("a"),
3257 type);
3258 tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL,
3259 get_identifier ("b"),
3260 type);
3261 gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b);
3262 verify_gimple_pp ("tmp = a * b;", stmt);
3263
3264 ASSERT_TRUE (is_gimple_assign (stmt));
3265 ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
3266 ASSERT_EQ (lhs, gimple_get_lhs (stmt));
3267 ASSERT_EQ (a, gimple_assign_rhs1 (stmt));
3268 ASSERT_EQ (b, gimple_assign_rhs2 (stmt));
3269 ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
3270 ASSERT_FALSE (gimple_assign_single_p (stmt));
3271 ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt));
3272}
3273
3274/* Build a GIMPLE_NOP and verify various properties of it. */
3275
3276static void
3277test_nop_stmt ()
3278{
3279 gimple *stmt = gimple_build_nop ();
3280 verify_gimple_pp ("GIMPLE_NOP", stmt);
3281 ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt));
3282 ASSERT_EQ (NULL, gimple_get_lhs (stmt));
3283 ASSERT_FALSE (gimple_assign_single_p (stmt));
3284}
3285
3286/* Build a GIMPLE_RETURN equivalent to
3287 return 7;
3288 and verify various properties of it. */
3289
3290static void
3291test_return_stmt ()
3292{
3293 tree type = integer_type_node;
3294 tree val = build_int_cst (type, 7);
3295 greturn *stmt = gimple_build_return (val);
3296 verify_gimple_pp ("return 7;", stmt);
3297
3298 ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
3299 ASSERT_EQ (NULL, gimple_get_lhs (stmt));
3300 ASSERT_EQ (val, gimple_return_retval (stmt));
3301 ASSERT_FALSE (gimple_assign_single_p (stmt));
3302}
3303
3304/* Build a GIMPLE_RETURN equivalent to
3305 return;
3306 and verify various properties of it. */
3307
3308static void
3309test_return_without_value ()
3310{
3311 greturn *stmt = gimple_build_return (NULL);
3312 verify_gimple_pp ("return;", stmt);
3313
3314 ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
3315 ASSERT_EQ (NULL, gimple_get_lhs (stmt));
3316 ASSERT_EQ (NULL, gimple_return_retval (stmt));
3317 ASSERT_FALSE (gimple_assign_single_p (stmt));
3318}
3319
3320/* Run all of the selftests within this file. */
3321
3322void
3323gimple_c_tests ()
3324{
3325 test_assign_single ();
3326 test_assign_binop ();
3327 test_nop_stmt ();
3328 test_return_stmt ();
3329 test_return_without_value ();
3330}
3331
3332} // namespace selftest
3333
3334
3335#endif /* CHECKING_P */
This page took 4.702368 seconds and 5 git commands to generate.