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