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