]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/gimple.h
Add AMD and Ulf Adams as external authors
[thirdparty/gcc.git] / gcc / gimple.h
CommitLineData
726a989a
RB
1/* Gimple IR definitions.
2
8d9254fc 3 Copyright (C) 2007-2020 Free Software Foundation, Inc.
726a989a
RB
4 Contributed by Aldy Hernandez <aldyh@redhat.com>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
21
22#ifndef GCC_GIMPLE_H
23#define GCC_GIMPLE_H
24
c7131fb2
AM
25#include "tree-ssa-alias.h"
26#include "gimple-expr.h"
27
355fe088 28typedef gimple *gimple_seq_node;
cde8534c 29
726a989a
RB
30enum gimple_code {
31#define DEFGSCODE(SYM, STRING, STRUCT) SYM,
32#include "gimple.def"
33#undef DEFGSCODE
34 LAST_AND_UNUSED_GIMPLE_CODE
35};
36
37extern const char *const gimple_code_name[];
38extern const unsigned char gimple_rhs_class_table[];
39
bde351d5
RB
40/* Strip the outermost pointer, from tr1/type_traits. */
41template<typename T> struct remove_pointer { typedef T type; };
42template<typename T> struct remove_pointer<T *> { typedef T type; };
43
726a989a
RB
44/* Error out if a gimple tuple is addressed incorrectly. */
45#if defined ENABLE_GIMPLE_CHECKING
2bc0a660 46#define gcc_gimple_checking_assert(EXPR) gcc_assert (EXPR)
355fe088 47extern void gimple_check_failed (const gimple *, const char *, int, \
726a989a 48 const char *, enum gimple_code, \
323eb089
JH
49 enum tree_code) ATTRIBUTE_NORETURN \
50 ATTRIBUTE_COLD;
726a989a
RB
51
52#define GIMPLE_CHECK(GS, CODE) \
53 do { \
355fe088 54 const gimple *__gs = (GS); \
726a989a
RB
55 if (gimple_code (__gs) != (CODE)) \
56 gimple_check_failed (__gs, __FILE__, __LINE__, __FUNCTION__, \
bbbbb16a 57 (CODE), ERROR_MARK); \
726a989a 58 } while (0)
bde351d5
RB
59template <typename T>
60static inline T
355fe088 61GIMPLE_CHECK2(const gimple *gs,
bde351d5
RB
62#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
63 const char *file = __builtin_FILE (),
64 int line = __builtin_LINE (),
65 const char *fun = __builtin_FUNCTION ())
66#else
67 const char *file = __FILE__,
68 int line = __LINE__,
69 const char *fun = NULL)
70#endif
71{
72 T ret = dyn_cast <T> (gs);
73 if (!ret)
74 gimple_check_failed (gs, file, line, fun,
75 remove_pointer<T>::type::code_, ERROR_MARK);
76 return ret;
77}
78template <typename T>
79static inline T
355fe088 80GIMPLE_CHECK2(gimple *gs,
bde351d5
RB
81#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
82 const char *file = __builtin_FILE (),
83 int line = __builtin_LINE (),
84 const char *fun = __builtin_FUNCTION ())
85#else
86 const char *file = __FILE__,
87 int line = __LINE__,
88 const char *fun = NULL)
89#endif
90{
91 T ret = dyn_cast <T> (gs);
92 if (!ret)
93 gimple_check_failed (gs, file, line, fun,
94 remove_pointer<T>::type::code_, ERROR_MARK);
95 return ret;
96}
726a989a 97#else /* not ENABLE_GIMPLE_CHECKING */
2bc0a660 98#define gcc_gimple_checking_assert(EXPR) ((void)(0 && (EXPR)))
726a989a 99#define GIMPLE_CHECK(GS, CODE) (void)0
bde351d5
RB
100template <typename T>
101static inline T
355fe088 102GIMPLE_CHECK2(gimple *gs)
bde351d5
RB
103{
104 return as_a <T> (gs);
105}
106template <typename T>
107static inline T
355fe088 108GIMPLE_CHECK2(const gimple *gs)
bde351d5
RB
109{
110 return as_a <T> (gs);
111}
726a989a
RB
112#endif
113
114/* Class of GIMPLE expressions suitable for the RHS of assignments. See
115 get_gimple_rhs_class. */
116enum gimple_rhs_class
117{
118 GIMPLE_INVALID_RHS, /* The expression cannot be used on the RHS. */
0354c0c7 119 GIMPLE_TERNARY_RHS, /* The expression is a ternary operation. */
726a989a
RB
120 GIMPLE_BINARY_RHS, /* The expression is a binary operation. */
121 GIMPLE_UNARY_RHS, /* The expression is a unary operation. */
122 GIMPLE_SINGLE_RHS /* The expression is a single object (an SSA
123 name, a _DECL, a _REF, etc. */
124};
125
126/* Specific flags for individual GIMPLE statements. These flags are
7b954766 127 always stored in gimple.subcode and they may only be
7d05cebb 128 defined for statement codes that do not use subcodes.
726a989a
RB
129
130 Values for the masks can overlap as long as the overlapping values
131 are never used in the same statement class.
132
133 The maximum mask value that can be defined is 1 << 15 (i.e., each
134 statement code can hold up to 16 bitflags).
135
136 Keep this list sorted. */
137enum gf_mask {
138 GF_ASM_INPUT = 1 << 0,
139 GF_ASM_VOLATILE = 1 << 1,
5b76e75f 140 GF_ASM_INLINE = 1 << 2,
89faf322
RG
141 GF_CALL_FROM_THUNK = 1 << 0,
142 GF_CALL_RETURN_SLOT_OPT = 1 << 1,
143 GF_CALL_TAILCALL = 1 << 2,
144 GF_CALL_VA_ARG_PACK = 1 << 3,
145 GF_CALL_NOTHROW = 1 << 4,
146 GF_CALL_ALLOCA_FOR_VAR = 1 << 5,
147 GF_CALL_INTERNAL = 1 << 6,
58041fe6 148 GF_CALL_CTRL_ALTERING = 1 << 7,
9a385c2d 149 GF_CALL_MUST_TAIL_CALL = 1 << 9,
4c640e26 150 GF_CALL_BY_DESCRIPTOR = 1 << 10,
5c5f0b65 151 GF_CALL_NOCF_CHECK = 1 << 11,
0b945f95 152 GF_CALL_FROM_NEW_OR_DELETE = 1 << 12,
726a989a 153 GF_OMP_PARALLEL_COMBINED = 1 << 0,
d9a6bd32 154 GF_OMP_TASK_TASKLOOP = 1 << 0,
28567c40 155 GF_OMP_TASK_TASKWAIT = 1 << 1,
dfa6e5b4 156 GF_OMP_FOR_KIND_MASK = (1 << 3) - 1,
eb63c927
TS
157 GF_OMP_FOR_KIND_FOR = 0,
158 GF_OMP_FOR_KIND_DISTRIBUTE = 1,
d9a6bd32 159 GF_OMP_FOR_KIND_TASKLOOP = 2,
d9a6bd32 160 GF_OMP_FOR_KIND_OACC_LOOP = 4,
c56684fd 161 GF_OMP_FOR_KIND_SIMD = 5,
dfa6e5b4
JJ
162 GF_OMP_FOR_COMBINED = 1 << 3,
163 GF_OMP_FOR_COMBINED_INTO = 1 << 4,
d9a6bd32 164 GF_OMP_TARGET_KIND_MASK = (1 << 4) - 1,
eb63c927
TS
165 GF_OMP_TARGET_KIND_REGION = 0,
166 GF_OMP_TARGET_KIND_DATA = 1,
167 GF_OMP_TARGET_KIND_UPDATE = 2,
d9a6bd32
JJ
168 GF_OMP_TARGET_KIND_ENTER_DATA = 3,
169 GF_OMP_TARGET_KIND_EXIT_DATA = 4,
170 GF_OMP_TARGET_KIND_OACC_PARALLEL = 5,
171 GF_OMP_TARGET_KIND_OACC_KERNELS = 6,
62aee289
MR
172 GF_OMP_TARGET_KIND_OACC_SERIAL = 7,
173 GF_OMP_TARGET_KIND_OACC_DATA = 8,
174 GF_OMP_TARGET_KIND_OACC_UPDATE = 9,
175 GF_OMP_TARGET_KIND_OACC_ENTER_EXIT_DATA = 10,
176 GF_OMP_TARGET_KIND_OACC_DECLARE = 11,
177 GF_OMP_TARGET_KIND_OACC_HOST_DATA = 12,
e898ce79
GB
178 /* A 'GF_OMP_TARGET_KIND_OACC_PARALLEL' representing an OpenACC 'kernels'
179 decomposed part, parallelized. */
180 GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_PARALLELIZED = 13,
181 /* A 'GF_OMP_TARGET_KIND_OACC_PARALLEL' representing an OpenACC 'kernels'
182 decomposed part, "gang-single". */
183 GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_GANG_SINGLE = 14,
184 /* A 'GF_OMP_TARGET_KIND_OACC_DATA' representing an OpenACC 'kernels'
185 decomposed parts' 'data' construct. */
186 GF_OMP_TARGET_KIND_OACC_DATA_KERNELS = 15,
c56684fd 187 GF_OMP_TEAMS_HOST = 1 << 0,
726a989a
RB
188
189 /* True on an GIMPLE_OMP_RETURN statement if the return does not require
190 a thread synchronization via some sort of barrier. The exact barrier
191 that would otherwise be emitted is dependent on the OMP statement with
192 which this return is associated. */
193 GF_OMP_RETURN_NOWAIT = 1 << 0,
194
195 GF_OMP_SECTION_LAST = 1 << 0,
28567c40
JJ
196 GF_OMP_ATOMIC_MEMORY_ORDER = (1 << 3) - 1,
197 GF_OMP_ATOMIC_NEED_VALUE = 1 << 3,
726a989a
RB
198 GF_PREDICT_TAKEN = 1 << 15
199};
200
36f52e8f
AO
201/* This subcode tells apart different kinds of stmts that are not used
202 for codegen, but rather to retain debug information. */
b5b8b0ac 203enum gimple_debug_subcode {
ddb555ed 204 GIMPLE_DEBUG_BIND = 0,
36f52e8f 205 GIMPLE_DEBUG_SOURCE_BIND = 1,
58006663
AO
206 GIMPLE_DEBUG_BEGIN_STMT = 2,
207 GIMPLE_DEBUG_INLINE_ENTRY = 3
b5b8b0ac
AO
208};
209
726a989a
RB
210/* Masks for selecting a pass local flag (PLF) to work on. These
211 masks are used by gimple_set_plf and gimple_plf. */
212enum plf_mask {
213 GF_PLF_1 = 1 << 0,
214 GF_PLF_2 = 1 << 1
215};
216
726a989a
RB
217/* Data structure definitions for GIMPLE tuples. NOTE: word markers
218 are for 64 bit hosts. */
219
daa6e488
DM
220struct GTY((desc ("gimple_statement_structure (&%h)"), tag ("GSS_BASE"),
221 chain_next ("%h.next"), variable_size))
355fe088 222 gimple
daa6e488 223{
726a989a
RB
224 /* [ WORD 1 ]
225 Main identifying code for a tuple. */
226 ENUM_BITFIELD(gimple_code) code : 8;
227
228 /* Nonzero if a warning should not be emitted on this tuple. */
229 unsigned int no_warning : 1;
230
231 /* Nonzero if this tuple has been visited. Passes are responsible
232 for clearing this bit before using it. */
233 unsigned int visited : 1;
234
235 /* Nonzero if this tuple represents a non-temporal move. */
236 unsigned int nontemporal_move : 1;
237
238 /* Pass local flags. These flags are free for any pass to use as
239 they see fit. Passes should not assume that these flags contain
240 any useful value when the pass starts. Any initial state that
241 the pass requires should be set on entry to the pass. See
242 gimple_set_plf and gimple_plf for usage. */
243 unsigned int plf : 2;
244
245 /* Nonzero if this statement has been modified and needs to have its
246 operands rescanned. */
247 unsigned modified : 1;
248
249 /* Nonzero if this statement contains volatile operands. */
250 unsigned has_volatile_ops : 1;
251
1503cb6b
RB
252 /* Padding to get subcode to 16 bit alignment. */
253 unsigned pad : 1;
254
726a989a
RB
255 /* The SUBCODE field can be used for tuple-specific flags for tuples
256 that do not require subcodes. Note that SUBCODE should be at
257 least as wide as tree codes, as several tuples store tree codes
258 in there. */
259 unsigned int subcode : 16;
260
e0e10d3a
DN
261 /* UID of this statement. This is used by passes that want to
262 assign IDs to statements. It must be assigned and used by each
263 pass. By default it should be assumed to contain garbage. */
726a989a
RB
264 unsigned uid;
265
266 /* [ WORD 2 ]
267 Locus information for debug info. */
268 location_t location;
269
270 /* Number of operands in this tuple. */
271 unsigned num_ops;
272
273 /* [ WORD 3 ]
274 Basic block holding this statement. */
b8244d74 275 basic_block bb;
726a989a 276
355a7673
MM
277 /* [ WORD 4-5 ]
278 Linked lists of gimple statements. The next pointers form
279 a NULL terminated list, the prev pointers are a cyclic list.
280 A gimple statement is hence also a double-ended list of
281 statements, with the pointer itself being the first element,
282 and the prev pointer being the last. */
355fe088
TS
283 gimple *next;
284 gimple *GTY((skip)) prev;
726a989a
RB
285};
286
287
288/* Base structure for tuples with operands. */
289
daa6e488
DM
290/* This gimple subclass has no tag value. */
291struct GTY(())
355fe088 292 gimple_statement_with_ops_base : public gimple
726a989a 293{
daa6e488 294 /* [ WORD 1-6 ] : base class */
726a989a 295
4b671e64 296 /* [ WORD 7 ]
726a989a
RB
297 SSA operand vectors. NOTE: It should be possible to
298 amalgamate these vectors with the operand vector OP. However,
299 the SSA operand vectors are organized differently and contain
300 more information (like immediate use chaining). */
726a989a
RB
301 struct use_optype_d GTY((skip (""))) *use_ops;
302};
303
304
305/* Statements that take register operands. */
306
daa6e488
DM
307struct GTY((tag("GSS_WITH_OPS")))
308 gimple_statement_with_ops : public gimple_statement_with_ops_base
726a989a 309{
daa6e488 310 /* [ WORD 1-7 ] : base class */
726a989a 311
4b671e64 312 /* [ WORD 8 ]
726a989a
RB
313 Operand vector. NOTE! This must always be the last field
314 of this structure. In particular, this means that this
315 structure cannot be embedded inside another one. */
daa6e488 316 tree GTY((length ("%h.num_ops"))) op[1];
726a989a
RB
317};
318
319
320/* Base for statements that take both memory and register operands. */
321
daa6e488
DM
322struct GTY((tag("GSS_WITH_MEM_OPS_BASE")))
323 gimple_statement_with_memory_ops_base : public gimple_statement_with_ops_base
726a989a 324{
daa6e488 325 /* [ WORD 1-7 ] : base class */
726a989a 326
4b671e64 327 /* [ WORD 8-9 ]
5006671f
RG
328 Virtual operands for this statement. The GC will pick them
329 up via the ssa_names array. */
330 tree GTY((skip (""))) vdef;
331 tree GTY((skip (""))) vuse;
726a989a
RB
332};
333
334
335/* Statements that take both memory and register operands. */
336
daa6e488
DM
337struct GTY((tag("GSS_WITH_MEM_OPS")))
338 gimple_statement_with_memory_ops :
339 public gimple_statement_with_memory_ops_base
726a989a 340{
daa6e488 341 /* [ WORD 1-9 ] : base class */
726a989a 342
4b671e64 343 /* [ WORD 10 ]
726a989a
RB
344 Operand vector. NOTE! This must always be the last field
345 of this structure. In particular, this means that this
346 structure cannot be embedded inside another one. */
daa6e488 347 tree GTY((length ("%h.num_ops"))) op[1];
726a989a
RB
348};
349
350
d086d311
RG
351/* Call statements that take both memory and register operands. */
352
daa6e488 353struct GTY((tag("GSS_CALL")))
538dd0b7 354 gcall : public gimple_statement_with_memory_ops_base
d086d311 355{
daa6e488 356 /* [ WORD 1-9 ] : base class */
d086d311 357
4b671e64 358 /* [ WORD 10-13 ] */
d086d311
RG
359 struct pt_solution call_used;
360 struct pt_solution call_clobbered;
361
4b671e64 362 /* [ WORD 14 ] */
daa6e488 363 union GTY ((desc ("%1.subcode & GF_CALL_INTERNAL"))) {
25583c4f
RS
364 tree GTY ((tag ("0"))) fntype;
365 enum internal_fn GTY ((tag ("GF_CALL_INTERNAL"))) internal_fn;
366 } u;
f20ca725 367
4b671e64 368 /* [ WORD 15 ]
d086d311
RG
369 Operand vector. NOTE! This must always be the last field
370 of this structure. In particular, this means that this
371 structure cannot be embedded inside another one. */
daa6e488 372 tree GTY((length ("%h.num_ops"))) op[1];
003b40ae
RB
373
374 static const enum gimple_code code_ = GIMPLE_CALL;
d086d311
RG
375};
376
377
41dbbb37 378/* OMP statements. */
726a989a 379
daa6e488 380struct GTY((tag("GSS_OMP")))
355fe088 381 gimple_statement_omp : public gimple
daa6e488
DM
382{
383 /* [ WORD 1-6 ] : base class */
726a989a 384
355a7673 385 /* [ WORD 7 ] */
726a989a
RB
386 gimple_seq body;
387};
388
389
390/* GIMPLE_BIND */
391
daa6e488 392struct GTY((tag("GSS_BIND")))
355fe088 393 gbind : public gimple
daa6e488
DM
394{
395 /* [ WORD 1-6 ] : base class */
726a989a 396
355a7673 397 /* [ WORD 7 ]
726a989a
RB
398 Variables declared in this scope. */
399 tree vars;
400
355a7673 401 /* [ WORD 8 ]
7b954766 402 This is different than the BLOCK field in gimple,
726a989a
RB
403 which is analogous to TREE_BLOCK (i.e., the lexical block holding
404 this statement). This field is the equivalent of BIND_EXPR_BLOCK
405 in tree land (i.e., the lexical scope defined by this bind). See
406 gimple-low.c. */
407 tree block;
408
355a7673 409 /* [ WORD 9 ] */
726a989a
RB
410 gimple_seq body;
411};
412
413
414/* GIMPLE_CATCH */
415
daa6e488 416struct GTY((tag("GSS_CATCH")))
355fe088 417 gcatch : public gimple
daa6e488
DM
418{
419 /* [ WORD 1-6 ] : base class */
726a989a 420
355a7673 421 /* [ WORD 7 ] */
726a989a
RB
422 tree types;
423
355a7673 424 /* [ WORD 8 ] */
726a989a
RB
425 gimple_seq handler;
426};
427
428
429/* GIMPLE_EH_FILTER */
430
daa6e488 431struct GTY((tag("GSS_EH_FILTER")))
355fe088 432 geh_filter : public gimple
daa6e488
DM
433{
434 /* [ WORD 1-6 ] : base class */
726a989a 435
355a7673 436 /* [ WORD 7 ]
726a989a
RB
437 Filter types. */
438 tree types;
439
355a7673 440 /* [ WORD 8 ]
726a989a
RB
441 Failure actions. */
442 gimple_seq failure;
443};
444
0a35513e
AH
445/* GIMPLE_EH_ELSE */
446
daa6e488 447struct GTY((tag("GSS_EH_ELSE")))
355fe088 448 geh_else : public gimple
daa6e488
DM
449{
450 /* [ WORD 1-6 ] : base class */
0a35513e 451
355a7673 452 /* [ WORD 7,8 ] */
0a35513e
AH
453 gimple_seq n_body, e_body;
454};
726a989a 455
1d65f45c
RH
456/* GIMPLE_EH_MUST_NOT_THROW */
457
daa6e488 458struct GTY((tag("GSS_EH_MNT")))
355fe088 459 geh_mnt : public gimple
daa6e488
DM
460{
461 /* [ WORD 1-6 ] : base class */
1d65f45c 462
355a7673 463 /* [ WORD 7 ] Abort function decl. */
1d65f45c
RH
464 tree fndecl;
465};
466
726a989a
RB
467/* GIMPLE_PHI */
468
daa6e488 469struct GTY((tag("GSS_PHI")))
355fe088 470 gphi : public gimple
daa6e488
DM
471{
472 /* [ WORD 1-6 ] : base class */
726a989a 473
355a7673 474 /* [ WORD 7 ] */
726a989a
RB
475 unsigned capacity;
476 unsigned nargs;
477
355a7673 478 /* [ WORD 8 ] */
726a989a
RB
479 tree result;
480
355a7673 481 /* [ WORD 9 ] */
726a989a
RB
482 struct phi_arg_d GTY ((length ("%h.nargs"))) args[1];
483};
484
485
1d65f45c 486/* GIMPLE_RESX, GIMPLE_EH_DISPATCH */
726a989a 487
daa6e488 488struct GTY((tag("GSS_EH_CTRL")))
355fe088 489 gimple_statement_eh_ctrl : public gimple
1d65f45c 490{
daa6e488 491 /* [ WORD 1-6 ] : base class */
726a989a 492
355a7673 493 /* [ WORD 7 ]
726a989a
RB
494 Exception region number. */
495 int region;
496};
497
9b95612e 498struct GTY((tag("GSS_EH_CTRL")))
538dd0b7 499 gresx : public gimple_statement_eh_ctrl
9b95612e
DM
500{
501 /* No extra fields; adds invariant:
502 stmt->code == GIMPLE_RESX. */
503};
504
505struct GTY((tag("GSS_EH_CTRL")))
538dd0b7 506 geh_dispatch : public gimple_statement_eh_ctrl
9b95612e
DM
507{
508 /* No extra fields; adds invariant:
509 stmt->code == GIMPLE_EH_DISPATH. */
510};
511
726a989a
RB
512
513/* GIMPLE_TRY */
514
daa6e488 515struct GTY((tag("GSS_TRY")))
355fe088 516 gtry : public gimple
daa6e488
DM
517{
518 /* [ WORD 1-6 ] : base class */
726a989a 519
355a7673 520 /* [ WORD 7 ]
726a989a
RB
521 Expression to evaluate. */
522 gimple_seq eval;
523
355a7673 524 /* [ WORD 8 ]
726a989a
RB
525 Cleanup expression. */
526 gimple_seq cleanup;
527};
528
529/* Kind of GIMPLE_TRY statements. */
530enum gimple_try_flags
531{
532 /* A try/catch. */
533 GIMPLE_TRY_CATCH = 1 << 0,
534
535 /* A try/finally. */
536 GIMPLE_TRY_FINALLY = 1 << 1,
537 GIMPLE_TRY_KIND = GIMPLE_TRY_CATCH | GIMPLE_TRY_FINALLY,
538
539 /* Analogous to TRY_CATCH_IS_CLEANUP. */
540 GIMPLE_TRY_CATCH_IS_CLEANUP = 1 << 2
541};
542
543/* GIMPLE_WITH_CLEANUP_EXPR */
544
daa6e488 545struct GTY((tag("GSS_WCE")))
355fe088 546 gimple_statement_wce : public gimple
daa6e488
DM
547{
548 /* [ WORD 1-6 ] : base class */
726a989a
RB
549
550 /* Subcode: CLEANUP_EH_ONLY. True if the cleanup should only be
551 executed if an exception is thrown, not on normal exit of its
552 scope. This flag is analogous to the CLEANUP_EH_ONLY flag
553 in TARGET_EXPRs. */
554
355a7673 555 /* [ WORD 7 ]
726a989a
RB
556 Cleanup expression. */
557 gimple_seq cleanup;
558};
559
560
561/* GIMPLE_ASM */
562
daa6e488 563struct GTY((tag("GSS_ASM")))
538dd0b7 564 gasm : public gimple_statement_with_memory_ops_base
726a989a 565{
daa6e488 566 /* [ WORD 1-9 ] : base class */
726a989a 567
4b671e64 568 /* [ WORD 10 ]
726a989a
RB
569 __asm__ statement. */
570 const char *string;
571
4b671e64 572 /* [ WORD 11 ]
1c384bf1 573 Number of inputs, outputs, clobbers, labels. */
726a989a
RB
574 unsigned char ni;
575 unsigned char no;
1c384bf1
RH
576 unsigned char nc;
577 unsigned char nl;
726a989a 578
4b671e64 579 /* [ WORD 12 ]
726a989a
RB
580 Operand vector. NOTE! This must always be the last field
581 of this structure. In particular, this means that this
582 structure cannot be embedded inside another one. */
daa6e488 583 tree GTY((length ("%h.num_ops"))) op[1];
726a989a
RB
584};
585
586/* GIMPLE_OMP_CRITICAL */
587
daa6e488 588struct GTY((tag("GSS_OMP_CRITICAL")))
538dd0b7 589 gomp_critical : public gimple_statement_omp
daa6e488
DM
590{
591 /* [ WORD 1-7 ] : base class */
726a989a 592
d9a6bd32
JJ
593 /* [ WORD 8 ] */
594 tree clauses;
595
596 /* [ WORD 9 ]
726a989a
RB
597 Critical section name. */
598 tree name;
599};
600
601
d1b38208 602struct GTY(()) gimple_omp_for_iter {
726a989a
RB
603 /* Condition code. */
604 enum tree_code cond;
605
606 /* Index variable. */
607 tree index;
b8698a0f 608
726a989a
RB
609 /* Initial value. */
610 tree initial;
611
612 /* Final value. */
613 tree final;
b8698a0f 614
726a989a
RB
615 /* Increment. */
616 tree incr;
617};
618
619/* GIMPLE_OMP_FOR */
620
daa6e488 621struct GTY((tag("GSS_OMP_FOR")))
538dd0b7 622 gomp_for : public gimple_statement_omp
daa6e488
DM
623{
624 /* [ WORD 1-7 ] : base class */
726a989a 625
355a7673 626 /* [ WORD 8 ] */
726a989a
RB
627 tree clauses;
628
355a7673 629 /* [ WORD 9 ]
726a989a
RB
630 Number of elements in iter array. */
631 size_t collapse;
632
355a7673 633 /* [ WORD 10 ] */
726a989a
RB
634 struct gimple_omp_for_iter * GTY((length ("%h.collapse"))) iter;
635
355a7673 636 /* [ WORD 11 ]
726a989a
RB
637 Pre-body evaluated before the loop body begins. */
638 gimple_seq pre_body;
639};
640
641
28567c40 642/* GIMPLE_OMP_PARALLEL, GIMPLE_OMP_TARGET, GIMPLE_OMP_TASK, GIMPLE_OMP_TEAMS */
41dbbb37 643
9b95612e
DM
644struct GTY((tag("GSS_OMP_PARALLEL_LAYOUT")))
645 gimple_statement_omp_parallel_layout : public gimple_statement_omp
daa6e488
DM
646{
647 /* [ WORD 1-7 ] : base class */
726a989a 648
355a7673 649 /* [ WORD 8 ]
726a989a
RB
650 Clauses. */
651 tree clauses;
652
355a7673 653 /* [ WORD 9 ]
726a989a
RB
654 Child function holding the body of the parallel region. */
655 tree child_fn;
656
355a7673 657 /* [ WORD 10 ]
726a989a
RB
658 Shared data argument. */
659 tree data_arg;
660};
661
9b95612e
DM
662/* GIMPLE_OMP_PARALLEL or GIMPLE_TASK */
663struct GTY((tag("GSS_OMP_PARALLEL_LAYOUT")))
664 gimple_statement_omp_taskreg : public gimple_statement_omp_parallel_layout
665{
666 /* No extra fields; adds invariant:
667 stmt->code == GIMPLE_OMP_PARALLEL
28567c40
JJ
668 || stmt->code == GIMPLE_OMP_TASK
669 || stmt->code == GIMPLE_OMP_TEAMS. */
9b95612e
DM
670};
671
9b95612e
DM
672/* GIMPLE_OMP_PARALLEL */
673struct GTY((tag("GSS_OMP_PARALLEL_LAYOUT")))
538dd0b7 674 gomp_parallel : public gimple_statement_omp_taskreg
9b95612e
DM
675{
676 /* No extra fields; adds invariant:
677 stmt->code == GIMPLE_OMP_PARALLEL. */
678};
679
41dbbb37 680/* GIMPLE_OMP_TARGET */
9b95612e 681struct GTY((tag("GSS_OMP_PARALLEL_LAYOUT")))
538dd0b7 682 gomp_target : public gimple_statement_omp_parallel_layout
9b95612e
DM
683{
684 /* No extra fields; adds invariant:
685 stmt->code == GIMPLE_OMP_TARGET. */
686};
726a989a
RB
687
688/* GIMPLE_OMP_TASK */
689
daa6e488 690struct GTY((tag("GSS_OMP_TASK")))
538dd0b7 691 gomp_task : public gimple_statement_omp_taskreg
daa6e488
DM
692{
693 /* [ WORD 1-10 ] : base class */
726a989a 694
355a7673 695 /* [ WORD 11 ]
726a989a
RB
696 Child function holding firstprivate initialization if needed. */
697 tree copy_fn;
698
355a7673 699 /* [ WORD 12-13 ]
726a989a
RB
700 Size and alignment in bytes of the argument data block. */
701 tree arg_size;
702 tree arg_align;
703};
704
705
706/* GIMPLE_OMP_SECTION */
707/* Uses struct gimple_statement_omp. */
708
709
710/* GIMPLE_OMP_SECTIONS */
711
daa6e488 712struct GTY((tag("GSS_OMP_SECTIONS")))
538dd0b7 713 gomp_sections : public gimple_statement_omp
daa6e488
DM
714{
715 /* [ WORD 1-7 ] : base class */
726a989a 716
355a7673 717 /* [ WORD 8 ] */
726a989a
RB
718 tree clauses;
719
355a7673 720 /* [ WORD 9 ]
726a989a
RB
721 The control variable used for deciding which of the sections to
722 execute. */
723 tree control;
724};
725
726/* GIMPLE_OMP_CONTINUE.
727
728 Note: This does not inherit from gimple_statement_omp, because we
729 do not need the body field. */
730
daa6e488 731struct GTY((tag("GSS_OMP_CONTINUE")))
355fe088 732 gomp_continue : public gimple
daa6e488
DM
733{
734 /* [ WORD 1-6 ] : base class */
726a989a 735
355a7673 736 /* [ WORD 7 ] */
726a989a
RB
737 tree control_def;
738
355a7673 739 /* [ WORD 8 ] */
726a989a
RB
740 tree control_use;
741};
742
bf38f7e9
JJ
743/* GIMPLE_OMP_SINGLE, GIMPLE_OMP_ORDERED, GIMPLE_OMP_TASKGROUP,
744 GIMPLE_OMP_SCAN. */
726a989a 745
9b95612e
DM
746struct GTY((tag("GSS_OMP_SINGLE_LAYOUT")))
747 gimple_statement_omp_single_layout : public gimple_statement_omp
daa6e488
DM
748{
749 /* [ WORD 1-7 ] : base class */
726a989a 750
b2b40051 751 /* [ WORD 8 ] */
726a989a
RB
752 tree clauses;
753};
754
9b95612e 755struct GTY((tag("GSS_OMP_SINGLE_LAYOUT")))
538dd0b7 756 gomp_single : public gimple_statement_omp_single_layout
9b95612e
DM
757{
758 /* No extra fields; adds invariant:
759 stmt->code == GIMPLE_OMP_SINGLE. */
760};
761
28567c40
JJ
762struct GTY((tag("GSS_OMP_PARALLEL_LAYOUT")))
763 gomp_teams : public gimple_statement_omp_taskreg
9b95612e
DM
764{
765 /* No extra fields; adds invariant:
766 stmt->code == GIMPLE_OMP_TEAMS. */
767};
768
d9a6bd32
JJ
769struct GTY((tag("GSS_OMP_SINGLE_LAYOUT")))
770 gomp_ordered : public gimple_statement_omp_single_layout
771{
772 /* No extra fields; adds invariant:
773 stmt->code == GIMPLE_OMP_ORDERED. */
774};
775
bf38f7e9
JJ
776struct GTY((tag("GSS_OMP_SINGLE_LAYOUT")))
777 gomp_scan : public gimple_statement_omp_single_layout
778{
779 /* No extra fields; adds invariant:
780 stmt->code == GIMPLE_OMP_SCAN. */
781};
782
726a989a 783
b8698a0f 784/* GIMPLE_OMP_ATOMIC_LOAD.
7b954766 785 Note: This is based on gimple, not g_s_omp, because g_s_omp
726a989a
RB
786 contains a sequence, which we don't need here. */
787
daa6e488 788struct GTY((tag("GSS_OMP_ATOMIC_LOAD")))
355fe088 789 gomp_atomic_load : public gimple
daa6e488
DM
790{
791 /* [ WORD 1-6 ] : base class */
726a989a 792
355a7673 793 /* [ WORD 7-8 ] */
726a989a
RB
794 tree rhs, lhs;
795};
796
797/* GIMPLE_OMP_ATOMIC_STORE.
798 See note on GIMPLE_OMP_ATOMIC_LOAD. */
799
9b95612e 800struct GTY((tag("GSS_OMP_ATOMIC_STORE_LAYOUT")))
355fe088 801 gimple_statement_omp_atomic_store_layout : public gimple
daa6e488
DM
802{
803 /* [ WORD 1-6 ] : base class */
726a989a 804
355a7673 805 /* [ WORD 7 ] */
726a989a
RB
806 tree val;
807};
808
9b95612e 809struct GTY((tag("GSS_OMP_ATOMIC_STORE_LAYOUT")))
538dd0b7 810 gomp_atomic_store :
9b95612e
DM
811 public gimple_statement_omp_atomic_store_layout
812{
813 /* No extra fields; adds invariant:
814 stmt->code == GIMPLE_OMP_ATOMIC_STORE. */
815};
816
817struct GTY((tag("GSS_OMP_ATOMIC_STORE_LAYOUT")))
818 gimple_statement_omp_return :
819 public gimple_statement_omp_atomic_store_layout
820{
821 /* No extra fields; adds invariant:
822 stmt->code == GIMPLE_OMP_RETURN. */
823};
824
0a35513e
AH
825/* GIMPLE_TRANSACTION. */
826
827/* Bits to be stored in the GIMPLE_TRANSACTION subcode. */
828
829/* The __transaction_atomic was declared [[outer]] or it is
830 __transaction_relaxed. */
831#define GTMA_IS_OUTER (1u << 0)
832#define GTMA_IS_RELAXED (1u << 1)
833#define GTMA_DECLARATION_MASK (GTMA_IS_OUTER | GTMA_IS_RELAXED)
834
835/* The transaction is seen to not have an abort. */
836#define GTMA_HAVE_ABORT (1u << 2)
837/* The transaction is seen to have loads or stores. */
838#define GTMA_HAVE_LOAD (1u << 3)
839#define GTMA_HAVE_STORE (1u << 4)
840/* The transaction MAY enter serial irrevocable mode in its dynamic scope. */
841#define GTMA_MAY_ENTER_IRREVOCABLE (1u << 5)
842/* The transaction WILL enter serial irrevocable mode.
843 An irrevocable block post-dominates the entire transaction, such
844 that all invocations of the transaction will go serial-irrevocable.
845 In such case, we don't bother instrumenting the transaction, and
846 tell the runtime that it should begin the transaction in
847 serial-irrevocable mode. */
848#define GTMA_DOES_GO_IRREVOCABLE (1u << 6)
b7a78683
AH
849/* The transaction contains no instrumentation code whatsover, most
850 likely because it is guaranteed to go irrevocable upon entry. */
851#define GTMA_HAS_NO_INSTRUMENTATION (1u << 7)
0a35513e 852
daa6e488 853struct GTY((tag("GSS_TRANSACTION")))
538dd0b7 854 gtransaction : public gimple_statement_with_memory_ops_base
0a35513e 855{
daa6e488 856 /* [ WORD 1-9 ] : base class */
0a35513e 857
4b671e64 858 /* [ WORD 10 ] */
0a35513e
AH
859 gimple_seq body;
860
7c11b0fe
RH
861 /* [ WORD 11-13 ] */
862 tree label_norm;
863 tree label_uninst;
864 tree label_over;
0a35513e
AH
865};
866
f2c4a81c 867#define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) SYM,
726a989a 868enum gimple_statement_structure_enum {
726a989a 869#include "gsstruct.def"
726a989a
RB
870 LAST_GSS_ENUM
871};
f2c4a81c 872#undef DEFGSSTRUCT
726a989a 873
538dd0b7
DM
874/* A statement with the invariant that
875 stmt->code == GIMPLE_COND
876 i.e. a conditional jump statement. */
877
878struct GTY((tag("GSS_WITH_OPS")))
879 gcond : public gimple_statement_with_ops
880{
881 /* no additional fields; this uses the layout for GSS_WITH_OPS. */
003b40ae 882 static const enum gimple_code code_ = GIMPLE_COND;
538dd0b7
DM
883};
884
885/* A statement with the invariant that
886 stmt->code == GIMPLE_DEBUG
887 i.e. a debug statement. */
888
889struct GTY((tag("GSS_WITH_OPS")))
890 gdebug : public gimple_statement_with_ops
891{
892 /* no additional fields; this uses the layout for GSS_WITH_OPS. */
893};
894
895/* A statement with the invariant that
896 stmt->code == GIMPLE_GOTO
897 i.e. a goto statement. */
898
899struct GTY((tag("GSS_WITH_OPS")))
900 ggoto : public gimple_statement_with_ops
901{
902 /* no additional fields; this uses the layout for GSS_WITH_OPS. */
903};
904
905/* A statement with the invariant that
906 stmt->code == GIMPLE_LABEL
907 i.e. a label statement. */
908
909struct GTY((tag("GSS_WITH_OPS")))
910 glabel : public gimple_statement_with_ops
911{
912 /* no additional fields; this uses the layout for GSS_WITH_OPS. */
913};
914
915/* A statement with the invariant that
916 stmt->code == GIMPLE_SWITCH
917 i.e. a switch statement. */
918
919struct GTY((tag("GSS_WITH_OPS")))
920 gswitch : public gimple_statement_with_ops
921{
922 /* no additional fields; this uses the layout for GSS_WITH_OPS. */
923};
924
925/* A statement with the invariant that
926 stmt->code == GIMPLE_ASSIGN
927 i.e. an assignment statement. */
928
929struct GTY((tag("GSS_WITH_MEM_OPS")))
930 gassign : public gimple_statement_with_memory_ops
931{
bde351d5 932 static const enum gimple_code code_ = GIMPLE_ASSIGN;
538dd0b7
DM
933 /* no additional fields; this uses the layout for GSS_WITH_MEM_OPS. */
934};
935
936/* A statement with the invariant that
937 stmt->code == GIMPLE_RETURN
938 i.e. a return statement. */
939
940struct GTY((tag("GSS_WITH_MEM_OPS")))
941 greturn : public gimple_statement_with_memory_ops
942{
943 /* no additional fields; this uses the layout for GSS_WITH_MEM_OPS. */
944};
945
daa6e488
DM
946template <>
947template <>
948inline bool
355fe088 949is_a_helper <gasm *>::test (gimple *gs)
daa6e488
DM
950{
951 return gs->code == GIMPLE_ASM;
952}
726a989a 953
daa6e488
DM
954template <>
955template <>
956inline bool
355fe088 957is_a_helper <gassign *>::test (gimple *gs)
538dd0b7
DM
958{
959 return gs->code == GIMPLE_ASSIGN;
960}
961
bde351d5
RB
962template <>
963template <>
964inline bool
355fe088 965is_a_helper <const gassign *>::test (const gimple *gs)
bde351d5
RB
966{
967 return gs->code == GIMPLE_ASSIGN;
968}
969
538dd0b7
DM
970template <>
971template <>
972inline bool
355fe088 973is_a_helper <gbind *>::test (gimple *gs)
daa6e488
DM
974{
975 return gs->code == GIMPLE_BIND;
976}
977
978template <>
979template <>
980inline bool
355fe088 981is_a_helper <gcall *>::test (gimple *gs)
daa6e488
DM
982{
983 return gs->code == GIMPLE_CALL;
984}
985
986template <>
987template <>
988inline bool
355fe088 989is_a_helper <gcatch *>::test (gimple *gs)
daa6e488
DM
990{
991 return gs->code == GIMPLE_CATCH;
992}
993
994template <>
995template <>
996inline bool
355fe088 997is_a_helper <gcond *>::test (gimple *gs)
538dd0b7
DM
998{
999 return gs->code == GIMPLE_COND;
1000}
1001
003b40ae
RB
1002template <>
1003template <>
1004inline bool
355fe088 1005is_a_helper <const gcond *>::test (const gimple *gs)
003b40ae
RB
1006{
1007 return gs->code == GIMPLE_COND;
1008}
1009
538dd0b7
DM
1010template <>
1011template <>
1012inline bool
355fe088 1013is_a_helper <gdebug *>::test (gimple *gs)
538dd0b7
DM
1014{
1015 return gs->code == GIMPLE_DEBUG;
1016}
1017
0e7b6a51
DM
1018template <>
1019template <>
1020inline bool
1021is_a_helper <const gdebug *>::test (const gimple *gs)
1022{
1023 return gs->code == GIMPLE_DEBUG;
1024}
1025
538dd0b7
DM
1026template <>
1027template <>
1028inline bool
355fe088 1029is_a_helper <ggoto *>::test (gimple *gs)
538dd0b7
DM
1030{
1031 return gs->code == GIMPLE_GOTO;
1032}
1033
0e7b6a51
DM
1034template <>
1035template <>
1036inline bool
1037is_a_helper <const ggoto *>::test (const gimple *gs)
1038{
1039 return gs->code == GIMPLE_GOTO;
1040}
1041
538dd0b7
DM
1042template <>
1043template <>
1044inline bool
355fe088 1045is_a_helper <glabel *>::test (gimple *gs)
538dd0b7
DM
1046{
1047 return gs->code == GIMPLE_LABEL;
1048}
1049
0e7b6a51
DM
1050template <>
1051template <>
1052inline bool
1053is_a_helper <const glabel *>::test (const gimple *gs)
1054{
1055 return gs->code == GIMPLE_LABEL;
1056}
1057
538dd0b7
DM
1058template <>
1059template <>
1060inline bool
355fe088 1061is_a_helper <gresx *>::test (gimple *gs)
daa6e488 1062{
9b95612e
DM
1063 return gs->code == GIMPLE_RESX;
1064}
1065
1066template <>
1067template <>
1068inline bool
355fe088 1069is_a_helper <geh_dispatch *>::test (gimple *gs)
9b95612e
DM
1070{
1071 return gs->code == GIMPLE_EH_DISPATCH;
daa6e488
DM
1072}
1073
1074template <>
1075template <>
1076inline bool
355fe088 1077is_a_helper <geh_else *>::test (gimple *gs)
daa6e488
DM
1078{
1079 return gs->code == GIMPLE_EH_ELSE;
1080}
1081
0e7b6a51
DM
1082template <>
1083template <>
1084inline bool
1085is_a_helper <const geh_else *>::test (const gimple *gs)
1086{
1087 return gs->code == GIMPLE_EH_ELSE;
1088}
1089
daa6e488
DM
1090template <>
1091template <>
1092inline bool
355fe088 1093is_a_helper <geh_filter *>::test (gimple *gs)
daa6e488
DM
1094{
1095 return gs->code == GIMPLE_EH_FILTER;
1096}
1097
1098template <>
1099template <>
1100inline bool
355fe088 1101is_a_helper <geh_mnt *>::test (gimple *gs)
daa6e488
DM
1102{
1103 return gs->code == GIMPLE_EH_MUST_NOT_THROW;
1104}
1105
0e7b6a51
DM
1106template <>
1107template <>
1108inline bool
1109is_a_helper <const geh_mnt *>::test (const gimple *gs)
1110{
1111 return gs->code == GIMPLE_EH_MUST_NOT_THROW;
1112}
1113
daa6e488
DM
1114template <>
1115template <>
1116inline bool
355fe088 1117is_a_helper <gomp_atomic_load *>::test (gimple *gs)
daa6e488
DM
1118{
1119 return gs->code == GIMPLE_OMP_ATOMIC_LOAD;
1120}
1121
1122template <>
1123template <>
1124inline bool
355fe088 1125is_a_helper <gomp_atomic_store *>::test (gimple *gs)
daa6e488 1126{
9b95612e
DM
1127 return gs->code == GIMPLE_OMP_ATOMIC_STORE;
1128}
1129
1130template <>
1131template <>
1132inline bool
355fe088 1133is_a_helper <gimple_statement_omp_return *>::test (gimple *gs)
9b95612e
DM
1134{
1135 return gs->code == GIMPLE_OMP_RETURN;
daa6e488
DM
1136}
1137
1138template <>
1139template <>
1140inline bool
355fe088 1141is_a_helper <gomp_continue *>::test (gimple *gs)
daa6e488
DM
1142{
1143 return gs->code == GIMPLE_OMP_CONTINUE;
1144}
1145
1146template <>
1147template <>
1148inline bool
355fe088 1149is_a_helper <gomp_critical *>::test (gimple *gs)
daa6e488
DM
1150{
1151 return gs->code == GIMPLE_OMP_CRITICAL;
1152}
1153
d9a6bd32
JJ
1154template <>
1155template <>
1156inline bool
1157is_a_helper <gomp_ordered *>::test (gimple *gs)
1158{
1159 return gs->code == GIMPLE_OMP_ORDERED;
1160}
1161
bf38f7e9
JJ
1162template <>
1163template <>
1164inline bool
1165is_a_helper <gomp_scan *>::test (gimple *gs)
1166{
1167 return gs->code == GIMPLE_OMP_SCAN;
1168}
1169
daa6e488
DM
1170template <>
1171template <>
1172inline bool
355fe088 1173is_a_helper <gomp_for *>::test (gimple *gs)
daa6e488
DM
1174{
1175 return gs->code == GIMPLE_OMP_FOR;
1176}
1177
9b95612e
DM
1178template <>
1179template <>
1180inline bool
355fe088 1181is_a_helper <gimple_statement_omp_taskreg *>::test (gimple *gs)
9b95612e 1182{
28567c40
JJ
1183 return (gs->code == GIMPLE_OMP_PARALLEL
1184 || gs->code == GIMPLE_OMP_TASK
1185 || gs->code == GIMPLE_OMP_TEAMS);
9b95612e
DM
1186}
1187
daa6e488
DM
1188template <>
1189template <>
1190inline bool
355fe088 1191is_a_helper <gomp_parallel *>::test (gimple *gs)
daa6e488 1192{
9b95612e
DM
1193 return gs->code == GIMPLE_OMP_PARALLEL;
1194}
1195
1196template <>
1197template <>
1198inline bool
355fe088 1199is_a_helper <gomp_target *>::test (gimple *gs)
9b95612e
DM
1200{
1201 return gs->code == GIMPLE_OMP_TARGET;
daa6e488
DM
1202}
1203
1204template <>
1205template <>
1206inline bool
355fe088 1207is_a_helper <gomp_sections *>::test (gimple *gs)
daa6e488
DM
1208{
1209 return gs->code == GIMPLE_OMP_SECTIONS;
1210}
1211
1212template <>
1213template <>
1214inline bool
355fe088 1215is_a_helper <gomp_single *>::test (gimple *gs)
daa6e488 1216{
9b95612e
DM
1217 return gs->code == GIMPLE_OMP_SINGLE;
1218}
1219
1220template <>
1221template <>
1222inline bool
355fe088 1223is_a_helper <gomp_teams *>::test (gimple *gs)
9b95612e
DM
1224{
1225 return gs->code == GIMPLE_OMP_TEAMS;
daa6e488
DM
1226}
1227
1228template <>
1229template <>
1230inline bool
355fe088 1231is_a_helper <gomp_task *>::test (gimple *gs)
daa6e488
DM
1232{
1233 return gs->code == GIMPLE_OMP_TASK;
1234}
1235
1236template <>
1237template <>
1238inline bool
355fe088 1239is_a_helper <gphi *>::test (gimple *gs)
daa6e488
DM
1240{
1241 return gs->code == GIMPLE_PHI;
1242}
1243
1244template <>
1245template <>
1246inline bool
355fe088 1247is_a_helper <greturn *>::test (gimple *gs)
538dd0b7
DM
1248{
1249 return gs->code == GIMPLE_RETURN;
1250}
1251
1252template <>
1253template <>
1254inline bool
355fe088 1255is_a_helper <gswitch *>::test (gimple *gs)
538dd0b7
DM
1256{
1257 return gs->code == GIMPLE_SWITCH;
1258}
1259
0e7b6a51
DM
1260template <>
1261template <>
1262inline bool
1263is_a_helper <const gswitch *>::test (const gimple *gs)
1264{
1265 return gs->code == GIMPLE_SWITCH;
1266}
1267
538dd0b7
DM
1268template <>
1269template <>
1270inline bool
355fe088 1271is_a_helper <gtransaction *>::test (gimple *gs)
daa6e488
DM
1272{
1273 return gs->code == GIMPLE_TRANSACTION;
1274}
1275
1276template <>
1277template <>
1278inline bool
355fe088 1279is_a_helper <gtry *>::test (gimple *gs)
daa6e488
DM
1280{
1281 return gs->code == GIMPLE_TRY;
1282}
1283
0e7b6a51
DM
1284template <>
1285template <>
1286inline bool
1287is_a_helper <const gtry *>::test (const gimple *gs)
1288{
1289 return gs->code == GIMPLE_TRY;
1290}
1291
daa6e488
DM
1292template <>
1293template <>
1294inline bool
355fe088 1295is_a_helper <gimple_statement_wce *>::test (gimple *gs)
daa6e488
DM
1296{
1297 return gs->code == GIMPLE_WITH_CLEANUP_EXPR;
1298}
1299
1300template <>
1301template <>
1302inline bool
355fe088 1303is_a_helper <const gasm *>::test (const gimple *gs)
daa6e488
DM
1304{
1305 return gs->code == GIMPLE_ASM;
1306}
1307
1308template <>
1309template <>
1310inline bool
355fe088 1311is_a_helper <const gbind *>::test (const gimple *gs)
daa6e488
DM
1312{
1313 return gs->code == GIMPLE_BIND;
1314}
1315
1316template <>
1317template <>
1318inline bool
355fe088 1319is_a_helper <const gcall *>::test (const gimple *gs)
daa6e488
DM
1320{
1321 return gs->code == GIMPLE_CALL;
1322}
1323
1324template <>
1325template <>
1326inline bool
355fe088 1327is_a_helper <const gcatch *>::test (const gimple *gs)
daa6e488
DM
1328{
1329 return gs->code == GIMPLE_CATCH;
1330}
1331
1332template <>
1333template <>
1334inline bool
355fe088 1335is_a_helper <const gresx *>::test (const gimple *gs)
9b95612e
DM
1336{
1337 return gs->code == GIMPLE_RESX;
1338}
1339
1340template <>
1341template <>
1342inline bool
355fe088 1343is_a_helper <const geh_dispatch *>::test (const gimple *gs)
daa6e488 1344{
9b95612e 1345 return gs->code == GIMPLE_EH_DISPATCH;
daa6e488
DM
1346}
1347
1348template <>
1349template <>
1350inline bool
355fe088 1351is_a_helper <const geh_filter *>::test (const gimple *gs)
daa6e488
DM
1352{
1353 return gs->code == GIMPLE_EH_FILTER;
1354}
1355
1356template <>
1357template <>
1358inline bool
355fe088 1359is_a_helper <const gomp_atomic_load *>::test (const gimple *gs)
daa6e488
DM
1360{
1361 return gs->code == GIMPLE_OMP_ATOMIC_LOAD;
1362}
1363
1364template <>
1365template <>
1366inline bool
355fe088 1367is_a_helper <const gomp_atomic_store *>::test (const gimple *gs)
daa6e488 1368{
9b95612e
DM
1369 return gs->code == GIMPLE_OMP_ATOMIC_STORE;
1370}
1371
1372template <>
1373template <>
1374inline bool
355fe088 1375is_a_helper <const gimple_statement_omp_return *>::test (const gimple *gs)
9b95612e
DM
1376{
1377 return gs->code == GIMPLE_OMP_RETURN;
daa6e488
DM
1378}
1379
1380template <>
1381template <>
1382inline bool
355fe088 1383is_a_helper <const gomp_continue *>::test (const gimple *gs)
daa6e488
DM
1384{
1385 return gs->code == GIMPLE_OMP_CONTINUE;
1386}
1387
1388template <>
1389template <>
1390inline bool
355fe088 1391is_a_helper <const gomp_critical *>::test (const gimple *gs)
daa6e488
DM
1392{
1393 return gs->code == GIMPLE_OMP_CRITICAL;
1394}
1395
d9a6bd32
JJ
1396template <>
1397template <>
1398inline bool
1399is_a_helper <const gomp_ordered *>::test (const gimple *gs)
1400{
1401 return gs->code == GIMPLE_OMP_ORDERED;
1402}
1403
bf38f7e9
JJ
1404template <>
1405template <>
1406inline bool
1407is_a_helper <const gomp_scan *>::test (const gimple *gs)
1408{
1409 return gs->code == GIMPLE_OMP_SCAN;
1410}
1411
daa6e488
DM
1412template <>
1413template <>
1414inline bool
355fe088 1415is_a_helper <const gomp_for *>::test (const gimple *gs)
daa6e488
DM
1416{
1417 return gs->code == GIMPLE_OMP_FOR;
1418}
1419
9b95612e
DM
1420template <>
1421template <>
1422inline bool
355fe088 1423is_a_helper <const gimple_statement_omp_taskreg *>::test (const gimple *gs)
9b95612e 1424{
28567c40
JJ
1425 return (gs->code == GIMPLE_OMP_PARALLEL
1426 || gs->code == GIMPLE_OMP_TASK
1427 || gs->code == GIMPLE_OMP_TEAMS);
9b95612e
DM
1428}
1429
daa6e488
DM
1430template <>
1431template <>
1432inline bool
355fe088 1433is_a_helper <const gomp_parallel *>::test (const gimple *gs)
daa6e488 1434{
9b95612e
DM
1435 return gs->code == GIMPLE_OMP_PARALLEL;
1436}
1437
1438template <>
1439template <>
1440inline bool
355fe088 1441is_a_helper <const gomp_target *>::test (const gimple *gs)
9b95612e
DM
1442{
1443 return gs->code == GIMPLE_OMP_TARGET;
daa6e488
DM
1444}
1445
1446template <>
1447template <>
1448inline bool
355fe088 1449is_a_helper <const gomp_sections *>::test (const gimple *gs)
daa6e488
DM
1450{
1451 return gs->code == GIMPLE_OMP_SECTIONS;
1452}
1453
1454template <>
1455template <>
1456inline bool
355fe088 1457is_a_helper <const gomp_single *>::test (const gimple *gs)
daa6e488 1458{
9b95612e
DM
1459 return gs->code == GIMPLE_OMP_SINGLE;
1460}
1461
1462template <>
1463template <>
1464inline bool
355fe088 1465is_a_helper <const gomp_teams *>::test (const gimple *gs)
9b95612e
DM
1466{
1467 return gs->code == GIMPLE_OMP_TEAMS;
daa6e488
DM
1468}
1469
1470template <>
1471template <>
1472inline bool
355fe088 1473is_a_helper <const gomp_task *>::test (const gimple *gs)
daa6e488
DM
1474{
1475 return gs->code == GIMPLE_OMP_TASK;
1476}
1477
1478template <>
1479template <>
1480inline bool
355fe088 1481is_a_helper <const gphi *>::test (const gimple *gs)
daa6e488
DM
1482{
1483 return gs->code == GIMPLE_PHI;
1484}
1485
0e7b6a51
DM
1486template <>
1487template <>
1488inline bool
1489is_a_helper <const greturn *>::test (const gimple *gs)
1490{
1491 return gs->code == GIMPLE_RETURN;
1492}
1493
daa6e488
DM
1494template <>
1495template <>
1496inline bool
355fe088 1497is_a_helper <const gtransaction *>::test (const gimple *gs)
daa6e488
DM
1498{
1499 return gs->code == GIMPLE_TRANSACTION;
1500}
726a989a 1501
f2c4a81c
RH
1502/* Offset in bytes to the location of the operand vector.
1503 Zero if there is no operand vector for this tuple structure. */
1504extern size_t const gimple_ops_offset_[];
1505
1506/* Map GIMPLE codes to GSS codes. */
1507extern enum gimple_statement_structure_enum const gss_for_code_[];
1508
a5883ba0
MM
1509/* This variable holds the currently expanded gimple statement for purposes
1510 of comminucating the profile info to the builtin expanders. */
355fe088 1511extern gimple *currently_expanding_gimple_stmt;
a5883ba0 1512
5f487a34
LJH
1513size_t gimple_size (enum gimple_code code, unsigned num_ops = 0);
1514void gimple_init (gimple *g, enum gimple_code code, unsigned num_ops);
9e2d7f46 1515gimple *gimple_alloc (enum gimple_code, unsigned CXX_MEM_STAT_INFO);
538dd0b7
DM
1516greturn *gimple_build_return (tree);
1517void gimple_call_reset_alias_info (gcall *);
1518gcall *gimple_build_call_vec (tree, vec<tree> );
1519gcall *gimple_build_call (tree, unsigned, ...);
1520gcall *gimple_build_call_valist (tree, unsigned, va_list);
1521gcall *gimple_build_call_internal (enum internal_fn, unsigned, ...);
1522gcall *gimple_build_call_internal_vec (enum internal_fn, vec<tree> );
5c5f0b65 1523gcall *gimple_build_call_from_tree (tree, tree);
5c925255 1524gassign *gimple_build_assign (tree, tree CXX_MEM_STAT_INFO);
0d0e4a03
JJ
1525gassign *gimple_build_assign (tree, enum tree_code,
1526 tree, tree, tree CXX_MEM_STAT_INFO);
1527gassign *gimple_build_assign (tree, enum tree_code,
1528 tree, tree CXX_MEM_STAT_INFO);
1529gassign *gimple_build_assign (tree, enum tree_code, tree CXX_MEM_STAT_INFO);
538dd0b7
DM
1530gcond *gimple_build_cond (enum tree_code, tree, tree, tree, tree);
1531gcond *gimple_build_cond_from_tree (tree, tree, tree);
1532void gimple_cond_set_condition_from_tree (gcond *, tree);
1533glabel *gimple_build_label (tree label);
1534ggoto *gimple_build_goto (tree dest);
355fe088 1535gimple *gimple_build_nop (void);
538dd0b7
DM
1536gbind *gimple_build_bind (tree, gimple_seq, tree);
1537gasm *gimple_build_asm_vec (const char *, vec<tree, va_gc> *,
1538 vec<tree, va_gc> *, vec<tree, va_gc> *,
1539 vec<tree, va_gc> *);
1540gcatch *gimple_build_catch (tree, gimple_seq);
1541geh_filter *gimple_build_eh_filter (tree, gimple_seq);
1542geh_mnt *gimple_build_eh_must_not_throw (tree);
1543geh_else *gimple_build_eh_else (gimple_seq, gimple_seq);
1544gtry *gimple_build_try (gimple_seq, gimple_seq,
daa6e488 1545 enum gimple_try_flags);
355fe088 1546gimple *gimple_build_wce (gimple_seq);
538dd0b7
DM
1547gresx *gimple_build_resx (int);
1548gswitch *gimple_build_switch_nlabels (unsigned, tree, tree);
1549gswitch *gimple_build_switch (tree, tree, vec<tree> );
1550geh_dispatch *gimple_build_eh_dispatch (int);
59cdeebc
TS
1551gdebug *gimple_build_debug_bind (tree, tree, gimple * CXX_MEM_STAT_INFO);
1552gdebug *gimple_build_debug_source_bind (tree, tree, gimple * CXX_MEM_STAT_INFO);
96a95ac1 1553gdebug *gimple_build_debug_begin_stmt (tree, location_t CXX_MEM_STAT_INFO);
58006663 1554gdebug *gimple_build_debug_inline_entry (tree, location_t CXX_MEM_STAT_INFO);
d9a6bd32 1555gomp_critical *gimple_build_omp_critical (gimple_seq, tree, tree);
538dd0b7
DM
1556gomp_for *gimple_build_omp_for (gimple_seq, int, tree, size_t, gimple_seq);
1557gomp_parallel *gimple_build_omp_parallel (gimple_seq, tree, tree, tree);
1558gomp_task *gimple_build_omp_task (gimple_seq, tree, tree, tree, tree,
1559 tree, tree);
355fe088
TS
1560gimple *gimple_build_omp_section (gimple_seq);
1561gimple *gimple_build_omp_master (gimple_seq);
28567c40 1562gimple *gimple_build_omp_taskgroup (gimple_seq, tree);
538dd0b7 1563gomp_continue *gimple_build_omp_continue (tree, tree);
d9a6bd32 1564gomp_ordered *gimple_build_omp_ordered (gimple_seq, tree);
355fe088 1565gimple *gimple_build_omp_return (bool);
bf38f7e9 1566gomp_scan *gimple_build_omp_scan (gimple_seq, tree);
538dd0b7 1567gomp_sections *gimple_build_omp_sections (gimple_seq, tree);
355fe088 1568gimple *gimple_build_omp_sections_switch (void);
538dd0b7
DM
1569gomp_single *gimple_build_omp_single (gimple_seq, tree);
1570gomp_target *gimple_build_omp_target (gimple_seq, int, tree);
1571gomp_teams *gimple_build_omp_teams (gimple_seq, tree);
28567c40
JJ
1572gomp_atomic_load *gimple_build_omp_atomic_load (tree, tree,
1573 enum omp_memory_order);
1574gomp_atomic_store *gimple_build_omp_atomic_store (tree, enum omp_memory_order);
7c11b0fe 1575gtransaction *gimple_build_transaction (gimple_seq);
355fe088
TS
1576extern void gimple_seq_add_stmt (gimple_seq *, gimple *);
1577extern void gimple_seq_add_stmt_without_update (gimple_seq *, gimple *);
726a989a 1578void gimple_seq_add_seq (gimple_seq *, gimple_seq);
fef5a0d9 1579void gimple_seq_add_seq_without_update (gimple_seq *, gimple_seq);
1fe37220
AM
1580extern void annotate_all_with_location_after (gimple_seq, gimple_stmt_iterator,
1581 location_t);
1582extern void annotate_all_with_location (gimple_seq, location_t);
1583bool empty_body_p (gimple_seq);
726a989a 1584gimple_seq gimple_seq_copy (gimple_seq);
355fe088
TS
1585bool gimple_call_same_target_p (const gimple *, const gimple *);
1586int gimple_call_flags (const gimple *);
538dd0b7
DM
1587int gimple_call_arg_flags (const gcall *, unsigned);
1588int gimple_call_return_flags (const gcall *);
288aaa5f
AH
1589bool gimple_call_nonnull_result_p (gcall *);
1590tree gimple_call_nonnull_arg (gcall *);
355fe088
TS
1591bool gimple_assign_copy_p (gimple *);
1592bool gimple_assign_ssa_name_copy_p (gimple *);
1593bool gimple_assign_unary_nop_p (gimple *);
1594void gimple_set_bb (gimple *, basic_block);
726a989a 1595void gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *, tree);
00d66391
JJ
1596void gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *, enum tree_code,
1597 tree, tree, tree);
355fe088
TS
1598tree gimple_get_lhs (const gimple *);
1599void gimple_set_lhs (gimple *, tree);
1600gimple *gimple_copy (gimple *);
779724a5 1601void gimple_move_vops (gimple *, gimple *);
355fe088
TS
1602bool gimple_has_side_effects (const gimple *);
1603bool gimple_could_trap_p_1 (gimple *, bool, bool);
1604bool gimple_could_trap_p (gimple *);
1605bool gimple_assign_rhs_could_trap_p (gimple *);
1fe37220 1606extern void dump_gimple_statistics (void);
726a989a 1607unsigned get_gimple_rhs_num_ops (enum tree_code);
1fe37220 1608extern tree canonicalize_cond_expr_cond (tree);
538dd0b7 1609gcall *gimple_call_copy_skip_args (gcall *, bitmap);
d025732d 1610extern bool gimple_compare_field_offset (tree, tree);
d7f09764
DN
1611extern tree gimple_unsigned_type (tree);
1612extern tree gimple_signed_type (tree);
1613extern alias_set_type gimple_get_alias_set (tree);
355fe088
TS
1614extern bool gimple_ior_addresses_taken (bitmap, gimple *);
1615extern bool gimple_builtin_call_types_compatible_p (const gimple *, tree);
00175cb2 1616extern combined_fn gimple_call_combined_fn (const gimple *);
4f4ced28 1617extern bool gimple_call_operator_delete_p (const gcall *);
355fe088
TS
1618extern bool gimple_call_builtin_p (const gimple *);
1619extern bool gimple_call_builtin_p (const gimple *, enum built_in_class);
1620extern bool gimple_call_builtin_p (const gimple *, enum built_in_function);
538dd0b7 1621extern bool gimple_asm_clobbers_memory_p (const gasm *);
1fe37220 1622extern void dump_decl_set (FILE *, bitmap);
355fe088 1623extern bool nonfreeing_call_p (gimple *);
c000cd7c 1624extern bool nonbarrier_call_p (gimple *);
355fe088
TS
1625extern bool infer_nonnull_range (gimple *, tree);
1626extern bool infer_nonnull_range_by_dereference (gimple *, tree);
1627extern bool infer_nonnull_range_by_attribute (gimple *, tree);
73049af5
JJ
1628extern void sort_case_labels (vec<tree>);
1629extern void preprocess_case_label_vec_for_gimple (vec<tree>, tree, tree *);
1630extern void gimple_seq_set_location (gimple_seq, location_t);
1631extern void gimple_seq_discard (gimple_seq);
355fe088 1632extern void maybe_remove_unused_call_args (struct function *, gimple *);
ce120587 1633extern bool gimple_inexpensive_call_p (gcall *);
21bcd7be 1634extern bool stmt_can_terminate_bb_p (gimple *);
55ace4d1
JL
1635extern location_t gimple_or_expr_nonartificial_location (gimple *, tree);
1636
726a989a 1637
4a8fb1a1
LC
1638/* Formal (expression) temporary table handling: multiple occurrences of
1639 the same scalar expression are evaluated into the same temporary. */
1640
1641typedef struct gimple_temp_hash_elt
1642{
1643 tree val; /* Key */
1644 tree temp; /* Value */
1645} elt_t;
1646
cc524fc7
AM
1647/* Get the number of the next statement uid to be allocated. */
1648static inline unsigned int
1649gimple_stmt_max_uid (struct function *fn)
1650{
1651 return fn->last_stmt_uid;
1652}
1653
1654/* Set the number of the next statement uid to be allocated. */
1655static inline void
1656set_gimple_stmt_max_uid (struct function *fn, unsigned int maxid)
1657{
1658 fn->last_stmt_uid = maxid;
1659}
1660
1661/* Set the number of the next statement uid to be allocated. */
1662static inline unsigned int
1663inc_gimple_stmt_max_uid (struct function *fn)
1664{
1665 return fn->last_stmt_uid++;
1666}
1667
355a7673
MM
1668/* Return the first node in GIMPLE sequence S. */
1669
1670static inline gimple_seq_node
3e8b732e 1671gimple_seq_first (gimple_seq s)
355a7673
MM
1672{
1673 return s;
1674}
1675
1676
1677/* Return the first statement in GIMPLE sequence S. */
1678
355fe088 1679static inline gimple *
3e8b732e 1680gimple_seq_first_stmt (gimple_seq s)
355a7673
MM
1681{
1682 gimple_seq_node n = gimple_seq_first (s);
1683 return n;
1684}
1685
538dd0b7
DM
1686/* Return the first statement in GIMPLE sequence S as a gbind *,
1687 verifying that it has code GIMPLE_BIND in a checked build. */
1688
1689static inline gbind *
1690gimple_seq_first_stmt_as_a_bind (gimple_seq s)
1691{
1692 gimple_seq_node n = gimple_seq_first (s);
1693 return as_a <gbind *> (n);
1694}
1695
355a7673
MM
1696
1697/* Return the last node in GIMPLE sequence S. */
1698
1699static inline gimple_seq_node
3e8b732e 1700gimple_seq_last (gimple_seq s)
355a7673 1701{
daa6e488 1702 return s ? s->prev : NULL;
355a7673
MM
1703}
1704
1705
1706/* Return the last statement in GIMPLE sequence S. */
1707
355fe088 1708static inline gimple *
3e8b732e 1709gimple_seq_last_stmt (gimple_seq s)
355a7673
MM
1710{
1711 gimple_seq_node n = gimple_seq_last (s);
1712 return n;
1713}
1714
1715
1716/* Set the last node in GIMPLE sequence *PS to LAST. */
1717
1718static inline void
1719gimple_seq_set_last (gimple_seq *ps, gimple_seq_node last)
1720{
daa6e488 1721 (*ps)->prev = last;
355a7673
MM
1722}
1723
1724
1725/* Set the first node in GIMPLE sequence *PS to FIRST. */
1726
1727static inline void
1728gimple_seq_set_first (gimple_seq *ps, gimple_seq_node first)
1729{
1730 *ps = first;
1731}
1732
1733
1734/* Return true if GIMPLE sequence S is empty. */
1735
1736static inline bool
3e8b732e 1737gimple_seq_empty_p (gimple_seq s)
355a7673
MM
1738{
1739 return s == NULL;
1740}
1741
355a7673
MM
1742/* Allocate a new sequence and initialize its first element with STMT. */
1743
1744static inline gimple_seq
355fe088 1745gimple_seq_alloc_with_stmt (gimple *stmt)
355a7673
MM
1746{
1747 gimple_seq seq = NULL;
1748 gimple_seq_add_stmt (&seq, stmt);
1749 return seq;
1750}
1751
1752
1753/* Returns the sequence of statements in BB. */
1754
1755static inline gimple_seq
1756bb_seq (const_basic_block bb)
1757{
3e8b732e 1758 return (!(bb->flags & BB_RTL)) ? bb->il.gimple.seq : NULL;
355a7673
MM
1759}
1760
1761static inline gimple_seq *
3e8b732e 1762bb_seq_addr (basic_block bb)
355a7673 1763{
3e8b732e 1764 return (!(bb->flags & BB_RTL)) ? &bb->il.gimple.seq : NULL;
355a7673
MM
1765}
1766
1767/* Sets the sequence of statements in BB to SEQ. */
1768
1769static inline void
1770set_bb_seq (basic_block bb, gimple_seq seq)
1771{
1772 gcc_checking_assert (!(bb->flags & BB_RTL));
3e8b732e 1773 bb->il.gimple.seq = seq;
355a7673
MM
1774}
1775
1776
726a989a
RB
1777/* Return the code for GIMPLE statement G. */
1778
1779static inline enum gimple_code
355fe088 1780gimple_code (const gimple *g)
726a989a 1781{
daa6e488 1782 return g->code;
726a989a
RB
1783}
1784
1785
f2c4a81c
RH
1786/* Return the GSS code used by a GIMPLE code. */
1787
1788static inline enum gimple_statement_structure_enum
1789gss_for_code (enum gimple_code code)
1790{
2bc0a660 1791 gcc_gimple_checking_assert ((unsigned int)code < LAST_AND_UNUSED_GIMPLE_CODE);
f2c4a81c
RH
1792 return gss_for_code_[code];
1793}
1794
1795
1796/* Return which GSS code is used by GS. */
1797
1798static inline enum gimple_statement_structure_enum
355fe088 1799gimple_statement_structure (gimple *gs)
f2c4a81c
RH
1800{
1801 return gss_for_code (gimple_code (gs));
1802}
1803
1804
726a989a
RB
1805/* Return true if statement G has sub-statements. This is only true for
1806 High GIMPLE statements. */
1807
1808static inline bool
355fe088 1809gimple_has_substatements (gimple *g)
726a989a
RB
1810{
1811 switch (gimple_code (g))
1812 {
1813 case GIMPLE_BIND:
1814 case GIMPLE_CATCH:
1815 case GIMPLE_EH_FILTER:
0a35513e 1816 case GIMPLE_EH_ELSE:
726a989a
RB
1817 case GIMPLE_TRY:
1818 case GIMPLE_OMP_FOR:
1819 case GIMPLE_OMP_MASTER:
acf0174b 1820 case GIMPLE_OMP_TASKGROUP:
726a989a
RB
1821 case GIMPLE_OMP_ORDERED:
1822 case GIMPLE_OMP_SECTION:
1823 case GIMPLE_OMP_PARALLEL:
1824 case GIMPLE_OMP_TASK:
1825 case GIMPLE_OMP_SECTIONS:
1826 case GIMPLE_OMP_SINGLE:
acf0174b
JJ
1827 case GIMPLE_OMP_TARGET:
1828 case GIMPLE_OMP_TEAMS:
05a26161 1829 case GIMPLE_OMP_CRITICAL:
726a989a 1830 case GIMPLE_WITH_CLEANUP_EXPR:
0a35513e 1831 case GIMPLE_TRANSACTION:
726a989a
RB
1832 return true;
1833
1834 default:
1835 return false;
1836 }
1837}
b8698a0f 1838
726a989a
RB
1839
1840/* Return the basic block holding statement G. */
1841
b8244d74 1842static inline basic_block
355fe088 1843gimple_bb (const gimple *g)
726a989a 1844{
daa6e488 1845 return g->bb;
726a989a
RB
1846}
1847
1848
1849/* Return the lexical scope block holding statement G. */
1850
1851static inline tree
355fe088 1852gimple_block (const gimple *g)
726a989a 1853{
daa6e488 1854 return LOCATION_BLOCK (g->location);
726a989a
RB
1855}
1856
1857
1858/* Set BLOCK to be the lexical scope block holding statement G. */
1859
1860static inline void
355fe088 1861gimple_set_block (gimple *g, tree block)
726a989a 1862{
ebedc9a3 1863 g->location = set_block (g->location, block);
726a989a
RB
1864}
1865
1866
1867/* Return location information for statement G. */
1868
1869static inline location_t
355fe088 1870gimple_location (const gimple *g)
726a989a 1871{
daa6e488 1872 return g->location;
726a989a
RB
1873}
1874
807b7d62
ML
1875/* Return location information for statement G if g is not NULL.
1876 Otherwise, UNKNOWN_LOCATION is returned. */
1877
1878static inline location_t
355fe088 1879gimple_location_safe (const gimple *g)
807b7d62
ML
1880{
1881 return g ? gimple_location (g) : UNKNOWN_LOCATION;
1882}
1883
726a989a
RB
1884/* Set location information for statement G. */
1885
1886static inline void
355fe088 1887gimple_set_location (gimple *g, location_t location)
726a989a 1888{
daa6e488 1889 g->location = location;
726a989a
RB
1890}
1891
3536ff2d
JJ
1892/* Return address of the location information for statement G. */
1893
1894static inline location_t *
1895gimple_location_ptr (gimple *g)
1896{
1897 return &g->location;
1898}
1899
726a989a
RB
1900
1901/* Return true if G contains location information. */
1902
1903static inline bool
355fe088 1904gimple_has_location (const gimple *g)
726a989a 1905{
2f13f2de 1906 return LOCATION_LOCUS (gimple_location (g)) != UNKNOWN_LOCATION;
726a989a
RB
1907}
1908
1909
e3329a78
MS
1910/* Return non-artificial location information for statement G. */
1911
1912static inline location_t
1913gimple_nonartificial_location (const gimple *g)
1914{
1915 location_t *ploc = NULL;
1916
1917 if (tree block = gimple_block (g))
1918 ploc = block_nonartificial_location (block);
1919
1920 return ploc ? *ploc : gimple_location (g);
1921}
1922
1923
726a989a
RB
1924/* Return the file name of the location of STMT. */
1925
1926static inline const char *
355fe088 1927gimple_filename (const gimple *stmt)
726a989a
RB
1928{
1929 return LOCATION_FILE (gimple_location (stmt));
1930}
1931
1932
1933/* Return the line number of the location of STMT. */
1934
1935static inline int
355fe088 1936gimple_lineno (const gimple *stmt)
726a989a
RB
1937{
1938 return LOCATION_LINE (gimple_location (stmt));
1939}
1940
1941
1942/* Determine whether SEQ is a singleton. */
1943
1944static inline bool
1945gimple_seq_singleton_p (gimple_seq seq)
1946{
1947 return ((gimple_seq_first (seq) != NULL)
1948 && (gimple_seq_first (seq) == gimple_seq_last (seq)));
1949}
1950
1951/* Return true if no warnings should be emitted for statement STMT. */
1952
1953static inline bool
355fe088 1954gimple_no_warning_p (const gimple *stmt)
726a989a 1955{
daa6e488 1956 return stmt->no_warning;
726a989a
RB
1957}
1958
1959/* Set the no_warning flag of STMT to NO_WARNING. */
1960
1961static inline void
355fe088 1962gimple_set_no_warning (gimple *stmt, bool no_warning)
726a989a 1963{
daa6e488 1964 stmt->no_warning = (unsigned) no_warning;
726a989a
RB
1965}
1966
3d8b06d3
DS
1967/* Set the visited status on statement STMT to VISITED_P.
1968
1969 Please note that this 'visited' property of the gimple statement is
1970 supposed to be undefined at pass boundaries. This means that a
1971 given pass should not assume it contains any useful value when the
1972 pass starts and thus can set it to any value it sees fit.
1973
1974 You can learn more about the visited property of the gimple
1975 statement by reading the comments of the 'visited' data member of
7b954766 1976 struct gimple.
3d8b06d3 1977 */
726a989a
RB
1978
1979static inline void
355fe088 1980gimple_set_visited (gimple *stmt, bool visited_p)
726a989a 1981{
daa6e488 1982 stmt->visited = (unsigned) visited_p;
726a989a
RB
1983}
1984
1985
3d8b06d3
DS
1986/* Return the visited status for statement STMT.
1987
1988 Please note that this 'visited' property of the gimple statement is
1989 supposed to be undefined at pass boundaries. This means that a
1990 given pass should not assume it contains any useful value when the
1991 pass starts and thus can set it to any value it sees fit.
1992
1993 You can learn more about the visited property of the gimple
1994 statement by reading the comments of the 'visited' data member of
7b954766 1995 struct gimple. */
726a989a
RB
1996
1997static inline bool
355fe088 1998gimple_visited_p (gimple *stmt)
726a989a 1999{
daa6e488 2000 return stmt->visited;
726a989a
RB
2001}
2002
2003
3d8b06d3
DS
2004/* Set pass local flag PLF on statement STMT to VAL_P.
2005
2006 Please note that this PLF property of the gimple statement is
2007 supposed to be undefined at pass boundaries. This means that a
2008 given pass should not assume it contains any useful value when the
2009 pass starts and thus can set it to any value it sees fit.
2010
2011 You can learn more about the PLF property by reading the comment of
2012 the 'plf' data member of struct gimple_statement_structure. */
726a989a
RB
2013
2014static inline void
355fe088 2015gimple_set_plf (gimple *stmt, enum plf_mask plf, bool val_p)
726a989a
RB
2016{
2017 if (val_p)
daa6e488 2018 stmt->plf |= (unsigned int) plf;
726a989a 2019 else
daa6e488 2020 stmt->plf &= ~((unsigned int) plf);
726a989a
RB
2021}
2022
2023
3d8b06d3
DS
2024/* Return the value of pass local flag PLF on statement STMT.
2025
2026 Please note that this 'plf' property of the gimple statement is
2027 supposed to be undefined at pass boundaries. This means that a
2028 given pass should not assume it contains any useful value when the
2029 pass starts and thus can set it to any value it sees fit.
2030
2031 You can learn more about the plf property by reading the comment of
2032 the 'plf' data member of struct gimple_statement_structure. */
726a989a
RB
2033
2034static inline unsigned int
355fe088 2035gimple_plf (gimple *stmt, enum plf_mask plf)
726a989a 2036{
daa6e488 2037 return stmt->plf & ((unsigned int) plf);
726a989a
RB
2038}
2039
2040
3d8b06d3
DS
2041/* Set the UID of statement.
2042
2043 Please note that this UID property is supposed to be undefined at
2044 pass boundaries. This means that a given pass should not assume it
2045 contains any useful value when the pass starts and thus can set it
2046 to any value it sees fit. */
726a989a
RB
2047
2048static inline void
355fe088 2049gimple_set_uid (gimple *g, unsigned uid)
726a989a 2050{
daa6e488 2051 g->uid = uid;
726a989a
RB
2052}
2053
2054
3d8b06d3
DS
2055/* Return the UID of statement.
2056
2057 Please note that this UID property is supposed to be undefined at
2058 pass boundaries. This means that a given pass should not assume it
2059 contains any useful value when the pass starts and thus can set it
2060 to any value it sees fit. */
726a989a
RB
2061
2062static inline unsigned
355fe088 2063gimple_uid (const gimple *g)
726a989a 2064{
daa6e488 2065 return g->uid;
726a989a
RB
2066}
2067
2068
355a7673
MM
2069/* Make statement G a singleton sequence. */
2070
2071static inline void
355fe088 2072gimple_init_singleton (gimple *g)
355a7673 2073{
daa6e488
DM
2074 g->next = NULL;
2075 g->prev = g;
355a7673
MM
2076}
2077
2078
726a989a
RB
2079/* Return true if GIMPLE statement G has register or memory operands. */
2080
2081static inline bool
355fe088 2082gimple_has_ops (const gimple *g)
726a989a
RB
2083{
2084 return gimple_code (g) >= GIMPLE_COND && gimple_code (g) <= GIMPLE_RETURN;
2085}
2086
daa6e488
DM
2087template <>
2088template <>
2089inline bool
355fe088 2090is_a_helper <const gimple_statement_with_ops *>::test (const gimple *gs)
daa6e488
DM
2091{
2092 return gimple_has_ops (gs);
2093}
2094
2095template <>
2096template <>
2097inline bool
355fe088 2098is_a_helper <gimple_statement_with_ops *>::test (gimple *gs)
daa6e488
DM
2099{
2100 return gimple_has_ops (gs);
2101}
726a989a
RB
2102
2103/* Return true if GIMPLE statement G has memory operands. */
2104
2105static inline bool
355fe088 2106gimple_has_mem_ops (const gimple *g)
726a989a
RB
2107{
2108 return gimple_code (g) >= GIMPLE_ASSIGN && gimple_code (g) <= GIMPLE_RETURN;
2109}
2110
daa6e488
DM
2111template <>
2112template <>
2113inline bool
355fe088 2114is_a_helper <const gimple_statement_with_memory_ops *>::test (const gimple *gs)
daa6e488
DM
2115{
2116 return gimple_has_mem_ops (gs);
2117}
2118
2119template <>
2120template <>
2121inline bool
355fe088 2122is_a_helper <gimple_statement_with_memory_ops *>::test (gimple *gs)
daa6e488
DM
2123{
2124 return gimple_has_mem_ops (gs);
2125}
726a989a 2126
726a989a
RB
2127/* Return the set of USE operands for statement G. */
2128
2129static inline struct use_optype_d *
355fe088 2130gimple_use_ops (const gimple *g)
726a989a 2131{
daa6e488 2132 const gimple_statement_with_ops *ops_stmt =
7de90a6c 2133 dyn_cast <const gimple_statement_with_ops *> (g);
daa6e488 2134 if (!ops_stmt)
726a989a 2135 return NULL;
daa6e488 2136 return ops_stmt->use_ops;
726a989a
RB
2137}
2138
2139
2140/* Set USE to be the set of USE operands for statement G. */
2141
2142static inline void
355fe088 2143gimple_set_use_ops (gimple *g, struct use_optype_d *use)
726a989a 2144{
daa6e488 2145 gimple_statement_with_ops *ops_stmt =
7de90a6c 2146 as_a <gimple_statement_with_ops *> (g);
daa6e488 2147 ops_stmt->use_ops = use;
726a989a
RB
2148}
2149
2150
5006671f 2151/* Return the single VUSE operand of the statement G. */
726a989a 2152
5006671f 2153static inline tree
355fe088 2154gimple_vuse (const gimple *g)
726a989a 2155{
daa6e488 2156 const gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2157 dyn_cast <const gimple_statement_with_memory_ops *> (g);
daa6e488 2158 if (!mem_ops_stmt)
5006671f 2159 return NULL_TREE;
daa6e488 2160 return mem_ops_stmt->vuse;
726a989a
RB
2161}
2162
5006671f 2163/* Return the single VDEF operand of the statement G. */
726a989a 2164
5006671f 2165static inline tree
355fe088 2166gimple_vdef (const gimple *g)
726a989a 2167{
daa6e488 2168 const gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2169 dyn_cast <const gimple_statement_with_memory_ops *> (g);
daa6e488 2170 if (!mem_ops_stmt)
5006671f 2171 return NULL_TREE;
daa6e488 2172 return mem_ops_stmt->vdef;
726a989a
RB
2173}
2174
5006671f 2175/* Return the single VUSE operand of the statement G. */
726a989a 2176
5006671f 2177static inline tree *
355fe088 2178gimple_vuse_ptr (gimple *g)
726a989a 2179{
daa6e488 2180 gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2181 dyn_cast <gimple_statement_with_memory_ops *> (g);
daa6e488 2182 if (!mem_ops_stmt)
726a989a 2183 return NULL;
daa6e488 2184 return &mem_ops_stmt->vuse;
726a989a
RB
2185}
2186
5006671f 2187/* Return the single VDEF operand of the statement G. */
726a989a 2188
5006671f 2189static inline tree *
355fe088 2190gimple_vdef_ptr (gimple *g)
726a989a 2191{
daa6e488 2192 gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2193 dyn_cast <gimple_statement_with_memory_ops *> (g);
daa6e488 2194 if (!mem_ops_stmt)
726a989a 2195 return NULL;
daa6e488 2196 return &mem_ops_stmt->vdef;
5006671f
RG
2197}
2198
2199/* Set the single VUSE operand of the statement G. */
2200
2201static inline void
355fe088 2202gimple_set_vuse (gimple *g, tree vuse)
5006671f 2203{
daa6e488 2204 gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2205 as_a <gimple_statement_with_memory_ops *> (g);
daa6e488 2206 mem_ops_stmt->vuse = vuse;
5006671f
RG
2207}
2208
2209/* Set the single VDEF operand of the statement G. */
2210
2211static inline void
355fe088 2212gimple_set_vdef (gimple *g, tree vdef)
5006671f 2213{
daa6e488 2214 gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2215 as_a <gimple_statement_with_memory_ops *> (g);
daa6e488 2216 mem_ops_stmt->vdef = vdef;
726a989a
RB
2217}
2218
2219
2220/* Return true if statement G has operands and the modified field has
2221 been set. */
2222
2223static inline bool
355fe088 2224gimple_modified_p (const gimple *g)
726a989a 2225{
daa6e488 2226 return (gimple_has_ops (g)) ? (bool) g->modified : false;
726a989a
RB
2227}
2228
726a989a 2229
a02f0c5d
RG
2230/* Set the MODIFIED flag to MODIFIEDP, iff the gimple statement G has
2231 a MODIFIED field. */
2232
2233static inline void
355fe088 2234gimple_set_modified (gimple *s, bool modifiedp)
a02f0c5d
RG
2235{
2236 if (gimple_has_ops (s))
daa6e488 2237 s->modified = (unsigned) modifiedp;
a02f0c5d
RG
2238}
2239
2240
726a989a
RB
2241/* Return true if statement STMT contains volatile operands. */
2242
2243static inline bool
355fe088 2244gimple_has_volatile_ops (const gimple *stmt)
726a989a
RB
2245{
2246 if (gimple_has_mem_ops (stmt))
daa6e488 2247 return stmt->has_volatile_ops;
726a989a
RB
2248 else
2249 return false;
2250}
2251
2252
2253/* Set the HAS_VOLATILE_OPS flag to VOLATILEP. */
2254
2255static inline void
355fe088 2256gimple_set_has_volatile_ops (gimple *stmt, bool volatilep)
726a989a
RB
2257{
2258 if (gimple_has_mem_ops (stmt))
daa6e488 2259 stmt->has_volatile_ops = (unsigned) volatilep;
726a989a
RB
2260}
2261
19c0d7df
AH
2262/* Return true if STMT is in a transaction. */
2263
2264static inline bool
355fe088 2265gimple_in_transaction (const gimple *stmt)
19c0d7df 2266{
7783daa7 2267 return bb_in_transaction (gimple_bb (stmt));
19c0d7df 2268}
726a989a
RB
2269
2270/* Return true if statement STMT may access memory. */
2271
2272static inline bool
355fe088 2273gimple_references_memory_p (gimple *stmt)
726a989a 2274{
5006671f 2275 return gimple_has_mem_ops (stmt) && gimple_vuse (stmt);
726a989a
RB
2276}
2277
2278
726a989a
RB
2279/* Return the subcode for OMP statement S. */
2280
2281static inline unsigned
355fe088 2282gimple_omp_subcode (const gimple *s)
726a989a 2283{
2bc0a660 2284 gcc_gimple_checking_assert (gimple_code (s) >= GIMPLE_OMP_ATOMIC_LOAD
28567c40 2285 && gimple_code (s) <= GIMPLE_OMP_TEAMS);
daa6e488 2286 return s->subcode;
726a989a
RB
2287}
2288
2289/* Set the subcode for OMP statement S to SUBCODE. */
2290
2291static inline void
355fe088 2292gimple_omp_set_subcode (gimple *s, unsigned int subcode)
726a989a
RB
2293{
2294 /* We only have 16 bits for the subcode. Assert that we are not
2295 overflowing it. */
2bc0a660 2296 gcc_gimple_checking_assert (subcode < (1 << 16));
daa6e488 2297 s->subcode = subcode;
726a989a
RB
2298}
2299
2300/* Set the nowait flag on OMP_RETURN statement S. */
2301
2302static inline void
355fe088 2303gimple_omp_return_set_nowait (gimple *s)
726a989a
RB
2304{
2305 GIMPLE_CHECK (s, GIMPLE_OMP_RETURN);
daa6e488 2306 s->subcode |= GF_OMP_RETURN_NOWAIT;
726a989a
RB
2307}
2308
2309
2310/* Return true if OMP return statement G has the GF_OMP_RETURN_NOWAIT
2311 flag set. */
2312
2313static inline bool
355fe088 2314gimple_omp_return_nowait_p (const gimple *g)
726a989a
RB
2315{
2316 GIMPLE_CHECK (g, GIMPLE_OMP_RETURN);
2317 return (gimple_omp_subcode (g) & GF_OMP_RETURN_NOWAIT) != 0;
2318}
2319
2320
acf0174b
JJ
2321/* Set the LHS of OMP return. */
2322
2323static inline void
355fe088 2324gimple_omp_return_set_lhs (gimple *g, tree lhs)
acf0174b 2325{
9b95612e 2326 gimple_statement_omp_return *omp_return_stmt =
7de90a6c 2327 as_a <gimple_statement_omp_return *> (g);
9b95612e 2328 omp_return_stmt->val = lhs;
acf0174b
JJ
2329}
2330
2331
2332/* Get the LHS of OMP return. */
2333
2334static inline tree
355fe088 2335gimple_omp_return_lhs (const gimple *g)
acf0174b 2336{
9b95612e 2337 const gimple_statement_omp_return *omp_return_stmt =
7de90a6c 2338 as_a <const gimple_statement_omp_return *> (g);
9b95612e 2339 return omp_return_stmt->val;
acf0174b
JJ
2340}
2341
2342
2343/* Return a pointer to the LHS of OMP return. */
2344
2345static inline tree *
355fe088 2346gimple_omp_return_lhs_ptr (gimple *g)
acf0174b 2347{
9b95612e 2348 gimple_statement_omp_return *omp_return_stmt =
7de90a6c 2349 as_a <gimple_statement_omp_return *> (g);
9b95612e 2350 return &omp_return_stmt->val;
acf0174b
JJ
2351}
2352
2353
726a989a
RB
2354/* Return true if OMP section statement G has the GF_OMP_SECTION_LAST
2355 flag set. */
2356
2357static inline bool
355fe088 2358gimple_omp_section_last_p (const gimple *g)
726a989a
RB
2359{
2360 GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
2361 return (gimple_omp_subcode (g) & GF_OMP_SECTION_LAST) != 0;
2362}
2363
2364
2365/* Set the GF_OMP_SECTION_LAST flag on G. */
2366
2367static inline void
355fe088 2368gimple_omp_section_set_last (gimple *g)
726a989a
RB
2369{
2370 GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
daa6e488 2371 g->subcode |= GF_OMP_SECTION_LAST;
726a989a
RB
2372}
2373
2374
2375/* Return true if OMP parallel statement G has the
2376 GF_OMP_PARALLEL_COMBINED flag set. */
2377
2378static inline bool
355fe088 2379gimple_omp_parallel_combined_p (const gimple *g)
726a989a
RB
2380{
2381 GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
2382 return (gimple_omp_subcode (g) & GF_OMP_PARALLEL_COMBINED) != 0;
2383}
2384
2385
2386/* Set the GF_OMP_PARALLEL_COMBINED field in G depending on the boolean
2387 value of COMBINED_P. */
2388
2389static inline void
355fe088 2390gimple_omp_parallel_set_combined_p (gimple *g, bool combined_p)
726a989a
RB
2391{
2392 GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
2393 if (combined_p)
daa6e488 2394 g->subcode |= GF_OMP_PARALLEL_COMBINED;
726a989a 2395 else
daa6e488 2396 g->subcode &= ~GF_OMP_PARALLEL_COMBINED;
726a989a
RB
2397}
2398
2399
20906c66
JJ
2400/* Return true if OMP atomic load/store statement G has the
2401 GF_OMP_ATOMIC_NEED_VALUE flag set. */
2402
2403static inline bool
355fe088 2404gimple_omp_atomic_need_value_p (const gimple *g)
20906c66
JJ
2405{
2406 if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
2407 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
2408 return (gimple_omp_subcode (g) & GF_OMP_ATOMIC_NEED_VALUE) != 0;
2409}
2410
2411
2412/* Set the GF_OMP_ATOMIC_NEED_VALUE flag on G. */
2413
2414static inline void
355fe088 2415gimple_omp_atomic_set_need_value (gimple *g)
20906c66
JJ
2416{
2417 if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
2418 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
daa6e488 2419 g->subcode |= GF_OMP_ATOMIC_NEED_VALUE;
20906c66
JJ
2420}
2421
2422
28567c40 2423/* Return the memory order of the OMP atomic load/store statement G. */
acf0174b 2424
28567c40
JJ
2425static inline enum omp_memory_order
2426gimple_omp_atomic_memory_order (const gimple *g)
acf0174b
JJ
2427{
2428 if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
2429 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
28567c40
JJ
2430 return (enum omp_memory_order)
2431 (gimple_omp_subcode (g) & GF_OMP_ATOMIC_MEMORY_ORDER);
acf0174b
JJ
2432}
2433
2434
28567c40 2435/* Set the memory order on G. */
acf0174b
JJ
2436
2437static inline void
28567c40 2438gimple_omp_atomic_set_memory_order (gimple *g, enum omp_memory_order mo)
acf0174b
JJ
2439{
2440 if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
2441 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
28567c40
JJ
2442 g->subcode = ((g->subcode & ~GF_OMP_ATOMIC_MEMORY_ORDER)
2443 | (mo & GF_OMP_ATOMIC_MEMORY_ORDER));
acf0174b
JJ
2444}
2445
2446
726a989a
RB
2447/* Return the number of operands for statement GS. */
2448
2449static inline unsigned
355fe088 2450gimple_num_ops (const gimple *gs)
726a989a 2451{
daa6e488 2452 return gs->num_ops;
726a989a
RB
2453}
2454
2455
2456/* Set the number of operands for statement GS. */
2457
2458static inline void
355fe088 2459gimple_set_num_ops (gimple *gs, unsigned num_ops)
726a989a 2460{
daa6e488 2461 gs->num_ops = num_ops;
726a989a
RB
2462}
2463
2464
2465/* Return the array of operands for statement GS. */
2466
2467static inline tree *
355fe088 2468gimple_ops (gimple *gs)
726a989a 2469{
f2c4a81c 2470 size_t off;
726a989a
RB
2471
2472 /* All the tuples have their operand vector at the very bottom
f2c4a81c
RH
2473 of the structure. Note that those structures that do not
2474 have an operand vector have a zero offset. */
2475 off = gimple_ops_offset_[gimple_statement_structure (gs)];
2bc0a660 2476 gcc_gimple_checking_assert (off != 0);
f2c4a81c
RH
2477
2478 return (tree *) ((char *) gs + off);
726a989a
RB
2479}
2480
2481
2482/* Return operand I for statement GS. */
2483
2484static inline tree
355fe088 2485gimple_op (const gimple *gs, unsigned i)
726a989a
RB
2486{
2487 if (gimple_has_ops (gs))
2488 {
2bc0a660 2489 gcc_gimple_checking_assert (i < gimple_num_ops (gs));
726a989a
RB
2490 return gimple_ops (CONST_CAST_GIMPLE (gs))[i];
2491 }
2492 else
2493 return NULL_TREE;
2494}
2495
2496/* Return a pointer to operand I for statement GS. */
2497
2498static inline tree *
1d10676d 2499gimple_op_ptr (gimple *gs, unsigned i)
726a989a
RB
2500{
2501 if (gimple_has_ops (gs))
2502 {
2bc0a660 2503 gcc_gimple_checking_assert (i < gimple_num_ops (gs));
1d10676d 2504 return gimple_ops (gs) + i;
726a989a
RB
2505 }
2506 else
2507 return NULL;
2508}
2509
2510/* Set operand I of statement GS to OP. */
2511
2512static inline void
355fe088 2513gimple_set_op (gimple *gs, unsigned i, tree op)
726a989a 2514{
2bc0a660 2515 gcc_gimple_checking_assert (gimple_has_ops (gs) && i < gimple_num_ops (gs));
726a989a
RB
2516
2517 /* Note. It may be tempting to assert that OP matches
2518 is_gimple_operand, but that would be wrong. Different tuples
2519 accept slightly different sets of tree operands. Each caller
2520 should perform its own validation. */
2521 gimple_ops (gs)[i] = op;
2522}
2523
2524/* Return true if GS is a GIMPLE_ASSIGN. */
2525
2526static inline bool
355fe088 2527is_gimple_assign (const gimple *gs)
726a989a
RB
2528{
2529 return gimple_code (gs) == GIMPLE_ASSIGN;
2530}
2531
2532/* Determine if expression CODE is one of the valid expressions that can
2533 be used on the RHS of GIMPLE assignments. */
2534
2535static inline enum gimple_rhs_class
2536get_gimple_rhs_class (enum tree_code code)
2537{
2538 return (enum gimple_rhs_class) gimple_rhs_class_table[(int) code];
2539}
2540
2541/* Return the LHS of assignment statement GS. */
2542
bde351d5
RB
2543static inline tree
2544gimple_assign_lhs (const gassign *gs)
2545{
2546 return gs->op[0];
2547}
2548
726a989a 2549static inline tree
355fe088 2550gimple_assign_lhs (const gimple *gs)
726a989a 2551{
bde351d5
RB
2552 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2553 return gimple_assign_lhs (ass);
726a989a
RB
2554}
2555
2556
2557/* Return a pointer to the LHS of assignment statement GS. */
2558
bde351d5 2559static inline tree *
1d10676d 2560gimple_assign_lhs_ptr (gassign *gs)
bde351d5 2561{
1d10676d 2562 return &gs->op[0];
bde351d5
RB
2563}
2564
726a989a 2565static inline tree *
1d10676d 2566gimple_assign_lhs_ptr (gimple *gs)
726a989a 2567{
1d10676d 2568 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
bde351d5 2569 return gimple_assign_lhs_ptr (ass);
726a989a
RB
2570}
2571
2572
2573/* Set LHS to be the LHS operand of assignment statement GS. */
2574
2575static inline void
bde351d5 2576gimple_assign_set_lhs (gassign *gs, tree lhs)
726a989a 2577{
bde351d5 2578 gs->op[0] = lhs;
726a989a
RB
2579
2580 if (lhs && TREE_CODE (lhs) == SSA_NAME)
2581 SSA_NAME_DEF_STMT (lhs) = gs;
2582}
2583
bde351d5 2584static inline void
355fe088 2585gimple_assign_set_lhs (gimple *gs, tree lhs)
bde351d5
RB
2586{
2587 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
2588 gimple_assign_set_lhs (ass, lhs);
2589}
2590
726a989a
RB
2591
2592/* Return the first operand on the RHS of assignment statement GS. */
2593
bde351d5
RB
2594static inline tree
2595gimple_assign_rhs1 (const gassign *gs)
2596{
2597 return gs->op[1];
2598}
2599
726a989a 2600static inline tree
355fe088 2601gimple_assign_rhs1 (const gimple *gs)
726a989a 2602{
bde351d5
RB
2603 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2604 return gimple_assign_rhs1 (ass);
726a989a
RB
2605}
2606
2607
2608/* Return a pointer to the first operand on the RHS of assignment
2609 statement GS. */
2610
bde351d5 2611static inline tree *
1d10676d 2612gimple_assign_rhs1_ptr (gassign *gs)
bde351d5 2613{
1d10676d 2614 return &gs->op[1];
bde351d5
RB
2615}
2616
726a989a 2617static inline tree *
1d10676d 2618gimple_assign_rhs1_ptr (gimple *gs)
726a989a 2619{
1d10676d 2620 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
bde351d5 2621 return gimple_assign_rhs1_ptr (ass);
726a989a
RB
2622}
2623
2624/* Set RHS to be the first operand on the RHS of assignment statement GS. */
2625
2626static inline void
bde351d5 2627gimple_assign_set_rhs1 (gassign *gs, tree rhs)
726a989a 2628{
bde351d5
RB
2629 gs->op[1] = rhs;
2630}
726a989a 2631
bde351d5 2632static inline void
355fe088 2633gimple_assign_set_rhs1 (gimple *gs, tree rhs)
bde351d5
RB
2634{
2635 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
2636 gimple_assign_set_rhs1 (ass, rhs);
726a989a
RB
2637}
2638
2639
2640/* Return the second operand on the RHS of assignment statement GS.
2641 If GS does not have two operands, NULL is returned instead. */
2642
2643static inline tree
bde351d5 2644gimple_assign_rhs2 (const gassign *gs)
726a989a 2645{
726a989a 2646 if (gimple_num_ops (gs) >= 3)
bde351d5 2647 return gs->op[2];
726a989a
RB
2648 else
2649 return NULL_TREE;
2650}
2651
bde351d5 2652static inline tree
355fe088 2653gimple_assign_rhs2 (const gimple *gs)
bde351d5
RB
2654{
2655 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2656 return gimple_assign_rhs2 (ass);
2657}
2658
726a989a
RB
2659
2660/* Return a pointer to the second operand on the RHS of assignment
2661 statement GS. */
2662
bde351d5 2663static inline tree *
1d10676d 2664gimple_assign_rhs2_ptr (gassign *gs)
bde351d5
RB
2665{
2666 gcc_gimple_checking_assert (gimple_num_ops (gs) >= 3);
1d10676d 2667 return &gs->op[2];
bde351d5
RB
2668}
2669
726a989a 2670static inline tree *
1d10676d 2671gimple_assign_rhs2_ptr (gimple *gs)
726a989a 2672{
1d10676d 2673 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
bde351d5 2674 return gimple_assign_rhs2_ptr (ass);
726a989a
RB
2675}
2676
2677
2678/* Set RHS to be the second operand on the RHS of assignment statement GS. */
2679
2680static inline void
bde351d5 2681gimple_assign_set_rhs2 (gassign *gs, tree rhs)
726a989a 2682{
bde351d5
RB
2683 gcc_gimple_checking_assert (gimple_num_ops (gs) >= 3);
2684 gs->op[2] = rhs;
2685}
726a989a 2686
bde351d5 2687static inline void
355fe088 2688gimple_assign_set_rhs2 (gimple *gs, tree rhs)
bde351d5
RB
2689{
2690 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
2691 return gimple_assign_set_rhs2 (ass, rhs);
726a989a
RB
2692}
2693
0354c0c7
BS
2694/* Return the third operand on the RHS of assignment statement GS.
2695 If GS does not have two operands, NULL is returned instead. */
2696
2697static inline tree
bde351d5 2698gimple_assign_rhs3 (const gassign *gs)
0354c0c7 2699{
0354c0c7 2700 if (gimple_num_ops (gs) >= 4)
bde351d5 2701 return gs->op[3];
0354c0c7
BS
2702 else
2703 return NULL_TREE;
2704}
2705
bde351d5 2706static inline tree
355fe088 2707gimple_assign_rhs3 (const gimple *gs)
bde351d5
RB
2708{
2709 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2710 return gimple_assign_rhs3 (ass);
2711}
2712
0354c0c7
BS
2713/* Return a pointer to the third operand on the RHS of assignment
2714 statement GS. */
2715
2716static inline tree *
1d10676d 2717gimple_assign_rhs3_ptr (gimple *gs)
0354c0c7 2718{
1d10676d 2719 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
bde351d5 2720 gcc_gimple_checking_assert (gimple_num_ops (gs) >= 4);
1d10676d 2721 return &ass->op[3];
0354c0c7
BS
2722}
2723
2724
2725/* Set RHS to be the third operand on the RHS of assignment statement GS. */
2726
2727static inline void
bde351d5 2728gimple_assign_set_rhs3 (gassign *gs, tree rhs)
0354c0c7 2729{
bde351d5
RB
2730 gcc_gimple_checking_assert (gimple_num_ops (gs) >= 4);
2731 gs->op[3] = rhs;
2732}
0354c0c7 2733
bde351d5 2734static inline void
355fe088 2735gimple_assign_set_rhs3 (gimple *gs, tree rhs)
bde351d5
RB
2736{
2737 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
2738 gimple_assign_set_rhs3 (ass, rhs);
0354c0c7
BS
2739}
2740
bde351d5 2741
00d66391
JJ
2742/* A wrapper around 3 operand gimple_assign_set_rhs_with_ops, for callers
2743 which expect to see only two operands. */
0354c0c7
BS
2744
2745static inline void
2746gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
2747 tree op1, tree op2)
2748{
00d66391
JJ
2749 gimple_assign_set_rhs_with_ops (gsi, code, op1, op2, NULL);
2750}
2751
2752/* A wrapper around 3 operand gimple_assign_set_rhs_with_ops, for callers
2753 which expect to see only one operands. */
2754
2755static inline void
2756gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
2757 tree op1)
2758{
2759 gimple_assign_set_rhs_with_ops (gsi, code, op1, NULL, NULL);
0354c0c7
BS
2760}
2761
726a989a
RB
2762/* Returns true if GS is a nontemporal move. */
2763
2764static inline bool
538dd0b7 2765gimple_assign_nontemporal_move_p (const gassign *gs)
726a989a 2766{
daa6e488 2767 return gs->nontemporal_move;
726a989a
RB
2768}
2769
2770/* Sets nontemporal move flag of GS to NONTEMPORAL. */
2771
2772static inline void
355fe088 2773gimple_assign_set_nontemporal_move (gimple *gs, bool nontemporal)
726a989a
RB
2774{
2775 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
daa6e488 2776 gs->nontemporal_move = nontemporal;
726a989a
RB
2777}
2778
2779
2780/* Return the code of the expression computed on the rhs of assignment
2781 statement GS. In case that the RHS is a single object, returns the
2782 tree code of the object. */
2783
2784static inline enum tree_code
bde351d5 2785gimple_assign_rhs_code (const gassign *gs)
726a989a 2786{
bde351d5 2787 enum tree_code code = (enum tree_code) gs->subcode;
3dbe9454
RG
2788 /* While we initially set subcode to the TREE_CODE of the rhs for
2789 GIMPLE_SINGLE_RHS assigns we do not update that subcode to stay
2790 in sync when we rewrite stmts into SSA form or do SSA propagations. */
726a989a 2791 if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
bde351d5 2792 code = TREE_CODE (gs->op[1]);
726a989a
RB
2793
2794 return code;
2795}
2796
bde351d5 2797static inline enum tree_code
355fe088 2798gimple_assign_rhs_code (const gimple *gs)
bde351d5
RB
2799{
2800 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2801 return gimple_assign_rhs_code (ass);
2802}
2803
726a989a
RB
2804
2805/* Set CODE to be the code for the expression computed on the RHS of
2806 assignment S. */
2807
2808static inline void
355fe088 2809gimple_assign_set_rhs_code (gimple *s, enum tree_code code)
726a989a
RB
2810{
2811 GIMPLE_CHECK (s, GIMPLE_ASSIGN);
daa6e488 2812 s->subcode = code;
726a989a
RB
2813}
2814
2815
0f336c35
RG
2816/* Return the gimple rhs class of the code of the expression computed on
2817 the rhs of assignment statement GS.
2818 This will never return GIMPLE_INVALID_RHS. */
2819
2820static inline enum gimple_rhs_class
355fe088 2821gimple_assign_rhs_class (const gimple *gs)
0f336c35
RG
2822{
2823 return get_gimple_rhs_class (gimple_assign_rhs_code (gs));
2824}
2825
3dbe9454
RG
2826/* Return true if GS is an assignment with a singleton RHS, i.e.,
2827 there is no operator associated with the assignment itself.
2828 Unlike gimple_assign_copy_p, this predicate returns true for
2829 any RHS operand, including those that perform an operation
2830 and do not have the semantics of a copy, such as COND_EXPR. */
2831
2832static inline bool
355fe088 2833gimple_assign_single_p (const gimple *gs)
3dbe9454
RG
2834{
2835 return (is_gimple_assign (gs)
2836 && gimple_assign_rhs_class (gs) == GIMPLE_SINGLE_RHS);
2837}
2838
c12d9242
RB
2839/* Return true if GS performs a store to its lhs. */
2840
2841static inline bool
355fe088 2842gimple_store_p (const gimple *gs)
c12d9242
RB
2843{
2844 tree lhs = gimple_get_lhs (gs);
2845 return lhs && !is_gimple_reg (lhs);
2846}
2847
2848/* Return true if GS is an assignment that loads from its rhs1. */
2849
2850static inline bool
355fe088 2851gimple_assign_load_p (const gimple *gs)
c12d9242
RB
2852{
2853 tree rhs;
2854 if (!gimple_assign_single_p (gs))
2855 return false;
2856 rhs = gimple_assign_rhs1 (gs);
2857 if (TREE_CODE (rhs) == WITH_SIZE_EXPR)
2858 return true;
2859 rhs = get_base_address (rhs);
2860 return (DECL_P (rhs)
2861 || TREE_CODE (rhs) == MEM_REF || TREE_CODE (rhs) == TARGET_MEM_REF);
2862}
2863
0f336c35 2864
726a989a
RB
2865/* Return true if S is a type-cast assignment. */
2866
2867static inline bool
355fe088 2868gimple_assign_cast_p (const gimple *s)
726a989a
RB
2869{
2870 if (is_gimple_assign (s))
2871 {
2872 enum tree_code sc = gimple_assign_rhs_code (s);
1a87cf0c 2873 return CONVERT_EXPR_CODE_P (sc)
726a989a
RB
2874 || sc == VIEW_CONVERT_EXPR
2875 || sc == FIX_TRUNC_EXPR;
2876 }
2877
2878 return false;
2879}
2880
47598145
MM
2881/* Return true if S is a clobber statement. */
2882
2883static inline bool
355fe088 2884gimple_clobber_p (const gimple *s)
47598145
MM
2885{
2886 return gimple_assign_single_p (s)
2887 && TREE_CLOBBER_P (gimple_assign_rhs1 (s));
2888}
726a989a
RB
2889
2890/* Return true if GS is a GIMPLE_CALL. */
2891
2892static inline bool
355fe088 2893is_gimple_call (const gimple *gs)
726a989a
RB
2894{
2895 return gimple_code (gs) == GIMPLE_CALL;
2896}
2897
2898/* Return the LHS of call statement GS. */
2899
003b40ae
RB
2900static inline tree
2901gimple_call_lhs (const gcall *gs)
2902{
2903 return gs->op[0];
2904}
2905
726a989a 2906static inline tree
355fe088 2907gimple_call_lhs (const gimple *gs)
726a989a 2908{
003b40ae
RB
2909 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
2910 return gimple_call_lhs (gc);
726a989a
RB
2911}
2912
2913
2914/* Return a pointer to the LHS of call statement GS. */
2915
003b40ae 2916static inline tree *
1d10676d 2917gimple_call_lhs_ptr (gcall *gs)
003b40ae 2918{
1d10676d 2919 return &gs->op[0];
003b40ae
RB
2920}
2921
726a989a 2922static inline tree *
1d10676d 2923gimple_call_lhs_ptr (gimple *gs)
726a989a 2924{
1d10676d 2925 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
003b40ae 2926 return gimple_call_lhs_ptr (gc);
726a989a
RB
2927}
2928
2929
2930/* Set LHS to be the LHS operand of call statement GS. */
2931
2932static inline void
003b40ae 2933gimple_call_set_lhs (gcall *gs, tree lhs)
726a989a 2934{
003b40ae 2935 gs->op[0] = lhs;
726a989a
RB
2936 if (lhs && TREE_CODE (lhs) == SSA_NAME)
2937 SSA_NAME_DEF_STMT (lhs) = gs;
2938}
2939
003b40ae 2940static inline void
355fe088 2941gimple_call_set_lhs (gimple *gs, tree lhs)
003b40ae
RB
2942{
2943 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
2944 gimple_call_set_lhs (gc, lhs);
2945}
2946
726a989a 2947
25583c4f
RS
2948/* Return true if call GS calls an internal-only function, as enumerated
2949 by internal_fn. */
2950
2951static inline bool
003b40ae 2952gimple_call_internal_p (const gcall *gs)
25583c4f 2953{
daa6e488 2954 return (gs->subcode & GF_CALL_INTERNAL) != 0;
25583c4f
RS
2955}
2956
003b40ae 2957static inline bool
355fe088 2958gimple_call_internal_p (const gimple *gs)
003b40ae
RB
2959{
2960 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
2961 return gimple_call_internal_p (gc);
2962}
2963
5c5f0b65
IT
2964/* Return true if call GS is marked as nocf_check. */
2965
2966static inline bool
2967gimple_call_nocf_check_p (const gcall *gs)
2968{
2969 return (gs->subcode & GF_CALL_NOCF_CHECK) != 0;
2970}
2971
2972/* Mark statement GS as nocf_check call. */
2973
2974static inline void
2975gimple_call_set_nocf_check (gcall *gs, bool nocf_check)
2976{
2977 if (nocf_check)
2978 gs->subcode |= GF_CALL_NOCF_CHECK;
2979 else
2980 gs->subcode &= ~GF_CALL_NOCF_CHECK;
2981}
2982
25583c4f
RS
2983/* Return the target of internal call GS. */
2984
2985static inline enum internal_fn
003b40ae 2986gimple_call_internal_fn (const gcall *gs)
25583c4f
RS
2987{
2988 gcc_gimple_checking_assert (gimple_call_internal_p (gs));
003b40ae
RB
2989 return gs->u.internal_fn;
2990}
2991
2992static inline enum internal_fn
355fe088 2993gimple_call_internal_fn (const gimple *gs)
003b40ae
RB
2994{
2995 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
2996 return gimple_call_internal_fn (gc);
25583c4f
RS
2997}
2998
8ab78162
NS
2999/* Return true, if this internal gimple call is unique. */
3000
3001static inline bool
3002gimple_call_internal_unique_p (const gcall *gs)
3003{
3004 return gimple_call_internal_fn (gs) == IFN_UNIQUE;
3005}
3006
3007static inline bool
3008gimple_call_internal_unique_p (const gimple *gs)
3009{
3010 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3011 return gimple_call_internal_unique_p (gc);
3012}
3013
81fea426
MP
3014/* Return true if GS is an internal function FN. */
3015
3016static inline bool
3017gimple_call_internal_p (const gimple *gs, internal_fn fn)
3018{
3019 return (is_gimple_call (gs)
3020 && gimple_call_internal_p (gs)
3021 && gimple_call_internal_fn (gs) == fn);
3022}
3023
58041fe6
MJ
3024/* If CTRL_ALTERING_P is true, mark GIMPLE_CALL S to be a stmt
3025 that could alter control flow. */
3026
3027static inline void
003b40ae 3028gimple_call_set_ctrl_altering (gcall *s, bool ctrl_altering_p)
58041fe6 3029{
58041fe6
MJ
3030 if (ctrl_altering_p)
3031 s->subcode |= GF_CALL_CTRL_ALTERING;
3032 else
3033 s->subcode &= ~GF_CALL_CTRL_ALTERING;
3034}
3035
003b40ae 3036static inline void
355fe088 3037gimple_call_set_ctrl_altering (gimple *s, bool ctrl_altering_p)
003b40ae
RB
3038{
3039 gcall *gc = GIMPLE_CHECK2<gcall *> (s);
3040 gimple_call_set_ctrl_altering (gc, ctrl_altering_p);
3041}
3042
58041fe6
MJ
3043/* Return true if call GS calls an func whose GF_CALL_CTRL_ALTERING
3044 flag is set. Such call could not be a stmt in the middle of a bb. */
3045
3046static inline bool
003b40ae 3047gimple_call_ctrl_altering_p (const gcall *gs)
58041fe6 3048{
58041fe6
MJ
3049 return (gs->subcode & GF_CALL_CTRL_ALTERING) != 0;
3050}
3051
003b40ae 3052static inline bool
355fe088 3053gimple_call_ctrl_altering_p (const gimple *gs)
003b40ae
RB
3054{
3055 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3056 return gimple_call_ctrl_altering_p (gc);
3057}
3058
25583c4f 3059
f20ca725 3060/* Return the function type of the function called by GS. */
726a989a
RB
3061
3062static inline tree
003b40ae 3063gimple_call_fntype (const gcall *gs)
726a989a 3064{
25583c4f
RS
3065 if (gimple_call_internal_p (gs))
3066 return NULL_TREE;
003b40ae
RB
3067 return gs->u.fntype;
3068}
3069
3070static inline tree
355fe088 3071gimple_call_fntype (const gimple *gs)
003b40ae
RB
3072{
3073 const gcall *call_stmt = GIMPLE_CHECK2<const gcall *> (gs);
3074 return gimple_call_fntype (call_stmt);
726a989a
RB
3075}
3076
538dd0b7 3077/* Set the type of the function called by CALL_STMT to FNTYPE. */
f20ca725
RG
3078
3079static inline void
538dd0b7 3080gimple_call_set_fntype (gcall *call_stmt, tree fntype)
f20ca725 3081{
538dd0b7 3082 gcc_gimple_checking_assert (!gimple_call_internal_p (call_stmt));
daa6e488 3083 call_stmt->u.fntype = fntype;
f20ca725
RG
3084}
3085
3086
3087/* Return the tree node representing the function called by call
3088 statement GS. */
9bfc434b 3089
003b40ae
RB
3090static inline tree
3091gimple_call_fn (const gcall *gs)
3092{
3093 return gs->op[1];
3094}
3095
9bfc434b 3096static inline tree
355fe088 3097gimple_call_fn (const gimple *gs)
9bfc434b 3098{
003b40ae
RB
3099 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3100 return gimple_call_fn (gc);
9bfc434b 3101}
726a989a
RB
3102
3103/* Return a pointer to the tree node representing the function called by call
3104 statement GS. */
3105
003b40ae 3106static inline tree *
1d10676d 3107gimple_call_fn_ptr (gcall *gs)
003b40ae 3108{
1d10676d 3109 return &gs->op[1];
003b40ae
RB
3110}
3111
726a989a 3112static inline tree *
1d10676d 3113gimple_call_fn_ptr (gimple *gs)
726a989a 3114{
1d10676d 3115 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
003b40ae 3116 return gimple_call_fn_ptr (gc);
726a989a
RB
3117}
3118
3119
3120/* Set FN to be the function called by call statement GS. */
3121
3122static inline void
538dd0b7 3123gimple_call_set_fn (gcall *gs, tree fn)
726a989a 3124{
25583c4f 3125 gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
a3fe41f5 3126 gs->op[1] = fn;
726a989a
RB
3127}
3128
3129
5fa9163d
AM
3130/* Set FNDECL to be the function called by call statement GS. */
3131
3132static inline void
003b40ae 3133gimple_call_set_fndecl (gcall *gs, tree decl)
5fa9163d 3134{
5fa9163d 3135 gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
003b40ae
RB
3136 gs->op[1] = build1_loc (gimple_location (gs), ADDR_EXPR,
3137 build_pointer_type (TREE_TYPE (decl)), decl);
3138}
3139
3140static inline void
355fe088 3141gimple_call_set_fndecl (gimple *gs, tree decl)
003b40ae
RB
3142{
3143 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
3144 gimple_call_set_fndecl (gc, decl);
5fa9163d
AM
3145}
3146
3147
538dd0b7 3148/* Set internal function FN to be the function called by call statement CALL_STMT. */
25583c4f
RS
3149
3150static inline void
538dd0b7 3151gimple_call_set_internal_fn (gcall *call_stmt, enum internal_fn fn)
25583c4f 3152{
538dd0b7 3153 gcc_gimple_checking_assert (gimple_call_internal_p (call_stmt));
daa6e488 3154 call_stmt->u.internal_fn = fn;
25583c4f
RS
3155}
3156
3157
726a989a
RB
3158/* If a given GIMPLE_CALL's callee is a FUNCTION_DECL, return it.
3159 Otherwise return NULL. This function is analogous to
3160 get_callee_fndecl in tree land. */
3161
3162static inline tree
003b40ae 3163gimple_call_fndecl (const gcall *gs)
726a989a 3164{
3b45a007 3165 return gimple_call_addr_fndecl (gimple_call_fn (gs));
726a989a
RB
3166}
3167
003b40ae 3168static inline tree
355fe088 3169gimple_call_fndecl (const gimple *gs)
003b40ae
RB
3170{
3171 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3172 return gimple_call_fndecl (gc);
3173}
3174
726a989a
RB
3175
3176/* Return the type returned by call statement GS. */
3177
3178static inline tree
538dd0b7 3179gimple_call_return_type (const gcall *gs)
726a989a 3180{
9bfc434b 3181 tree type = gimple_call_fntype (gs);
726a989a 3182
25583c4f
RS
3183 if (type == NULL_TREE)
3184 return TREE_TYPE (gimple_call_lhs (gs));
3185
9bfc434b 3186 /* The type returned by a function is the type of its
726a989a
RB
3187 function type. */
3188 return TREE_TYPE (type);
3189}
3190
3191
3192/* Return the static chain for call statement GS. */
3193
003b40ae
RB
3194static inline tree
3195gimple_call_chain (const gcall *gs)
3196{
3197 return gs->op[2];
3198}
3199
726a989a 3200static inline tree
355fe088 3201gimple_call_chain (const gimple *gs)
726a989a 3202{
003b40ae
RB
3203 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3204 return gimple_call_chain (gc);
726a989a
RB
3205}
3206
3207
538dd0b7 3208/* Return a pointer to the static chain for call statement CALL_STMT. */
726a989a
RB
3209
3210static inline tree *
1d10676d 3211gimple_call_chain_ptr (gcall *call_stmt)
726a989a 3212{
1d10676d 3213 return &call_stmt->op[2];
726a989a
RB
3214}
3215
538dd0b7 3216/* Set CHAIN to be the static chain for call statement CALL_STMT. */
726a989a
RB
3217
3218static inline void
538dd0b7 3219gimple_call_set_chain (gcall *call_stmt, tree chain)
726a989a 3220{
a3fe41f5 3221 call_stmt->op[2] = chain;
726a989a
RB
3222}
3223
3224
3225/* Return the number of arguments used by call statement GS. */
3226
003b40ae
RB
3227static inline unsigned
3228gimple_call_num_args (const gcall *gs)
3229{
3230 return gimple_num_ops (gs) - 3;
3231}
3232
726a989a 3233static inline unsigned
355fe088 3234gimple_call_num_args (const gimple *gs)
726a989a 3235{
003b40ae
RB
3236 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3237 return gimple_call_num_args (gc);
726a989a
RB
3238}
3239
3240
3241/* Return the argument at position INDEX for call statement GS. */
3242
003b40ae
RB
3243static inline tree
3244gimple_call_arg (const gcall *gs, unsigned index)
3245{
3246 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 3);
3247 return gs->op[index + 3];
3248}
3249
726a989a 3250static inline tree
355fe088 3251gimple_call_arg (const gimple *gs, unsigned index)
726a989a 3252{
003b40ae
RB
3253 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3254 return gimple_call_arg (gc, index);
726a989a
RB
3255}
3256
3257
3258/* Return a pointer to the argument at position INDEX for call
3259 statement GS. */
3260
003b40ae 3261static inline tree *
1d10676d 3262gimple_call_arg_ptr (gcall *gs, unsigned index)
003b40ae
RB
3263{
3264 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 3);
1d10676d 3265 return &gs->op[index + 3];
003b40ae
RB
3266}
3267
726a989a 3268static inline tree *
1d10676d 3269gimple_call_arg_ptr (gimple *gs, unsigned index)
726a989a 3270{
1d10676d 3271 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
003b40ae 3272 return gimple_call_arg_ptr (gc, index);
726a989a
RB
3273}
3274
3275
3276/* Set ARG to be the argument at position INDEX for call statement GS. */
3277
003b40ae
RB
3278static inline void
3279gimple_call_set_arg (gcall *gs, unsigned index, tree arg)
3280{
3281 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 3);
3282 gs->op[index + 3] = arg;
3283}
3284
726a989a 3285static inline void
355fe088 3286gimple_call_set_arg (gimple *gs, unsigned index, tree arg)
726a989a 3287{
003b40ae
RB
3288 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
3289 gimple_call_set_arg (gc, index, arg);
726a989a
RB
3290}
3291
3292
3293/* If TAIL_P is true, mark call statement S as being a tail call
3294 (i.e., a call just before the exit of a function). These calls are
3295 candidate for tail call optimization. */
3296
3297static inline void
538dd0b7 3298gimple_call_set_tail (gcall *s, bool tail_p)
726a989a 3299{
726a989a 3300 if (tail_p)
daa6e488 3301 s->subcode |= GF_CALL_TAILCALL;
726a989a 3302 else
daa6e488 3303 s->subcode &= ~GF_CALL_TAILCALL;
726a989a
RB
3304}
3305
3306
3307/* Return true if GIMPLE_CALL S is marked as a tail call. */
3308
3309static inline bool
0e7b6a51 3310gimple_call_tail_p (const gcall *s)
726a989a 3311{
daa6e488 3312 return (s->subcode & GF_CALL_TAILCALL) != 0;
726a989a
RB
3313}
3314
9a385c2d
DM
3315/* Mark (or clear) call statement S as requiring tail call optimization. */
3316
3317static inline void
3318gimple_call_set_must_tail (gcall *s, bool must_tail_p)
3319{
3320 if (must_tail_p)
3321 s->subcode |= GF_CALL_MUST_TAIL_CALL;
3322 else
3323 s->subcode &= ~GF_CALL_MUST_TAIL_CALL;
3324}
3325
3326/* Return true if call statement has been marked as requiring
3327 tail call optimization. */
3328
3329static inline bool
3330gimple_call_must_tail_p (const gcall *s)
3331{
3332 return (s->subcode & GF_CALL_MUST_TAIL_CALL) != 0;
3333}
726a989a 3334
726a989a
RB
3335/* If RETURN_SLOT_OPT_P is true mark GIMPLE_CALL S as valid for return
3336 slot optimization. This transformation uses the target of the call
3337 expansion as the return slot for calls that return in memory. */
3338
3339static inline void
538dd0b7 3340gimple_call_set_return_slot_opt (gcall *s, bool return_slot_opt_p)
726a989a 3341{
726a989a 3342 if (return_slot_opt_p)
daa6e488 3343 s->subcode |= GF_CALL_RETURN_SLOT_OPT;
726a989a 3344 else
daa6e488 3345 s->subcode &= ~GF_CALL_RETURN_SLOT_OPT;
726a989a
RB
3346}
3347
3348
3349/* Return true if S is marked for return slot optimization. */
3350
3351static inline bool
0e7b6a51 3352gimple_call_return_slot_opt_p (const gcall *s)
726a989a 3353{
daa6e488 3354 return (s->subcode & GF_CALL_RETURN_SLOT_OPT) != 0;
726a989a
RB
3355}
3356
3357
3358/* If FROM_THUNK_P is true, mark GIMPLE_CALL S as being the jump from a
3359 thunk to the thunked-to function. */
3360
3361static inline void
538dd0b7 3362gimple_call_set_from_thunk (gcall *s, bool from_thunk_p)
726a989a 3363{
726a989a 3364 if (from_thunk_p)
daa6e488 3365 s->subcode |= GF_CALL_FROM_THUNK;
726a989a 3366 else
daa6e488 3367 s->subcode &= ~GF_CALL_FROM_THUNK;
726a989a
RB
3368}
3369
3370
3371/* Return true if GIMPLE_CALL S is a jump from a thunk. */
3372
3373static inline bool
538dd0b7 3374gimple_call_from_thunk_p (gcall *s)
726a989a 3375{
daa6e488 3376 return (s->subcode & GF_CALL_FROM_THUNK) != 0;
726a989a
RB
3377}
3378
3379
0b945f95
RB
3380/* If FROM_NEW_OR_DELETE_P is true, mark GIMPLE_CALL S as being a call
3381 to operator new or delete created from a new or delete expression. */
3382
3383static inline void
3384gimple_call_set_from_new_or_delete (gcall *s, bool from_new_or_delete_p)
3385{
3386 if (from_new_or_delete_p)
3387 s->subcode |= GF_CALL_FROM_NEW_OR_DELETE;
3388 else
3389 s->subcode &= ~GF_CALL_FROM_NEW_OR_DELETE;
3390}
3391
3392
3393/* Return true if GIMPLE_CALL S is a call to operator new or delete from
3394 from a new or delete expression. */
3395
3396static inline bool
58c9de46 3397gimple_call_from_new_or_delete (const gcall *s)
0b945f95
RB
3398{
3399 return (s->subcode & GF_CALL_FROM_NEW_OR_DELETE) != 0;
3400}
3401
3402
726a989a
RB
3403/* If PASS_ARG_PACK_P is true, GIMPLE_CALL S is a stdarg call that needs the
3404 argument pack in its argument list. */
3405
3406static inline void
538dd0b7 3407gimple_call_set_va_arg_pack (gcall *s, bool pass_arg_pack_p)
726a989a 3408{
726a989a 3409 if (pass_arg_pack_p)
daa6e488 3410 s->subcode |= GF_CALL_VA_ARG_PACK;
726a989a 3411 else
daa6e488 3412 s->subcode &= ~GF_CALL_VA_ARG_PACK;
726a989a
RB
3413}
3414
3415
3416/* Return true if GIMPLE_CALL S is a stdarg call that needs the
3417 argument pack in its argument list. */
3418
3419static inline bool
0e7b6a51 3420gimple_call_va_arg_pack_p (const gcall *s)
726a989a 3421{
daa6e488 3422 return (s->subcode & GF_CALL_VA_ARG_PACK) != 0;
726a989a
RB
3423}
3424
3425
3426/* Return true if S is a noreturn call. */
3427
3428static inline bool
003b40ae 3429gimple_call_noreturn_p (const gcall *s)
726a989a 3430{
726a989a
RB
3431 return (gimple_call_flags (s) & ECF_NORETURN) != 0;
3432}
3433
003b40ae 3434static inline bool
355fe088 3435gimple_call_noreturn_p (const gimple *s)
003b40ae
RB
3436{
3437 const gcall *gc = GIMPLE_CHECK2<const gcall *> (s);
3438 return gimple_call_noreturn_p (gc);
3439}
3440
726a989a 3441
9bb1a81b
JM
3442/* If NOTHROW_P is true, GIMPLE_CALL S is a call that is known to not throw
3443 even if the called function can throw in other cases. */
3444
3445static inline void
538dd0b7 3446gimple_call_set_nothrow (gcall *s, bool nothrow_p)
9bb1a81b 3447{
9bb1a81b 3448 if (nothrow_p)
daa6e488 3449 s->subcode |= GF_CALL_NOTHROW;
9bb1a81b 3450 else
daa6e488 3451 s->subcode &= ~GF_CALL_NOTHROW;
9bb1a81b
JM
3452}
3453
726a989a
RB
3454/* Return true if S is a nothrow call. */
3455
3456static inline bool
538dd0b7 3457gimple_call_nothrow_p (gcall *s)
726a989a 3458{
726a989a
RB
3459 return (gimple_call_flags (s) & ECF_NOTHROW) != 0;
3460}
3461
63d2a353
MM
3462/* If FOR_VAR is true, GIMPLE_CALL S is a call to builtin_alloca that
3463 is known to be emitted for VLA objects. Those are wrapped by
3464 stack_save/stack_restore calls and hence can't lead to unbounded
3465 stack growth even when they occur in loops. */
3466
3467static inline void
538dd0b7 3468gimple_call_set_alloca_for_var (gcall *s, bool for_var)
63d2a353 3469{
63d2a353 3470 if (for_var)
daa6e488 3471 s->subcode |= GF_CALL_ALLOCA_FOR_VAR;
63d2a353 3472 else
daa6e488 3473 s->subcode &= ~GF_CALL_ALLOCA_FOR_VAR;
63d2a353
MM
3474}
3475
3476/* Return true of S is a call to builtin_alloca emitted for VLA objects. */
3477
3478static inline bool
538dd0b7 3479gimple_call_alloca_for_var_p (gcall *s)
63d2a353 3480{
daa6e488 3481 return (s->subcode & GF_CALL_ALLOCA_FOR_VAR) != 0;
63d2a353 3482}
726a989a 3483
e362a897
EB
3484static inline bool
3485gimple_call_alloca_for_var_p (gimple *s)
3486{
3487 const gcall *gc = GIMPLE_CHECK2<gcall *> (s);
3488 return (gc->subcode & GF_CALL_ALLOCA_FOR_VAR) != 0;
3489}
3490
4c640e26
EB
3491/* If BY_DESCRIPTOR_P is true, GIMPLE_CALL S is an indirect call for which
3492 pointers to nested function are descriptors instead of trampolines. */
3493
3494static inline void
3495gimple_call_set_by_descriptor (gcall *s, bool by_descriptor_p)
3496{
3497 if (by_descriptor_p)
3498 s->subcode |= GF_CALL_BY_DESCRIPTOR;
3499 else
3500 s->subcode &= ~GF_CALL_BY_DESCRIPTOR;
3501}
3502
3503/* Return true if S is a by-descriptor call. */
3504
3505static inline bool
3506gimple_call_by_descriptor_p (gcall *s)
3507{
3508 return (s->subcode & GF_CALL_BY_DESCRIPTOR) != 0;
3509}
3510
726a989a
RB
3511/* Copy all the GF_CALL_* flags from ORIG_CALL to DEST_CALL. */
3512
3513static inline void
538dd0b7 3514gimple_call_copy_flags (gcall *dest_call, gcall *orig_call)
726a989a 3515{
daa6e488 3516 dest_call->subcode = orig_call->subcode;
726a989a
RB
3517}
3518
3519
d086d311 3520/* Return a pointer to the points-to solution for the set of call-used
538dd0b7 3521 variables of the call CALL_STMT. */
d086d311
RG
3522
3523static inline struct pt_solution *
538dd0b7 3524gimple_call_use_set (gcall *call_stmt)
d086d311 3525{
daa6e488 3526 return &call_stmt->call_used;
d086d311
RG
3527}
3528
0e7b6a51
DM
3529/* As above, but const. */
3530
3531static inline const pt_solution *
3532gimple_call_use_set (const gcall *call_stmt)
3533{
3534 return &call_stmt->call_used;
3535}
d086d311
RG
3536
3537/* Return a pointer to the points-to solution for the set of call-used
538dd0b7 3538 variables of the call CALL_STMT. */
d086d311
RG
3539
3540static inline struct pt_solution *
538dd0b7 3541gimple_call_clobber_set (gcall *call_stmt)
d086d311 3542{
daa6e488 3543 return &call_stmt->call_clobbered;
d086d311
RG
3544}
3545
0e7b6a51
DM
3546/* As above, but const. */
3547
3548static inline const pt_solution *
3549gimple_call_clobber_set (const gcall *call_stmt)
3550{
3551 return &call_stmt->call_clobbered;
3552}
3553
d086d311 3554
726a989a
RB
3555/* Returns true if this is a GIMPLE_ASSIGN or a GIMPLE_CALL with a
3556 non-NULL lhs. */
3557
3558static inline bool
0e7b6a51 3559gimple_has_lhs (const gimple *stmt)
726a989a 3560{
003b40ae
RB
3561 if (is_gimple_assign (stmt))
3562 return true;
0e7b6a51 3563 if (const gcall *call = dyn_cast <const gcall *> (stmt))
003b40ae
RB
3564 return gimple_call_lhs (call) != NULL_TREE;
3565 return false;
726a989a
RB
3566}
3567
3568
3569/* Return the code of the predicate computed by conditional statement GS. */
3570
3571static inline enum tree_code
003b40ae 3572gimple_cond_code (const gcond *gs)
726a989a 3573{
daa6e488 3574 return (enum tree_code) gs->subcode;
726a989a
RB
3575}
3576
003b40ae 3577static inline enum tree_code
355fe088 3578gimple_cond_code (const gimple *gs)
003b40ae
RB
3579{
3580 const gcond *gc = GIMPLE_CHECK2<const gcond *> (gs);
3581 return gimple_cond_code (gc);
3582}
3583
726a989a
RB
3584
3585/* Set CODE to be the predicate code for the conditional statement GS. */
3586
3587static inline void
538dd0b7 3588gimple_cond_set_code (gcond *gs, enum tree_code code)
726a989a 3589{
daa6e488 3590 gs->subcode = code;
726a989a
RB
3591}
3592
3593
3594/* Return the LHS of the predicate computed by conditional statement GS. */
3595
003b40ae
RB
3596static inline tree
3597gimple_cond_lhs (const gcond *gs)
3598{
3599 return gs->op[0];
3600}
3601
726a989a 3602static inline tree
355fe088 3603gimple_cond_lhs (const gimple *gs)
726a989a 3604{
003b40ae
RB
3605 const gcond *gc = GIMPLE_CHECK2<const gcond *> (gs);
3606 return gimple_cond_lhs (gc);
726a989a
RB
3607}
3608
3609/* Return the pointer to the LHS of the predicate computed by conditional
3610 statement GS. */
3611
3612static inline tree *
1d10676d 3613gimple_cond_lhs_ptr (gcond *gs)
726a989a 3614{
1d10676d 3615 return &gs->op[0];
726a989a
RB
3616}
3617
3618/* Set LHS to be the LHS operand of the predicate computed by
3619 conditional statement GS. */
3620
3621static inline void
538dd0b7 3622gimple_cond_set_lhs (gcond *gs, tree lhs)
726a989a 3623{
a3fe41f5 3624 gs->op[0] = lhs;
726a989a
RB
3625}
3626
3627
3628/* Return the RHS operand of the predicate computed by conditional GS. */
3629
003b40ae
RB
3630static inline tree
3631gimple_cond_rhs (const gcond *gs)
3632{
3633 return gs->op[1];
3634}
3635
726a989a 3636static inline tree
355fe088 3637gimple_cond_rhs (const gimple *gs)
726a989a 3638{
003b40ae
RB
3639 const gcond *gc = GIMPLE_CHECK2<const gcond *> (gs);
3640 return gimple_cond_rhs (gc);
726a989a
RB
3641}
3642
3643/* Return the pointer to the RHS operand of the predicate computed by
3644 conditional GS. */
3645
3646static inline tree *
1d10676d 3647gimple_cond_rhs_ptr (gcond *gs)
726a989a 3648{
1d10676d 3649 return &gs->op[1];
726a989a
RB
3650}
3651
3652
3653/* Set RHS to be the RHS operand of the predicate computed by
3654 conditional statement GS. */
3655
3656static inline void
538dd0b7 3657gimple_cond_set_rhs (gcond *gs, tree rhs)
726a989a 3658{
a3fe41f5 3659 gs->op[1] = rhs;
726a989a
RB
3660}
3661
3662
3663/* Return the label used by conditional statement GS when its
3664 predicate evaluates to true. */
3665
3666static inline tree
538dd0b7 3667gimple_cond_true_label (const gcond *gs)
726a989a 3668{
a3fe41f5 3669 return gs->op[2];
726a989a
RB
3670}
3671
3672
3673/* Set LABEL to be the label used by conditional statement GS when its
3674 predicate evaluates to true. */
3675
3676static inline void
538dd0b7 3677gimple_cond_set_true_label (gcond *gs, tree label)
726a989a 3678{
a3fe41f5 3679 gs->op[2] = label;
726a989a
RB
3680}
3681
3682
3683/* Set LABEL to be the label used by conditional statement GS when its
3684 predicate evaluates to false. */
3685
3686static inline void
538dd0b7 3687gimple_cond_set_false_label (gcond *gs, tree label)
726a989a 3688{
a3fe41f5 3689 gs->op[3] = label;
726a989a
RB
3690}
3691
3692
3693/* Return the label used by conditional statement GS when its
3694 predicate evaluates to false. */
3695
3696static inline tree
538dd0b7 3697gimple_cond_false_label (const gcond *gs)
726a989a 3698{
a3fe41f5 3699 return gs->op[3];
726a989a
RB
3700}
3701
3702
3703/* Set the conditional COND_STMT to be of the form 'if (1 == 0)'. */
3704
3705static inline void
538dd0b7 3706gimple_cond_make_false (gcond *gs)
726a989a 3707{
bde7d04b 3708 gimple_cond_set_lhs (gs, boolean_false_node);
726a989a 3709 gimple_cond_set_rhs (gs, boolean_false_node);
bde7d04b 3710 gs->subcode = NE_EXPR;
726a989a
RB
3711}
3712
3713
3714/* Set the conditional COND_STMT to be of the form 'if (1 == 1)'. */
3715
3716static inline void
538dd0b7 3717gimple_cond_make_true (gcond *gs)
726a989a
RB
3718{
3719 gimple_cond_set_lhs (gs, boolean_true_node);
bde7d04b
RB
3720 gimple_cond_set_rhs (gs, boolean_false_node);
3721 gs->subcode = NE_EXPR;
726a989a
RB
3722}
3723
3724/* Check if conditional statemente GS is of the form 'if (1 == 1)',
3725 'if (0 == 0)', 'if (1 != 0)' or 'if (0 != 1)' */
3726
3727static inline bool
538dd0b7 3728gimple_cond_true_p (const gcond *gs)
726a989a
RB
3729{
3730 tree lhs = gimple_cond_lhs (gs);
3731 tree rhs = gimple_cond_rhs (gs);
3732 enum tree_code code = gimple_cond_code (gs);
3733
3734 if (lhs != boolean_true_node && lhs != boolean_false_node)
3735 return false;
3736
3737 if (rhs != boolean_true_node && rhs != boolean_false_node)
3738 return false;
3739
3740 if (code == NE_EXPR && lhs != rhs)
3741 return true;
3742
3743 if (code == EQ_EXPR && lhs == rhs)
3744 return true;
3745
3746 return false;
3747}
3748
3749/* Check if conditional statement GS is of the form 'if (1 != 1)',
3750 'if (0 != 0)', 'if (1 == 0)' or 'if (0 == 1)' */
3751
3752static inline bool
538dd0b7 3753gimple_cond_false_p (const gcond *gs)
726a989a
RB
3754{
3755 tree lhs = gimple_cond_lhs (gs);
3756 tree rhs = gimple_cond_rhs (gs);
3757 enum tree_code code = gimple_cond_code (gs);
3758
3759 if (lhs != boolean_true_node && lhs != boolean_false_node)
3760 return false;
3761
3762 if (rhs != boolean_true_node && rhs != boolean_false_node)
3763 return false;
3764
3765 if (code == NE_EXPR && lhs == rhs)
3766 return true;
3767
3768 if (code == EQ_EXPR && lhs != rhs)
3769 return true;
3770
3771 return false;
3772}
3773
726a989a
RB
3774/* Set the code, LHS and RHS of GIMPLE_COND STMT from CODE, LHS and RHS. */
3775
3776static inline void
538dd0b7
DM
3777gimple_cond_set_condition (gcond *stmt, enum tree_code code, tree lhs,
3778 tree rhs)
726a989a
RB
3779{
3780 gimple_cond_set_code (stmt, code);
3781 gimple_cond_set_lhs (stmt, lhs);
3782 gimple_cond_set_rhs (stmt, rhs);
3783}
3784
fcbb6018
AM
3785
3786/* Return the tree code for the expression computed by STMT. This is
3787 only valid for GIMPLE_COND, GIMPLE_CALL and GIMPLE_ASSIGN. For
3788 GIMPLE_CALL, return CALL_EXPR as the expression code for
3789 consistency. This is useful when the caller needs to deal with the
3790 three kinds of computation that GIMPLE supports. */
3791
3792static inline enum tree_code
3793gimple_expr_code (const gimple *stmt)
3794{
3795 if (const gassign *ass = dyn_cast<const gassign *> (stmt))
3796 return gimple_assign_rhs_code (ass);
3797 if (const gcond *cond = dyn_cast<const gcond *> (stmt))
3798 return gimple_cond_code (cond);
3799 else
3800 {
3801 gcc_gimple_checking_assert (gimple_code (stmt) == GIMPLE_CALL);
3802 return CALL_EXPR;
3803 }
3804}
3805
3806
726a989a
RB
3807/* Return the LABEL_DECL node used by GIMPLE_LABEL statement GS. */
3808
3809static inline tree
538dd0b7 3810gimple_label_label (const glabel *gs)
726a989a 3811{
a3fe41f5 3812 return gs->op[0];
726a989a
RB
3813}
3814
3815
3816/* Set LABEL to be the LABEL_DECL node used by GIMPLE_LABEL statement
3817 GS. */
3818
3819static inline void
538dd0b7 3820gimple_label_set_label (glabel *gs, tree label)
726a989a 3821{
a3fe41f5 3822 gs->op[0] = label;
726a989a
RB
3823}
3824
3825
3826/* Return the destination of the unconditional jump GS. */
3827
3828static inline tree
355fe088 3829gimple_goto_dest (const gimple *gs)
726a989a
RB
3830{
3831 GIMPLE_CHECK (gs, GIMPLE_GOTO);
3832 return gimple_op (gs, 0);
3833}
3834
3835
3836/* Set DEST to be the destination of the unconditonal jump GS. */
3837
b8698a0f 3838static inline void
538dd0b7 3839gimple_goto_set_dest (ggoto *gs, tree dest)
726a989a 3840{
a3fe41f5 3841 gs->op[0] = dest;
726a989a
RB
3842}
3843
3844
3845/* Return the variables declared in the GIMPLE_BIND statement GS. */
3846
3847static inline tree
538dd0b7 3848gimple_bind_vars (const gbind *bind_stmt)
726a989a 3849{
daa6e488 3850 return bind_stmt->vars;
726a989a
RB
3851}
3852
3853
3854/* Set VARS to be the set of variables declared in the GIMPLE_BIND
3855 statement GS. */
3856
3857static inline void
538dd0b7 3858gimple_bind_set_vars (gbind *bind_stmt, tree vars)
726a989a 3859{
daa6e488 3860 bind_stmt->vars = vars;
726a989a
RB
3861}
3862
3863
3864/* Append VARS to the set of variables declared in the GIMPLE_BIND
3865 statement GS. */
3866
3867static inline void
538dd0b7 3868gimple_bind_append_vars (gbind *bind_stmt, tree vars)
726a989a 3869{
daa6e488 3870 bind_stmt->vars = chainon (bind_stmt->vars, vars);
726a989a
RB
3871}
3872
3873
355a7673 3874static inline gimple_seq *
538dd0b7 3875gimple_bind_body_ptr (gbind *bind_stmt)
355a7673 3876{
daa6e488 3877 return &bind_stmt->body;
355a7673
MM
3878}
3879
726a989a
RB
3880/* Return the GIMPLE sequence contained in the GIMPLE_BIND statement GS. */
3881
3882static inline gimple_seq
0e7b6a51 3883gimple_bind_body (const gbind *gs)
726a989a 3884{
0e7b6a51 3885 return *gimple_bind_body_ptr (const_cast <gbind *> (gs));
726a989a
RB
3886}
3887
3888
3889/* Set SEQ to be the GIMPLE sequence contained in the GIMPLE_BIND
3890 statement GS. */
3891
3892static inline void
538dd0b7 3893gimple_bind_set_body (gbind *bind_stmt, gimple_seq seq)
726a989a 3894{
daa6e488 3895 bind_stmt->body = seq;
726a989a
RB
3896}
3897
3898
3899/* Append a statement to the end of a GIMPLE_BIND's body. */
3900
3901static inline void
355fe088 3902gimple_bind_add_stmt (gbind *bind_stmt, gimple *stmt)
726a989a 3903{
daa6e488 3904 gimple_seq_add_stmt (&bind_stmt->body, stmt);
726a989a
RB
3905}
3906
3907
3908/* Append a sequence of statements to the end of a GIMPLE_BIND's body. */
3909
3910static inline void
538dd0b7 3911gimple_bind_add_seq (gbind *bind_stmt, gimple_seq seq)
726a989a 3912{
daa6e488 3913 gimple_seq_add_seq (&bind_stmt->body, seq);
726a989a
RB
3914}
3915
3916
3917/* Return the TREE_BLOCK node associated with GIMPLE_BIND statement
3918 GS. This is analogous to the BIND_EXPR_BLOCK field in trees. */
3919
3920static inline tree
538dd0b7 3921gimple_bind_block (const gbind *bind_stmt)
726a989a 3922{
daa6e488 3923 return bind_stmt->block;
726a989a
RB
3924}
3925
3926
3927/* Set BLOCK to be the TREE_BLOCK node associated with GIMPLE_BIND
3928 statement GS. */
3929
3930static inline void
538dd0b7 3931gimple_bind_set_block (gbind *bind_stmt, tree block)
726a989a 3932{
2bc0a660
JH
3933 gcc_gimple_checking_assert (block == NULL_TREE
3934 || TREE_CODE (block) == BLOCK);
daa6e488 3935 bind_stmt->block = block;
726a989a
RB
3936}
3937
3938
538dd0b7 3939/* Return the number of input operands for GIMPLE_ASM ASM_STMT. */
726a989a
RB
3940
3941static inline unsigned
538dd0b7 3942gimple_asm_ninputs (const gasm *asm_stmt)
726a989a 3943{
daa6e488 3944 return asm_stmt->ni;
726a989a
RB
3945}
3946
3947
538dd0b7 3948/* Return the number of output operands for GIMPLE_ASM ASM_STMT. */
726a989a
RB
3949
3950static inline unsigned
538dd0b7 3951gimple_asm_noutputs (const gasm *asm_stmt)
726a989a 3952{
daa6e488 3953 return asm_stmt->no;
726a989a
RB
3954}
3955
3956
538dd0b7 3957/* Return the number of clobber operands for GIMPLE_ASM ASM_STMT. */
726a989a
RB
3958
3959static inline unsigned
538dd0b7 3960gimple_asm_nclobbers (const gasm *asm_stmt)
726a989a 3961{
daa6e488 3962 return asm_stmt->nc;
726a989a
RB
3963}
3964
538dd0b7 3965/* Return the number of label operands for GIMPLE_ASM ASM_STMT. */
1c384bf1
RH
3966
3967static inline unsigned
538dd0b7 3968gimple_asm_nlabels (const gasm *asm_stmt)
1c384bf1 3969{
daa6e488 3970 return asm_stmt->nl;
1c384bf1 3971}
726a989a 3972
538dd0b7 3973/* Return input operand INDEX of GIMPLE_ASM ASM_STMT. */
726a989a
RB
3974
3975static inline tree
538dd0b7 3976gimple_asm_input_op (const gasm *asm_stmt, unsigned index)
726a989a 3977{
daa6e488 3978 gcc_gimple_checking_assert (index < asm_stmt->ni);
a3fe41f5 3979 return asm_stmt->op[index + asm_stmt->no];
726a989a
RB
3980}
3981
538dd0b7 3982/* Set IN_OP to be input operand INDEX in GIMPLE_ASM ASM_STMT. */
726a989a
RB
3983
3984static inline void
538dd0b7 3985gimple_asm_set_input_op (gasm *asm_stmt, unsigned index, tree in_op)
726a989a 3986{
daa6e488 3987 gcc_gimple_checking_assert (index < asm_stmt->ni
2bc0a660 3988 && TREE_CODE (in_op) == TREE_LIST);
a3fe41f5 3989 asm_stmt->op[index + asm_stmt->no] = in_op;
726a989a
RB
3990}
3991
3992
538dd0b7 3993/* Return output operand INDEX of GIMPLE_ASM ASM_STMT. */
726a989a
RB
3994
3995static inline tree
538dd0b7 3996gimple_asm_output_op (const gasm *asm_stmt, unsigned index)
726a989a 3997{
daa6e488 3998 gcc_gimple_checking_assert (index < asm_stmt->no);
a3fe41f5 3999 return asm_stmt->op[index];
726a989a
RB
4000}
4001
538dd0b7 4002/* Set OUT_OP to be output operand INDEX in GIMPLE_ASM ASM_STMT. */
726a989a
RB
4003
4004static inline void
538dd0b7 4005gimple_asm_set_output_op (gasm *asm_stmt, unsigned index, tree out_op)
726a989a 4006{
daa6e488 4007 gcc_gimple_checking_assert (index < asm_stmt->no
2bc0a660 4008 && TREE_CODE (out_op) == TREE_LIST);
a3fe41f5 4009 asm_stmt->op[index] = out_op;
726a989a
RB
4010}
4011
4012
538dd0b7 4013/* Return clobber operand INDEX of GIMPLE_ASM ASM_STMT. */
726a989a
RB
4014
4015static inline tree
538dd0b7 4016gimple_asm_clobber_op (const gasm *asm_stmt, unsigned index)
726a989a 4017{
daa6e488 4018 gcc_gimple_checking_assert (index < asm_stmt->nc);
a3fe41f5 4019 return asm_stmt->op[index + asm_stmt->ni + asm_stmt->no];
726a989a
RB
4020}
4021
4022
538dd0b7 4023/* Set CLOBBER_OP to be clobber operand INDEX in GIMPLE_ASM ASM_STMT. */
726a989a
RB
4024
4025static inline void
538dd0b7 4026gimple_asm_set_clobber_op (gasm *asm_stmt, unsigned index, tree clobber_op)
726a989a 4027{
daa6e488 4028 gcc_gimple_checking_assert (index < asm_stmt->nc
2bc0a660 4029 && TREE_CODE (clobber_op) == TREE_LIST);
a3fe41f5 4030 asm_stmt->op[index + asm_stmt->ni + asm_stmt->no] = clobber_op;
726a989a
RB
4031}
4032
538dd0b7 4033/* Return label operand INDEX of GIMPLE_ASM ASM_STMT. */
1c384bf1
RH
4034
4035static inline tree
538dd0b7 4036gimple_asm_label_op (const gasm *asm_stmt, unsigned index)
1c384bf1 4037{
daa6e488 4038 gcc_gimple_checking_assert (index < asm_stmt->nl);
e3b3b596 4039 return asm_stmt->op[index + asm_stmt->no + asm_stmt->ni + asm_stmt->nc];
1c384bf1
RH
4040}
4041
538dd0b7 4042/* Set LABEL_OP to be label operand INDEX in GIMPLE_ASM ASM_STMT. */
1c384bf1
RH
4043
4044static inline void
538dd0b7 4045gimple_asm_set_label_op (gasm *asm_stmt, unsigned index, tree label_op)
1c384bf1 4046{
daa6e488 4047 gcc_gimple_checking_assert (index < asm_stmt->nl
2bc0a660 4048 && TREE_CODE (label_op) == TREE_LIST);
e3b3b596 4049 asm_stmt->op[index + asm_stmt->no + asm_stmt->ni + asm_stmt->nc] = label_op;
1c384bf1 4050}
726a989a
RB
4051
4052/* Return the string representing the assembly instruction in
538dd0b7 4053 GIMPLE_ASM ASM_STMT. */
726a989a
RB
4054
4055static inline const char *
538dd0b7 4056gimple_asm_string (const gasm *asm_stmt)
726a989a 4057{
daa6e488 4058 return asm_stmt->string;
726a989a
RB
4059}
4060
4061
5b76e75f 4062/* Return true if ASM_STMT is marked volatile. */
726a989a
RB
4063
4064static inline bool
538dd0b7 4065gimple_asm_volatile_p (const gasm *asm_stmt)
726a989a 4066{
538dd0b7 4067 return (asm_stmt->subcode & GF_ASM_VOLATILE) != 0;
726a989a
RB
4068}
4069
4070
5b76e75f 4071/* If VOLATILE_P is true, mark asm statement ASM_STMT as volatile. */
726a989a
RB
4072
4073static inline void
538dd0b7 4074gimple_asm_set_volatile (gasm *asm_stmt, bool volatile_p)
726a989a 4075{
726a989a 4076 if (volatile_p)
538dd0b7 4077 asm_stmt->subcode |= GF_ASM_VOLATILE;
726a989a 4078 else
538dd0b7 4079 asm_stmt->subcode &= ~GF_ASM_VOLATILE;
726a989a
RB
4080}
4081
4082
5b76e75f
SB
4083/* Return true if ASM_STMT is marked inline. */
4084
4085static inline bool
4086gimple_asm_inline_p (const gasm *asm_stmt)
4087{
4088 return (asm_stmt->subcode & GF_ASM_INLINE) != 0;
4089}
4090
4091
4092/* If INLINE_P is true, mark asm statement ASM_STMT as inline. */
4093
4094static inline void
4095gimple_asm_set_inline (gasm *asm_stmt, bool inline_p)
4096{
4097 if (inline_p)
4098 asm_stmt->subcode |= GF_ASM_INLINE;
4099 else
4100 asm_stmt->subcode &= ~GF_ASM_INLINE;
4101}
4102
4103
538dd0b7 4104/* If INPUT_P is true, mark asm ASM_STMT as an ASM_INPUT. */
726a989a
RB
4105
4106static inline void
538dd0b7 4107gimple_asm_set_input (gasm *asm_stmt, bool input_p)
726a989a 4108{
726a989a 4109 if (input_p)
538dd0b7 4110 asm_stmt->subcode |= GF_ASM_INPUT;
726a989a 4111 else
538dd0b7 4112 asm_stmt->subcode &= ~GF_ASM_INPUT;
726a989a
RB
4113}
4114
4115
538dd0b7 4116/* Return true if asm ASM_STMT is an ASM_INPUT. */
726a989a
RB
4117
4118static inline bool
538dd0b7 4119gimple_asm_input_p (const gasm *asm_stmt)
726a989a 4120{
538dd0b7 4121 return (asm_stmt->subcode & GF_ASM_INPUT) != 0;
726a989a
RB
4122}
4123
4124
538dd0b7 4125/* Return the types handled by GIMPLE_CATCH statement CATCH_STMT. */
726a989a
RB
4126
4127static inline tree
538dd0b7 4128gimple_catch_types (const gcatch *catch_stmt)
726a989a 4129{
daa6e488 4130 return catch_stmt->types;
726a989a
RB
4131}
4132
4133
538dd0b7 4134/* Return a pointer to the types handled by GIMPLE_CATCH statement CATCH_STMT. */
726a989a
RB
4135
4136static inline tree *
538dd0b7 4137gimple_catch_types_ptr (gcatch *catch_stmt)
726a989a 4138{
daa6e488 4139 return &catch_stmt->types;
726a989a
RB
4140}
4141
4142
726a989a 4143/* Return a pointer to the GIMPLE sequence representing the body of
538dd0b7 4144 the handler of GIMPLE_CATCH statement CATCH_STMT. */
726a989a
RB
4145
4146static inline gimple_seq *
538dd0b7 4147gimple_catch_handler_ptr (gcatch *catch_stmt)
726a989a 4148{
daa6e488 4149 return &catch_stmt->handler;
726a989a
RB
4150}
4151
4152
355a7673 4153/* Return the GIMPLE sequence representing the body of the handler of
538dd0b7 4154 GIMPLE_CATCH statement CATCH_STMT. */
355a7673
MM
4155
4156static inline gimple_seq
0e7b6a51 4157gimple_catch_handler (const gcatch *catch_stmt)
355a7673 4158{
0e7b6a51 4159 return *gimple_catch_handler_ptr (const_cast <gcatch *> (catch_stmt));
355a7673
MM
4160}
4161
4162
538dd0b7 4163/* Set T to be the set of types handled by GIMPLE_CATCH CATCH_STMT. */
726a989a
RB
4164
4165static inline void
538dd0b7 4166gimple_catch_set_types (gcatch *catch_stmt, tree t)
726a989a 4167{
daa6e488 4168 catch_stmt->types = t;
726a989a
RB
4169}
4170
4171
538dd0b7 4172/* Set HANDLER to be the body of GIMPLE_CATCH CATCH_STMT. */
726a989a
RB
4173
4174static inline void
538dd0b7 4175gimple_catch_set_handler (gcatch *catch_stmt, gimple_seq handler)
726a989a 4176{
daa6e488 4177 catch_stmt->handler = handler;
726a989a
RB
4178}
4179
4180
4181/* Return the types handled by GIMPLE_EH_FILTER statement GS. */
4182
4183static inline tree
355fe088 4184gimple_eh_filter_types (const gimple *gs)
726a989a 4185{
538dd0b7 4186 const geh_filter *eh_filter_stmt = as_a <const geh_filter *> (gs);
daa6e488 4187 return eh_filter_stmt->types;
726a989a
RB
4188}
4189
4190
4191/* Return a pointer to the types handled by GIMPLE_EH_FILTER statement
4192 GS. */
4193
4194static inline tree *
355fe088 4195gimple_eh_filter_types_ptr (gimple *gs)
726a989a 4196{
538dd0b7 4197 geh_filter *eh_filter_stmt = as_a <geh_filter *> (gs);
daa6e488 4198 return &eh_filter_stmt->types;
726a989a
RB
4199}
4200
4201
355a7673
MM
4202/* Return a pointer to the sequence of statement to execute when
4203 GIMPLE_EH_FILTER statement fails. */
4204
4205static inline gimple_seq *
355fe088 4206gimple_eh_filter_failure_ptr (gimple *gs)
355a7673 4207{
538dd0b7 4208 geh_filter *eh_filter_stmt = as_a <geh_filter *> (gs);
daa6e488 4209 return &eh_filter_stmt->failure;
355a7673
MM
4210}
4211
4212
726a989a
RB
4213/* Return the sequence of statement to execute when GIMPLE_EH_FILTER
4214 statement fails. */
4215
4216static inline gimple_seq
0e7b6a51 4217gimple_eh_filter_failure (const gimple *gs)
726a989a 4218{
0e7b6a51 4219 return *gimple_eh_filter_failure_ptr (const_cast <gimple *> (gs));
726a989a
RB
4220}
4221
4222
538dd0b7
DM
4223/* Set TYPES to be the set of types handled by GIMPLE_EH_FILTER
4224 EH_FILTER_STMT. */
726a989a
RB
4225
4226static inline void
538dd0b7 4227gimple_eh_filter_set_types (geh_filter *eh_filter_stmt, tree types)
726a989a 4228{
daa6e488 4229 eh_filter_stmt->types = types;
726a989a
RB
4230}
4231
4232
4233/* Set FAILURE to be the sequence of statements to execute on failure
538dd0b7 4234 for GIMPLE_EH_FILTER EH_FILTER_STMT. */
726a989a
RB
4235
4236static inline void
538dd0b7
DM
4237gimple_eh_filter_set_failure (geh_filter *eh_filter_stmt,
4238 gimple_seq failure)
726a989a 4239{
daa6e488 4240 eh_filter_stmt->failure = failure;
726a989a
RB
4241}
4242
1d65f45c 4243/* Get the function decl to be called by the MUST_NOT_THROW region. */
726a989a 4244
1d65f45c 4245static inline tree
0e7b6a51 4246gimple_eh_must_not_throw_fndecl (const geh_mnt *eh_mnt_stmt)
726a989a 4247{
daa6e488 4248 return eh_mnt_stmt->fndecl;
726a989a
RB
4249}
4250
d7f09764
DN
4251/* Set the function decl to be called by GS to DECL. */
4252
4253static inline void
538dd0b7
DM
4254gimple_eh_must_not_throw_set_fndecl (geh_mnt *eh_mnt_stmt,
4255 tree decl)
d7f09764 4256{
daa6e488 4257 eh_mnt_stmt->fndecl = decl;
d7f09764
DN
4258}
4259
0a35513e
AH
4260/* GIMPLE_EH_ELSE accessors. */
4261
355a7673 4262static inline gimple_seq *
538dd0b7 4263gimple_eh_else_n_body_ptr (geh_else *eh_else_stmt)
355a7673 4264{
daa6e488 4265 return &eh_else_stmt->n_body;
355a7673
MM
4266}
4267
0a35513e 4268static inline gimple_seq
0e7b6a51 4269gimple_eh_else_n_body (const geh_else *eh_else_stmt)
355a7673 4270{
0e7b6a51 4271 return *gimple_eh_else_n_body_ptr (const_cast <geh_else *> (eh_else_stmt));
355a7673
MM
4272}
4273
4274static inline gimple_seq *
538dd0b7 4275gimple_eh_else_e_body_ptr (geh_else *eh_else_stmt)
0a35513e 4276{
daa6e488 4277 return &eh_else_stmt->e_body;
0a35513e
AH
4278}
4279
4280static inline gimple_seq
0e7b6a51 4281gimple_eh_else_e_body (const geh_else *eh_else_stmt)
0a35513e 4282{
0e7b6a51 4283 return *gimple_eh_else_e_body_ptr (const_cast <geh_else *> (eh_else_stmt));
0a35513e
AH
4284}
4285
4286static inline void
538dd0b7 4287gimple_eh_else_set_n_body (geh_else *eh_else_stmt, gimple_seq seq)
0a35513e 4288{
daa6e488 4289 eh_else_stmt->n_body = seq;
0a35513e
AH
4290}
4291
4292static inline void
538dd0b7 4293gimple_eh_else_set_e_body (geh_else *eh_else_stmt, gimple_seq seq)
0a35513e 4294{
daa6e488 4295 eh_else_stmt->e_body = seq;
0a35513e 4296}
d7f09764 4297
726a989a
RB
4298/* GIMPLE_TRY accessors. */
4299
4300/* Return the kind of try block represented by GIMPLE_TRY GS. This is
4301 either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY. */
4302
4303static inline enum gimple_try_flags
355fe088 4304gimple_try_kind (const gimple *gs)
726a989a
RB
4305{
4306 GIMPLE_CHECK (gs, GIMPLE_TRY);
daa6e488 4307 return (enum gimple_try_flags) (gs->subcode & GIMPLE_TRY_KIND);
726a989a
RB
4308}
4309
4310
4311/* Set the kind of try block represented by GIMPLE_TRY GS. */
4312
4313static inline void
538dd0b7 4314gimple_try_set_kind (gtry *gs, enum gimple_try_flags kind)
726a989a 4315{
2bc0a660
JH
4316 gcc_gimple_checking_assert (kind == GIMPLE_TRY_CATCH
4317 || kind == GIMPLE_TRY_FINALLY);
726a989a 4318 if (gimple_try_kind (gs) != kind)
daa6e488 4319 gs->subcode = (unsigned int) kind;
726a989a
RB
4320}
4321
4322
4323/* Return the GIMPLE_TRY_CATCH_IS_CLEANUP flag. */
4324
4325static inline bool
355fe088 4326gimple_try_catch_is_cleanup (const gimple *gs)
726a989a 4327{
2bc0a660 4328 gcc_gimple_checking_assert (gimple_try_kind (gs) == GIMPLE_TRY_CATCH);
daa6e488 4329 return (gs->subcode & GIMPLE_TRY_CATCH_IS_CLEANUP) != 0;
726a989a
RB
4330}
4331
4332
355a7673
MM
4333/* Return a pointer to the sequence of statements used as the
4334 body for GIMPLE_TRY GS. */
4335
4336static inline gimple_seq *
355fe088 4337gimple_try_eval_ptr (gimple *gs)
355a7673 4338{
538dd0b7 4339 gtry *try_stmt = as_a <gtry *> (gs);
daa6e488 4340 return &try_stmt->eval;
355a7673
MM
4341}
4342
4343
726a989a
RB
4344/* Return the sequence of statements used as the body for GIMPLE_TRY GS. */
4345
4346static inline gimple_seq
0e7b6a51 4347gimple_try_eval (const gimple *gs)
355a7673 4348{
0e7b6a51 4349 return *gimple_try_eval_ptr (const_cast <gimple *> (gs));
355a7673
MM
4350}
4351
4352
4353/* Return a pointer to the sequence of statements used as the cleanup body for
4354 GIMPLE_TRY GS. */
4355
4356static inline gimple_seq *
355fe088 4357gimple_try_cleanup_ptr (gimple *gs)
726a989a 4358{
538dd0b7 4359 gtry *try_stmt = as_a <gtry *> (gs);
daa6e488 4360 return &try_stmt->cleanup;
726a989a
RB
4361}
4362
4363
4364/* Return the sequence of statements used as the cleanup body for
4365 GIMPLE_TRY GS. */
4366
4367static inline gimple_seq
0e7b6a51 4368gimple_try_cleanup (const gimple *gs)
726a989a 4369{
0e7b6a51 4370 return *gimple_try_cleanup_ptr (const_cast <gimple *> (gs));
726a989a
RB
4371}
4372
4373
4374/* Set the GIMPLE_TRY_CATCH_IS_CLEANUP flag. */
4375
4376static inline void
538dd0b7 4377gimple_try_set_catch_is_cleanup (gtry *g, bool catch_is_cleanup)
726a989a 4378{
2bc0a660 4379 gcc_gimple_checking_assert (gimple_try_kind (g) == GIMPLE_TRY_CATCH);
726a989a 4380 if (catch_is_cleanup)
daa6e488 4381 g->subcode |= GIMPLE_TRY_CATCH_IS_CLEANUP;
726a989a 4382 else
daa6e488 4383 g->subcode &= ~GIMPLE_TRY_CATCH_IS_CLEANUP;
726a989a
RB
4384}
4385
4386
4387/* Set EVAL to be the sequence of statements to use as the body for
538dd0b7 4388 GIMPLE_TRY TRY_STMT. */
726a989a
RB
4389
4390static inline void
538dd0b7 4391gimple_try_set_eval (gtry *try_stmt, gimple_seq eval)
726a989a 4392{
daa6e488 4393 try_stmt->eval = eval;
726a989a
RB
4394}
4395
4396
4397/* Set CLEANUP to be the sequence of statements to use as the cleanup
538dd0b7 4398 body for GIMPLE_TRY TRY_STMT. */
726a989a
RB
4399
4400static inline void
538dd0b7 4401gimple_try_set_cleanup (gtry *try_stmt, gimple_seq cleanup)
726a989a 4402{
daa6e488 4403 try_stmt->cleanup = cleanup;
726a989a
RB
4404}
4405
4406
355a7673
MM
4407/* Return a pointer to the cleanup sequence for cleanup statement GS. */
4408
4409static inline gimple_seq *
355fe088 4410gimple_wce_cleanup_ptr (gimple *gs)
355a7673 4411{
7de90a6c 4412 gimple_statement_wce *wce_stmt = as_a <gimple_statement_wce *> (gs);
daa6e488 4413 return &wce_stmt->cleanup;
355a7673
MM
4414}
4415
4416
726a989a
RB
4417/* Return the cleanup sequence for cleanup statement GS. */
4418
4419static inline gimple_seq
355fe088 4420gimple_wce_cleanup (gimple *gs)
726a989a 4421{
355a7673 4422 return *gimple_wce_cleanup_ptr (gs);
726a989a
RB
4423}
4424
4425
4426/* Set CLEANUP to be the cleanup sequence for GS. */
4427
4428static inline void
355fe088 4429gimple_wce_set_cleanup (gimple *gs, gimple_seq cleanup)
726a989a 4430{
7de90a6c 4431 gimple_statement_wce *wce_stmt = as_a <gimple_statement_wce *> (gs);
daa6e488 4432 wce_stmt->cleanup = cleanup;
726a989a
RB
4433}
4434
4435
4436/* Return the CLEANUP_EH_ONLY flag for a WCE tuple. */
4437
4438static inline bool
355fe088 4439gimple_wce_cleanup_eh_only (const gimple *gs)
726a989a
RB
4440{
4441 GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
daa6e488 4442 return gs->subcode != 0;
726a989a
RB
4443}
4444
4445
4446/* Set the CLEANUP_EH_ONLY flag for a WCE tuple. */
4447
4448static inline void
355fe088 4449gimple_wce_set_cleanup_eh_only (gimple *gs, bool eh_only_p)
726a989a
RB
4450{
4451 GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
daa6e488 4452 gs->subcode = (unsigned int) eh_only_p;
726a989a
RB
4453}
4454
4455
4456/* Return the maximum number of arguments supported by GIMPLE_PHI GS. */
4457
4458static inline unsigned
355fe088 4459gimple_phi_capacity (const gimple *gs)
726a989a 4460{
538dd0b7 4461 const gphi *phi_stmt = as_a <const gphi *> (gs);
daa6e488 4462 return phi_stmt->capacity;
726a989a
RB
4463}
4464
4465
4466/* Return the number of arguments in GIMPLE_PHI GS. This must always
4467 be exactly the number of incoming edges for the basic block holding
4468 GS. */
4469
4470static inline unsigned
355fe088 4471gimple_phi_num_args (const gimple *gs)
726a989a 4472{
538dd0b7 4473 const gphi *phi_stmt = as_a <const gphi *> (gs);
daa6e488 4474 return phi_stmt->nargs;
726a989a
RB
4475}
4476
4477
4478/* Return the SSA name created by GIMPLE_PHI GS. */
4479
3fa4fad4
RB
4480static inline tree
4481gimple_phi_result (const gphi *gs)
4482{
4483 return gs->result;
4484}
4485
726a989a 4486static inline tree
355fe088 4487gimple_phi_result (const gimple *gs)
726a989a 4488{
538dd0b7 4489 const gphi *phi_stmt = as_a <const gphi *> (gs);
3fa4fad4 4490 return gimple_phi_result (phi_stmt);
726a989a
RB
4491}
4492
4493/* Return a pointer to the SSA name created by GIMPLE_PHI GS. */
4494
3fa4fad4
RB
4495static inline tree *
4496gimple_phi_result_ptr (gphi *gs)
4497{
4498 return &gs->result;
4499}
4500
726a989a 4501static inline tree *
355fe088 4502gimple_phi_result_ptr (gimple *gs)
726a989a 4503{
538dd0b7 4504 gphi *phi_stmt = as_a <gphi *> (gs);
3fa4fad4 4505 return gimple_phi_result_ptr (phi_stmt);
726a989a
RB
4506}
4507
538dd0b7 4508/* Set RESULT to be the SSA name created by GIMPLE_PHI PHI. */
726a989a
RB
4509
4510static inline void
538dd0b7 4511gimple_phi_set_result (gphi *phi, tree result)
726a989a 4512{
538dd0b7 4513 phi->result = result;
dcc748dd 4514 if (result && TREE_CODE (result) == SSA_NAME)
538dd0b7 4515 SSA_NAME_DEF_STMT (result) = phi;
726a989a
RB
4516}
4517
4518
4519/* Return the PHI argument corresponding to incoming edge INDEX for
4520 GIMPLE_PHI GS. */
4521
3fa4fad4
RB
4522static inline struct phi_arg_d *
4523gimple_phi_arg (gphi *gs, unsigned index)
4524{
4525 gcc_gimple_checking_assert (index < gs->nargs);
4526 return &(gs->args[index]);
4527}
4528
0e7b6a51
DM
4529static inline const phi_arg_d *
4530gimple_phi_arg (const gphi *gs, unsigned index)
4531{
4532 gcc_gimple_checking_assert (index < gs->nargs);
4533 return &(gs->args[index]);
4534}
4535
726a989a 4536static inline struct phi_arg_d *
355fe088 4537gimple_phi_arg (gimple *gs, unsigned index)
726a989a 4538{
538dd0b7 4539 gphi *phi_stmt = as_a <gphi *> (gs);
3fa4fad4 4540 return gimple_phi_arg (phi_stmt, index);
726a989a
RB
4541}
4542
4543/* Set PHIARG to be the argument corresponding to incoming edge INDEX
538dd0b7 4544 for GIMPLE_PHI PHI. */
726a989a
RB
4545
4546static inline void
538dd0b7 4547gimple_phi_set_arg (gphi *phi, unsigned index, struct phi_arg_d * phiarg)
726a989a 4548{
8f860bca 4549 gcc_gimple_checking_assert (index < phi->nargs);
538dd0b7 4550 phi->args[index] = *phiarg;
726a989a
RB
4551}
4552
80560f95
AM
4553/* Return the PHI nodes for basic block BB, or NULL if there are no
4554 PHI nodes. */
4555
4556static inline gimple_seq
4557phi_nodes (const_basic_block bb)
4558{
4559 gcc_checking_assert (!(bb->flags & BB_RTL));
4560 return bb->il.gimple.phi_nodes;
4561}
4562
4563/* Return a pointer to the PHI nodes for basic block BB. */
4564
4565static inline gimple_seq *
4566phi_nodes_ptr (basic_block bb)
4567{
4568 gcc_checking_assert (!(bb->flags & BB_RTL));
4569 return &bb->il.gimple.phi_nodes;
4570}
4571
4572/* Return the tree operand for argument I of PHI node GS. */
4573
3fa4fad4 4574static inline tree
0e7b6a51 4575gimple_phi_arg_def (const gphi *gs, size_t index)
3fa4fad4
RB
4576{
4577 return gimple_phi_arg (gs, index)->def;
4578}
4579
80560f95 4580static inline tree
355fe088 4581gimple_phi_arg_def (gimple *gs, size_t index)
80560f95
AM
4582{
4583 return gimple_phi_arg (gs, index)->def;
4584}
4585
4586
538dd0b7 4587/* Return a pointer to the tree operand for argument I of phi node PHI. */
80560f95
AM
4588
4589static inline tree *
538dd0b7 4590gimple_phi_arg_def_ptr (gphi *phi, size_t index)
80560f95 4591{
538dd0b7 4592 return &gimple_phi_arg (phi, index)->def;
80560f95
AM
4593}
4594
538dd0b7 4595/* Return the edge associated with argument I of phi node PHI. */
80560f95
AM
4596
4597static inline edge
0e7b6a51 4598gimple_phi_arg_edge (const gphi *phi, size_t i)
80560f95 4599{
538dd0b7 4600 return EDGE_PRED (gimple_bb (phi), i);
80560f95
AM
4601}
4602
538dd0b7 4603/* Return the source location of gimple argument I of phi node PHI. */
80560f95 4604
620e594b 4605static inline location_t
0e7b6a51 4606gimple_phi_arg_location (const gphi *phi, size_t i)
80560f95 4607{
538dd0b7 4608 return gimple_phi_arg (phi, i)->locus;
80560f95
AM
4609}
4610
538dd0b7 4611/* Return the source location of the argument on edge E of phi node PHI. */
80560f95 4612
620e594b 4613static inline location_t
538dd0b7 4614gimple_phi_arg_location_from_edge (gphi *phi, edge e)
80560f95 4615{
538dd0b7 4616 return gimple_phi_arg (phi, e->dest_idx)->locus;
80560f95
AM
4617}
4618
538dd0b7 4619/* Set the source location of gimple argument I of phi node PHI to LOC. */
80560f95
AM
4620
4621static inline void
620e594b 4622gimple_phi_arg_set_location (gphi *phi, size_t i, location_t loc)
80560f95 4623{
538dd0b7 4624 gimple_phi_arg (phi, i)->locus = loc;
80560f95
AM
4625}
4626
3536ff2d
JJ
4627/* Return address of source location of gimple argument I of phi node PHI. */
4628
4629static inline location_t *
4630gimple_phi_arg_location_ptr (gphi *phi, size_t i)
4631{
4632 return &gimple_phi_arg (phi, i)->locus;
4633}
4634
538dd0b7 4635/* Return TRUE if argument I of phi node PHI has a location record. */
80560f95
AM
4636
4637static inline bool
0e7b6a51 4638gimple_phi_arg_has_location (const gphi *phi, size_t i)
80560f95 4639{
538dd0b7 4640 return gimple_phi_arg_location (phi, i) != UNKNOWN_LOCATION;
80560f95
AM
4641}
4642
4643
538dd0b7 4644/* Return the region number for GIMPLE_RESX RESX_STMT. */
726a989a
RB
4645
4646static inline int
538dd0b7 4647gimple_resx_region (const gresx *resx_stmt)
726a989a 4648{
9b95612e 4649 return resx_stmt->region;
726a989a
RB
4650}
4651
538dd0b7 4652/* Set REGION to be the region number for GIMPLE_RESX RESX_STMT. */
726a989a
RB
4653
4654static inline void
538dd0b7 4655gimple_resx_set_region (gresx *resx_stmt, int region)
726a989a 4656{
9b95612e 4657 resx_stmt->region = region;
726a989a
RB
4658}
4659
538dd0b7 4660/* Return the region number for GIMPLE_EH_DISPATCH EH_DISPATCH_STMT. */
1d65f45c
RH
4661
4662static inline int
538dd0b7 4663gimple_eh_dispatch_region (const geh_dispatch *eh_dispatch_stmt)
1d65f45c 4664{
9b95612e 4665 return eh_dispatch_stmt->region;
1d65f45c
RH
4666}
4667
538dd0b7
DM
4668/* Set REGION to be the region number for GIMPLE_EH_DISPATCH
4669 EH_DISPATCH_STMT. */
1d65f45c
RH
4670
4671static inline void
538dd0b7 4672gimple_eh_dispatch_set_region (geh_dispatch *eh_dispatch_stmt, int region)
1d65f45c 4673{
9b95612e 4674 eh_dispatch_stmt->region = region;
1d65f45c 4675}
726a989a
RB
4676
4677/* Return the number of labels associated with the switch statement GS. */
4678
4679static inline unsigned
538dd0b7 4680gimple_switch_num_labels (const gswitch *gs)
726a989a
RB
4681{
4682 unsigned num_ops;
4683 GIMPLE_CHECK (gs, GIMPLE_SWITCH);
4684 num_ops = gimple_num_ops (gs);
2bc0a660 4685 gcc_gimple_checking_assert (num_ops > 1);
726a989a
RB
4686 return num_ops - 1;
4687}
4688
4689
4690/* Set NLABELS to be the number of labels for the switch statement GS. */
4691
4692static inline void
538dd0b7 4693gimple_switch_set_num_labels (gswitch *g, unsigned nlabels)
726a989a
RB
4694{
4695 GIMPLE_CHECK (g, GIMPLE_SWITCH);
4696 gimple_set_num_ops (g, nlabels + 1);
4697}
4698
4699
4700/* Return the index variable used by the switch statement GS. */
4701
4702static inline tree
538dd0b7 4703gimple_switch_index (const gswitch *gs)
726a989a 4704{
a3fe41f5 4705 return gs->op[0];
726a989a
RB
4706}
4707
4708
4709/* Return a pointer to the index variable for the switch statement GS. */
4710
4711static inline tree *
1d10676d 4712gimple_switch_index_ptr (gswitch *gs)
726a989a 4713{
1d10676d 4714 return &gs->op[0];
726a989a
RB
4715}
4716
4717
4718/* Set INDEX to be the index variable for switch statement GS. */
4719
4720static inline void
538dd0b7 4721gimple_switch_set_index (gswitch *gs, tree index)
726a989a 4722{
2bc0a660 4723 gcc_gimple_checking_assert (SSA_VAR_P (index) || CONSTANT_CLASS_P (index));
a3fe41f5 4724 gs->op[0] = index;
726a989a
RB
4725}
4726
4727
4728/* Return the label numbered INDEX. The default label is 0, followed by any
4729 labels in a switch statement. */
4730
4731static inline tree
538dd0b7 4732gimple_switch_label (const gswitch *gs, unsigned index)
726a989a 4733{
2bc0a660 4734 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 1);
a3fe41f5 4735 return gs->op[index + 1];
726a989a
RB
4736}
4737
4738/* Set the label number INDEX to LABEL. 0 is always the default label. */
4739
4740static inline void
538dd0b7 4741gimple_switch_set_label (gswitch *gs, unsigned index, tree label)
726a989a 4742{
2bc0a660
JH
4743 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 1
4744 && (label == NULL_TREE
4745 || TREE_CODE (label) == CASE_LABEL_EXPR));
a3fe41f5 4746 gs->op[index + 1] = label;
726a989a
RB
4747}
4748
4749/* Return the default label for a switch statement. */
4750
4751static inline tree
538dd0b7 4752gimple_switch_default_label (const gswitch *gs)
726a989a 4753{
fd8d363e
SB
4754 tree label = gimple_switch_label (gs, 0);
4755 gcc_checking_assert (!CASE_LOW (label) && !CASE_HIGH (label));
4756 return label;
726a989a
RB
4757}
4758
4759/* Set the default label for a switch statement. */
4760
4761static inline void
538dd0b7 4762gimple_switch_set_default_label (gswitch *gs, tree label)
726a989a 4763{
fd8d363e 4764 gcc_checking_assert (!CASE_LOW (label) && !CASE_HIGH (label));
726a989a
RB
4765 gimple_switch_set_label (gs, 0, label);
4766}
4767
b5b8b0ac
AO
4768/* Return true if GS is a GIMPLE_DEBUG statement. */
4769
4770static inline bool
355fe088 4771is_gimple_debug (const gimple *gs)
b5b8b0ac
AO
4772{
4773 return gimple_code (gs) == GIMPLE_DEBUG;
4774}
4775
65f4b875 4776
10ea09ee
JJ
4777/* Return the first nondebug statement in GIMPLE sequence S. */
4778
4779static inline gimple *
4780gimple_seq_first_nondebug_stmt (gimple_seq s)
4781{
4782 gimple_seq_node n = gimple_seq_first (s);
4783 while (n && is_gimple_debug (n))
4784 n = n->next;
4785 return n;
4786}
4787
4788
65f4b875
AO
4789/* Return the last nondebug statement in GIMPLE sequence S. */
4790
4791static inline gimple *
4792gimple_seq_last_nondebug_stmt (gimple_seq s)
4793{
4794 gimple_seq_node n;
4795 for (n = gimple_seq_last (s);
4796 n && is_gimple_debug (n);
4797 n = n->prev)
10ea09ee 4798 if (n == s)
65f4b875
AO
4799 return NULL;
4800 return n;
4801}
4802
4803
b5b8b0ac
AO
4804/* Return true if S is a GIMPLE_DEBUG BIND statement. */
4805
4806static inline bool
355fe088 4807gimple_debug_bind_p (const gimple *s)
b5b8b0ac
AO
4808{
4809 if (is_gimple_debug (s))
daa6e488 4810 return s->subcode == GIMPLE_DEBUG_BIND;
b5b8b0ac
AO
4811
4812 return false;
4813}
4814
4815/* Return the variable bound in a GIMPLE_DEBUG bind statement. */
4816
4817static inline tree
0e7b6a51 4818gimple_debug_bind_get_var (const gimple *dbg)
b5b8b0ac
AO
4819{
4820 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4821 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4822 return gimple_op (dbg, 0);
4823}
4824
4825/* Return the value bound to the variable in a GIMPLE_DEBUG bind
4826 statement. */
4827
4828static inline tree
0e7b6a51 4829gimple_debug_bind_get_value (const gimple *dbg)
b5b8b0ac
AO
4830{
4831 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4832 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4833 return gimple_op (dbg, 1);
4834}
4835
4836/* Return a pointer to the value bound to the variable in a
4837 GIMPLE_DEBUG bind statement. */
4838
4839static inline tree *
355fe088 4840gimple_debug_bind_get_value_ptr (gimple *dbg)
b5b8b0ac
AO
4841{
4842 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4843 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4844 return gimple_op_ptr (dbg, 1);
4845}
4846
4847/* Set the variable bound in a GIMPLE_DEBUG bind statement. */
4848
4849static inline void
355fe088 4850gimple_debug_bind_set_var (gimple *dbg, tree var)
b5b8b0ac
AO
4851{
4852 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4853 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4854 gimple_set_op (dbg, 0, var);
4855}
4856
4857/* Set the value bound to the variable in a GIMPLE_DEBUG bind
4858 statement. */
4859
4860static inline void
355fe088 4861gimple_debug_bind_set_value (gimple *dbg, tree value)
b5b8b0ac
AO
4862{
4863 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4864 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4865 gimple_set_op (dbg, 1, value);
4866}
4867
4868/* The second operand of a GIMPLE_DEBUG_BIND, when the value was
4869 optimized away. */
4870#define GIMPLE_DEBUG_BIND_NOVALUE NULL_TREE /* error_mark_node */
4871
4872/* Remove the value bound to the variable in a GIMPLE_DEBUG bind
4873 statement. */
4874
4875static inline void
355fe088 4876gimple_debug_bind_reset_value (gimple *dbg)
b5b8b0ac
AO
4877{
4878 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4879 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4880 gimple_set_op (dbg, 1, GIMPLE_DEBUG_BIND_NOVALUE);
4881}
4882
4883/* Return true if the GIMPLE_DEBUG bind statement is bound to a
4884 value. */
4885
4886static inline bool
355fe088 4887gimple_debug_bind_has_value_p (gimple *dbg)
b5b8b0ac
AO
4888{
4889 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4890 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4891 return gimple_op (dbg, 1) != GIMPLE_DEBUG_BIND_NOVALUE;
4892}
4893
4894#undef GIMPLE_DEBUG_BIND_NOVALUE
726a989a 4895
ddb555ed
JJ
4896/* Return true if S is a GIMPLE_DEBUG SOURCE BIND statement. */
4897
4898static inline bool
355fe088 4899gimple_debug_source_bind_p (const gimple *s)
ddb555ed
JJ
4900{
4901 if (is_gimple_debug (s))
daa6e488 4902 return s->subcode == GIMPLE_DEBUG_SOURCE_BIND;
ddb555ed
JJ
4903
4904 return false;
4905}
4906
4907/* Return the variable bound in a GIMPLE_DEBUG source bind statement. */
4908
4909static inline tree
0e7b6a51 4910gimple_debug_source_bind_get_var (const gimple *dbg)
ddb555ed
JJ
4911{
4912 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4913 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4914 return gimple_op (dbg, 0);
4915}
4916
4917/* Return the value bound to the variable in a GIMPLE_DEBUG source bind
4918 statement. */
4919
4920static inline tree
0e7b6a51 4921gimple_debug_source_bind_get_value (const gimple *dbg)
ddb555ed
JJ
4922{
4923 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4924 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4925 return gimple_op (dbg, 1);
4926}
4927
4928/* Return a pointer to the value bound to the variable in a
4929 GIMPLE_DEBUG source bind statement. */
4930
4931static inline tree *
355fe088 4932gimple_debug_source_bind_get_value_ptr (gimple *dbg)
ddb555ed
JJ
4933{
4934 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4935 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4936 return gimple_op_ptr (dbg, 1);
4937}
4938
4939/* Set the variable bound in a GIMPLE_DEBUG source bind statement. */
4940
4941static inline void
355fe088 4942gimple_debug_source_bind_set_var (gimple *dbg, tree var)
ddb555ed
JJ
4943{
4944 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4945 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4946 gimple_set_op (dbg, 0, var);
4947}
4948
4949/* Set the value bound to the variable in a GIMPLE_DEBUG source bind
4950 statement. */
4951
4952static inline void
355fe088 4953gimple_debug_source_bind_set_value (gimple *dbg, tree value)
ddb555ed
JJ
4954{
4955 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4956 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4957 gimple_set_op (dbg, 1, value);
4958}
4959
36f52e8f
AO
4960/* Return true if S is a GIMPLE_DEBUG BEGIN_STMT statement. */
4961
4962static inline bool
4963gimple_debug_begin_stmt_p (const gimple *s)
4964{
4965 if (is_gimple_debug (s))
4966 return s->subcode == GIMPLE_DEBUG_BEGIN_STMT;
4967
4968 return false;
4969}
4970
58006663
AO
4971/* Return true if S is a GIMPLE_DEBUG INLINE_ENTRY statement. */
4972
4973static inline bool
4974gimple_debug_inline_entry_p (const gimple *s)
4975{
4976 if (is_gimple_debug (s))
4977 return s->subcode == GIMPLE_DEBUG_INLINE_ENTRY;
4978
4979 return false;
4980}
4981
36f52e8f
AO
4982/* Return true if S is a GIMPLE_DEBUG non-binding marker statement. */
4983
4984static inline bool
4985gimple_debug_nonbind_marker_p (const gimple *s)
4986{
4987 if (is_gimple_debug (s))
58006663
AO
4988 return s->subcode == GIMPLE_DEBUG_BEGIN_STMT
4989 || s->subcode == GIMPLE_DEBUG_INLINE_ENTRY;
36f52e8f
AO
4990
4991 return false;
4992}
4993
cc524fc7
AM
4994/* Return the line number for EXPR, or return -1 if we have no line
4995 number information for it. */
4996static inline int
355fe088 4997get_lineno (const gimple *stmt)
cc524fc7
AM
4998{
4999 location_t loc;
5000
5001 if (!stmt)
5002 return -1;
5003
5004 loc = gimple_location (stmt);
5005 if (loc == UNKNOWN_LOCATION)
5006 return -1;
5007
5008 return LOCATION_LINE (loc);
5009}
5010
355a7673
MM
5011/* Return a pointer to the body for the OMP statement GS. */
5012
5013static inline gimple_seq *
355fe088 5014gimple_omp_body_ptr (gimple *gs)
355a7673 5015{
daa6e488 5016 return &static_cast <gimple_statement_omp *> (gs)->body;
355a7673
MM
5017}
5018
726a989a
RB
5019/* Return the body for the OMP statement GS. */
5020
b8698a0f 5021static inline gimple_seq
0e7b6a51 5022gimple_omp_body (const gimple *gs)
726a989a 5023{
0e7b6a51 5024 return *gimple_omp_body_ptr (const_cast <gimple *> (gs));
726a989a
RB
5025}
5026
5027/* Set BODY to be the body for the OMP statement GS. */
5028
5029static inline void
355fe088 5030gimple_omp_set_body (gimple *gs, gimple_seq body)
726a989a 5031{
daa6e488 5032 static_cast <gimple_statement_omp *> (gs)->body = body;
726a989a
RB
5033}
5034
5035
538dd0b7 5036/* Return the name associated with OMP_CRITICAL statement CRIT_STMT. */
726a989a
RB
5037
5038static inline tree
538dd0b7 5039gimple_omp_critical_name (const gomp_critical *crit_stmt)
726a989a 5040{
538dd0b7 5041 return crit_stmt->name;
726a989a
RB
5042}
5043
5044
d9a6bd32
JJ
5045/* Return a pointer to the name associated with OMP critical statement
5046 CRIT_STMT. */
726a989a
RB
5047
5048static inline tree *
538dd0b7 5049gimple_omp_critical_name_ptr (gomp_critical *crit_stmt)
726a989a 5050{
538dd0b7 5051 return &crit_stmt->name;
726a989a
RB
5052}
5053
5054
d9a6bd32
JJ
5055/* Set NAME to be the name associated with OMP critical statement
5056 CRIT_STMT. */
726a989a
RB
5057
5058static inline void
538dd0b7 5059gimple_omp_critical_set_name (gomp_critical *crit_stmt, tree name)
726a989a 5060{
538dd0b7 5061 crit_stmt->name = name;
726a989a
RB
5062}
5063
5064
d9a6bd32
JJ
5065/* Return the clauses associated with OMP_CRITICAL statement CRIT_STMT. */
5066
5067static inline tree
5068gimple_omp_critical_clauses (const gomp_critical *crit_stmt)
5069{
5070 return crit_stmt->clauses;
5071}
5072
5073
5074/* Return a pointer to the clauses associated with OMP critical statement
5075 CRIT_STMT. */
5076
5077static inline tree *
5078gimple_omp_critical_clauses_ptr (gomp_critical *crit_stmt)
5079{
5080 return &crit_stmt->clauses;
5081}
5082
5083
5084/* Set CLAUSES to be the clauses associated with OMP critical statement
5085 CRIT_STMT. */
5086
5087static inline void
5088gimple_omp_critical_set_clauses (gomp_critical *crit_stmt, tree clauses)
5089{
5090 crit_stmt->clauses = clauses;
5091}
5092
5093
5094/* Return the clauses associated with OMP_ORDERED statement ORD_STMT. */
5095
5096static inline tree
5097gimple_omp_ordered_clauses (const gomp_ordered *ord_stmt)
5098{
5099 return ord_stmt->clauses;
5100}
5101
5102
5103/* Return a pointer to the clauses associated with OMP ordered statement
5104 ORD_STMT. */
5105
5106static inline tree *
5107gimple_omp_ordered_clauses_ptr (gomp_ordered *ord_stmt)
5108{
5109 return &ord_stmt->clauses;
5110}
5111
5112
5113/* Set CLAUSES to be the clauses associated with OMP ordered statement
5114 ORD_STMT. */
5115
5116static inline void
5117gimple_omp_ordered_set_clauses (gomp_ordered *ord_stmt, tree clauses)
5118{
5119 ord_stmt->clauses = clauses;
5120}
5121
5122
bf38f7e9
JJ
5123/* Return the clauses associated with OMP_SCAN statement SCAN_STMT. */
5124
5125static inline tree
5126gimple_omp_scan_clauses (const gomp_scan *scan_stmt)
5127{
5128 return scan_stmt->clauses;
5129}
5130
5131
5132/* Return a pointer to the clauses associated with OMP scan statement
5133 ORD_STMT. */
5134
5135static inline tree *
5136gimple_omp_scan_clauses_ptr (gomp_scan *scan_stmt)
5137{
5138 return &scan_stmt->clauses;
5139}
5140
5141
5142/* Set CLAUSES to be the clauses associated with OMP scan statement
5143 ORD_STMT. */
5144
5145static inline void
5146gimple_omp_scan_set_clauses (gomp_scan *scan_stmt, tree clauses)
5147{
5148 scan_stmt->clauses = clauses;
5149}
5150
5151
28567c40
JJ
5152/* Return the clauses associated with OMP_TASKGROUP statement GS. */
5153
5154static inline tree
5155gimple_omp_taskgroup_clauses (const gimple *gs)
5156{
5157 GIMPLE_CHECK (gs, GIMPLE_OMP_TASKGROUP);
5158 return
5159 static_cast <const gimple_statement_omp_single_layout *> (gs)->clauses;
5160}
5161
5162
5163/* Return a pointer to the clauses associated with OMP taskgroup statement
5164 GS. */
5165
5166static inline tree *
5167gimple_omp_taskgroup_clauses_ptr (gimple *gs)
5168{
5169 GIMPLE_CHECK (gs, GIMPLE_OMP_TASKGROUP);
5170 return &static_cast <gimple_statement_omp_single_layout *> (gs)->clauses;
5171}
5172
5173
5174/* Set CLAUSES to be the clauses associated with OMP taskgroup statement
5175 GS. */
5176
5177static inline void
5178gimple_omp_taskgroup_set_clauses (gimple *gs, tree clauses)
5179{
5180 GIMPLE_CHECK (gs, GIMPLE_OMP_TASKGROUP);
5181 static_cast <gimple_statement_omp_single_layout *> (gs)->clauses
5182 = clauses;
5183}
5184
5185
41dbbb37 5186/* Return the kind of the OMP_FOR statemement G. */
74bf76ed
JJ
5187
5188static inline int
355fe088 5189gimple_omp_for_kind (const gimple *g)
74bf76ed
JJ
5190{
5191 GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
5192 return (gimple_omp_subcode (g) & GF_OMP_FOR_KIND_MASK);
5193}
5194
5195
41dbbb37 5196/* Set the kind of the OMP_FOR statement G. */
74bf76ed
JJ
5197
5198static inline void
538dd0b7 5199gimple_omp_for_set_kind (gomp_for *g, int kind)
74bf76ed 5200{
daa6e488 5201 g->subcode = (g->subcode & ~GF_OMP_FOR_KIND_MASK)
74bf76ed
JJ
5202 | (kind & GF_OMP_FOR_KIND_MASK);
5203}
5204
5205
41dbbb37 5206/* Return true if OMP_FOR statement G has the
acf0174b
JJ
5207 GF_OMP_FOR_COMBINED flag set. */
5208
5209static inline bool
355fe088 5210gimple_omp_for_combined_p (const gimple *g)
acf0174b
JJ
5211{
5212 GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
5213 return (gimple_omp_subcode (g) & GF_OMP_FOR_COMBINED) != 0;
5214}
5215
5216
41dbbb37
TS
5217/* Set the GF_OMP_FOR_COMBINED field in the OMP_FOR statement G depending on
5218 the boolean value of COMBINED_P. */
acf0174b
JJ
5219
5220static inline void
538dd0b7 5221gimple_omp_for_set_combined_p (gomp_for *g, bool combined_p)
acf0174b 5222{
acf0174b 5223 if (combined_p)
daa6e488 5224 g->subcode |= GF_OMP_FOR_COMBINED;
acf0174b 5225 else
daa6e488 5226 g->subcode &= ~GF_OMP_FOR_COMBINED;
acf0174b
JJ
5227}
5228
5229
41dbbb37 5230/* Return true if the OMP_FOR statement G has the
acf0174b
JJ
5231 GF_OMP_FOR_COMBINED_INTO flag set. */
5232
5233static inline bool
355fe088 5234gimple_omp_for_combined_into_p (const gimple *g)
acf0174b
JJ
5235{
5236 GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
5237 return (gimple_omp_subcode (g) & GF_OMP_FOR_COMBINED_INTO) != 0;
5238}
5239
5240
41dbbb37
TS
5241/* Set the GF_OMP_FOR_COMBINED_INTO field in the OMP_FOR statement G depending
5242 on the boolean value of COMBINED_P. */
acf0174b
JJ
5243
5244static inline void
538dd0b7 5245gimple_omp_for_set_combined_into_p (gomp_for *g, bool combined_p)
acf0174b 5246{
acf0174b 5247 if (combined_p)
daa6e488 5248 g->subcode |= GF_OMP_FOR_COMBINED_INTO;
acf0174b 5249 else
daa6e488 5250 g->subcode &= ~GF_OMP_FOR_COMBINED_INTO;
acf0174b
JJ
5251}
5252
5253
41dbbb37 5254/* Return the clauses associated with the OMP_FOR statement GS. */
726a989a
RB
5255
5256static inline tree
355fe088 5257gimple_omp_for_clauses (const gimple *gs)
726a989a 5258{
538dd0b7 5259 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488 5260 return omp_for_stmt->clauses;
726a989a
RB
5261}
5262
5263
41dbbb37
TS
5264/* Return a pointer to the clauses associated with the OMP_FOR statement
5265 GS. */
726a989a
RB
5266
5267static inline tree *
355fe088 5268gimple_omp_for_clauses_ptr (gimple *gs)
726a989a 5269{
538dd0b7 5270 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488 5271 return &omp_for_stmt->clauses;
726a989a
RB
5272}
5273
5274
41dbbb37
TS
5275/* Set CLAUSES to be the list of clauses associated with the OMP_FOR statement
5276 GS. */
726a989a
RB
5277
5278static inline void
355fe088 5279gimple_omp_for_set_clauses (gimple *gs, tree clauses)
726a989a 5280{
538dd0b7 5281 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488 5282 omp_for_stmt->clauses = clauses;
726a989a
RB
5283}
5284
5285
41dbbb37 5286/* Get the collapse count of the OMP_FOR statement GS. */
726a989a
RB
5287
5288static inline size_t
0e7b6a51 5289gimple_omp_for_collapse (const gimple *gs)
726a989a 5290{
0e7b6a51 5291 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488 5292 return omp_for_stmt->collapse;
726a989a
RB
5293}
5294
5295
41dbbb37
TS
5296/* Return the condition code associated with the OMP_FOR statement GS. */
5297
5298static inline enum tree_code
355fe088 5299gimple_omp_for_cond (const gimple *gs, size_t i)
41dbbb37
TS
5300{
5301 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
5302 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5303 return omp_for_stmt->iter[i].cond;
5304}
5305
5306
5307/* Set COND to be the condition code for the OMP_FOR statement GS. */
5308
5309static inline void
355fe088 5310gimple_omp_for_set_cond (gimple *gs, size_t i, enum tree_code cond)
41dbbb37
TS
5311{
5312 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
5313 gcc_gimple_checking_assert (TREE_CODE_CLASS (cond) == tcc_comparison
5314 && i < omp_for_stmt->collapse);
5315 omp_for_stmt->iter[i].cond = cond;
5316}
5317
5318
5319/* Return the index variable for the OMP_FOR statement GS. */
726a989a
RB
5320
5321static inline tree
355fe088 5322gimple_omp_for_index (const gimple *gs, size_t i)
726a989a 5323{
538dd0b7 5324 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488
DM
5325 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5326 return omp_for_stmt->iter[i].index;
726a989a
RB
5327}
5328
5329
41dbbb37 5330/* Return a pointer to the index variable for the OMP_FOR statement GS. */
726a989a
RB
5331
5332static inline tree *
355fe088 5333gimple_omp_for_index_ptr (gimple *gs, size_t i)
726a989a 5334{
538dd0b7 5335 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5336 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5337 return &omp_for_stmt->iter[i].index;
726a989a
RB
5338}
5339
5340
41dbbb37 5341/* Set INDEX to be the index variable for the OMP_FOR statement GS. */
726a989a
RB
5342
5343static inline void
355fe088 5344gimple_omp_for_set_index (gimple *gs, size_t i, tree index)
726a989a 5345{
538dd0b7 5346 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5347 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5348 omp_for_stmt->iter[i].index = index;
726a989a
RB
5349}
5350
5351
41dbbb37 5352/* Return the initial value for the OMP_FOR statement GS. */
726a989a
RB
5353
5354static inline tree
355fe088 5355gimple_omp_for_initial (const gimple *gs, size_t i)
726a989a 5356{
538dd0b7 5357 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488
DM
5358 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5359 return omp_for_stmt->iter[i].initial;
726a989a
RB
5360}
5361
5362
41dbbb37 5363/* Return a pointer to the initial value for the OMP_FOR statement GS. */
726a989a
RB
5364
5365static inline tree *
355fe088 5366gimple_omp_for_initial_ptr (gimple *gs, size_t i)
726a989a 5367{
538dd0b7 5368 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5369 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5370 return &omp_for_stmt->iter[i].initial;
726a989a
RB
5371}
5372
5373
41dbbb37 5374/* Set INITIAL to be the initial value for the OMP_FOR statement GS. */
726a989a
RB
5375
5376static inline void
355fe088 5377gimple_omp_for_set_initial (gimple *gs, size_t i, tree initial)
726a989a 5378{
538dd0b7 5379 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5380 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5381 omp_for_stmt->iter[i].initial = initial;
726a989a
RB
5382}
5383
5384
41dbbb37 5385/* Return the final value for the OMP_FOR statement GS. */
726a989a
RB
5386
5387static inline tree
355fe088 5388gimple_omp_for_final (const gimple *gs, size_t i)
726a989a 5389{
538dd0b7 5390 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488
DM
5391 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5392 return omp_for_stmt->iter[i].final;
726a989a
RB
5393}
5394
5395
41dbbb37 5396/* Return a pointer to the final value for the OMP_FOR statement GS. */
726a989a
RB
5397
5398static inline tree *
355fe088 5399gimple_omp_for_final_ptr (gimple *gs, size_t i)
726a989a 5400{
538dd0b7 5401 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5402 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5403 return &omp_for_stmt->iter[i].final;
726a989a
RB
5404}
5405
5406
41dbbb37 5407/* Set FINAL to be the final value for the OMP_FOR statement GS. */
726a989a
RB
5408
5409static inline void
355fe088 5410gimple_omp_for_set_final (gimple *gs, size_t i, tree final)
726a989a 5411{
538dd0b7 5412 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5413 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5414 omp_for_stmt->iter[i].final = final;
726a989a
RB
5415}
5416
5417
41dbbb37 5418/* Return the increment value for the OMP_FOR statement GS. */
726a989a
RB
5419
5420static inline tree
355fe088 5421gimple_omp_for_incr (const gimple *gs, size_t i)
726a989a 5422{
538dd0b7 5423 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488
DM
5424 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5425 return omp_for_stmt->iter[i].incr;
726a989a
RB
5426}
5427
5428
41dbbb37 5429/* Return a pointer to the increment value for the OMP_FOR statement GS. */
726a989a
RB
5430
5431static inline tree *
355fe088 5432gimple_omp_for_incr_ptr (gimple *gs, size_t i)
726a989a 5433{
538dd0b7 5434 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5435 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5436 return &omp_for_stmt->iter[i].incr;
726a989a
RB
5437}
5438
5439
41dbbb37 5440/* Set INCR to be the increment value for the OMP_FOR statement GS. */
726a989a
RB
5441
5442static inline void
355fe088 5443gimple_omp_for_set_incr (gimple *gs, size_t i, tree incr)
726a989a 5444{
538dd0b7 5445 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5446 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5447 omp_for_stmt->iter[i].incr = incr;
726a989a
RB
5448}
5449
5450
355a7673
MM
5451/* Return a pointer to the sequence of statements to execute before the OMP_FOR
5452 statement GS starts. */
5453
5454static inline gimple_seq *
355fe088 5455gimple_omp_for_pre_body_ptr (gimple *gs)
355a7673 5456{
538dd0b7 5457 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488 5458 return &omp_for_stmt->pre_body;
355a7673
MM
5459}
5460
5461
726a989a
RB
5462/* Return the sequence of statements to execute before the OMP_FOR
5463 statement GS starts. */
5464
5465static inline gimple_seq
0e7b6a51 5466gimple_omp_for_pre_body (const gimple *gs)
726a989a 5467{
0e7b6a51 5468 return *gimple_omp_for_pre_body_ptr (const_cast <gimple *> (gs));
726a989a
RB
5469}
5470
5471
5472/* Set PRE_BODY to be the sequence of statements to execute before the
5473 OMP_FOR statement GS starts. */
5474
5475static inline void
355fe088 5476gimple_omp_for_set_pre_body (gimple *gs, gimple_seq pre_body)
726a989a 5477{
538dd0b7 5478 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488 5479 omp_for_stmt->pre_body = pre_body;
726a989a
RB
5480}
5481
726a989a
RB
5482/* Return the clauses associated with OMP_PARALLEL GS. */
5483
5484static inline tree
355fe088 5485gimple_omp_parallel_clauses (const gimple *gs)
726a989a 5486{
538dd0b7 5487 const gomp_parallel *omp_parallel_stmt = as_a <const gomp_parallel *> (gs);
daa6e488 5488 return omp_parallel_stmt->clauses;
726a989a
RB
5489}
5490
5491
538dd0b7 5492/* Return a pointer to the clauses associated with OMP_PARALLEL_STMT. */
726a989a
RB
5493
5494static inline tree *
538dd0b7 5495gimple_omp_parallel_clauses_ptr (gomp_parallel *omp_parallel_stmt)
726a989a 5496{
daa6e488 5497 return &omp_parallel_stmt->clauses;
726a989a
RB
5498}
5499
5500
538dd0b7 5501/* Set CLAUSES to be the list of clauses associated with OMP_PARALLEL_STMT. */
726a989a
RB
5502
5503static inline void
538dd0b7
DM
5504gimple_omp_parallel_set_clauses (gomp_parallel *omp_parallel_stmt,
5505 tree clauses)
726a989a 5506{
daa6e488 5507 omp_parallel_stmt->clauses = clauses;
726a989a
RB
5508}
5509
5510
538dd0b7 5511/* Return the child function used to hold the body of OMP_PARALLEL_STMT. */
726a989a
RB
5512
5513static inline tree
538dd0b7 5514gimple_omp_parallel_child_fn (const gomp_parallel *omp_parallel_stmt)
726a989a 5515{
daa6e488 5516 return omp_parallel_stmt->child_fn;
726a989a
RB
5517}
5518
5519/* Return a pointer to the child function used to hold the body of
538dd0b7 5520 OMP_PARALLEL_STMT. */
726a989a
RB
5521
5522static inline tree *
538dd0b7 5523gimple_omp_parallel_child_fn_ptr (gomp_parallel *omp_parallel_stmt)
726a989a 5524{
daa6e488 5525 return &omp_parallel_stmt->child_fn;
726a989a
RB
5526}
5527
5528
538dd0b7 5529/* Set CHILD_FN to be the child function for OMP_PARALLEL_STMT. */
726a989a
RB
5530
5531static inline void
538dd0b7
DM
5532gimple_omp_parallel_set_child_fn (gomp_parallel *omp_parallel_stmt,
5533 tree child_fn)
726a989a 5534{
daa6e488 5535 omp_parallel_stmt->child_fn = child_fn;
726a989a
RB
5536}
5537
5538
5539/* Return the artificial argument used to send variables and values
538dd0b7 5540 from the parent to the children threads in OMP_PARALLEL_STMT. */
726a989a
RB
5541
5542static inline tree
538dd0b7 5543gimple_omp_parallel_data_arg (const gomp_parallel *omp_parallel_stmt)
726a989a 5544{
daa6e488 5545 return omp_parallel_stmt->data_arg;
726a989a
RB
5546}
5547
5548
538dd0b7 5549/* Return a pointer to the data argument for OMP_PARALLEL_STMT. */
726a989a
RB
5550
5551static inline tree *
538dd0b7 5552gimple_omp_parallel_data_arg_ptr (gomp_parallel *omp_parallel_stmt)
726a989a 5553{
daa6e488 5554 return &omp_parallel_stmt->data_arg;
726a989a
RB
5555}
5556
5557
538dd0b7 5558/* Set DATA_ARG to be the data argument for OMP_PARALLEL_STMT. */
726a989a
RB
5559
5560static inline void
538dd0b7
DM
5561gimple_omp_parallel_set_data_arg (gomp_parallel *omp_parallel_stmt,
5562 tree data_arg)
726a989a 5563{
daa6e488 5564 omp_parallel_stmt->data_arg = data_arg;
726a989a
RB
5565}
5566
726a989a
RB
5567/* Return the clauses associated with OMP_TASK GS. */
5568
5569static inline tree
355fe088 5570gimple_omp_task_clauses (const gimple *gs)
726a989a 5571{
538dd0b7 5572 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5573 return omp_task_stmt->clauses;
726a989a
RB
5574}
5575
5576
5577/* Return a pointer to the clauses associated with OMP_TASK GS. */
5578
5579static inline tree *
355fe088 5580gimple_omp_task_clauses_ptr (gimple *gs)
726a989a 5581{
538dd0b7 5582 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5583 return &omp_task_stmt->clauses;
726a989a
RB
5584}
5585
5586
5587/* Set CLAUSES to be the list of clauses associated with OMP_TASK
5588 GS. */
5589
5590static inline void
355fe088 5591gimple_omp_task_set_clauses (gimple *gs, tree clauses)
726a989a 5592{
538dd0b7 5593 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5594 omp_task_stmt->clauses = clauses;
726a989a
RB
5595}
5596
5597
d9a6bd32
JJ
5598/* Return true if OMP task statement G has the
5599 GF_OMP_TASK_TASKLOOP flag set. */
5600
5601static inline bool
5602gimple_omp_task_taskloop_p (const gimple *g)
5603{
5604 GIMPLE_CHECK (g, GIMPLE_OMP_TASK);
5605 return (gimple_omp_subcode (g) & GF_OMP_TASK_TASKLOOP) != 0;
5606}
5607
5608
5609/* Set the GF_OMP_TASK_TASKLOOP field in G depending on the boolean
5610 value of TASKLOOP_P. */
5611
5612static inline void
5613gimple_omp_task_set_taskloop_p (gimple *g, bool taskloop_p)
5614{
5615 GIMPLE_CHECK (g, GIMPLE_OMP_TASK);
5616 if (taskloop_p)
5617 g->subcode |= GF_OMP_TASK_TASKLOOP;
5618 else
5619 g->subcode &= ~GF_OMP_TASK_TASKLOOP;
5620}
5621
5622
28567c40
JJ
5623/* Return true if OMP task statement G has the
5624 GF_OMP_TASK_TASKWAIT flag set. */
5625
5626static inline bool
5627gimple_omp_task_taskwait_p (const gimple *g)
5628{
5629 GIMPLE_CHECK (g, GIMPLE_OMP_TASK);
5630 return (gimple_omp_subcode (g) & GF_OMP_TASK_TASKWAIT) != 0;
5631}
5632
5633
5634/* Set the GF_OMP_TASK_TASKWAIT field in G depending on the boolean
5635 value of TASKWAIT_P. */
5636
5637static inline void
5638gimple_omp_task_set_taskwait_p (gimple *g, bool taskwait_p)
5639{
5640 GIMPLE_CHECK (g, GIMPLE_OMP_TASK);
5641 if (taskwait_p)
5642 g->subcode |= GF_OMP_TASK_TASKWAIT;
5643 else
5644 g->subcode &= ~GF_OMP_TASK_TASKWAIT;
5645}
5646
5647
726a989a
RB
5648/* Return the child function used to hold the body of OMP_TASK GS. */
5649
5650static inline tree
355fe088 5651gimple_omp_task_child_fn (const gimple *gs)
726a989a 5652{
538dd0b7 5653 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5654 return omp_task_stmt->child_fn;
726a989a
RB
5655}
5656
5657/* Return a pointer to the child function used to hold the body of
5658 OMP_TASK GS. */
5659
5660static inline tree *
355fe088 5661gimple_omp_task_child_fn_ptr (gimple *gs)
726a989a 5662{
538dd0b7 5663 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5664 return &omp_task_stmt->child_fn;
726a989a
RB
5665}
5666
5667
5668/* Set CHILD_FN to be the child function for OMP_TASK GS. */
5669
5670static inline void
355fe088 5671gimple_omp_task_set_child_fn (gimple *gs, tree child_fn)
726a989a 5672{
538dd0b7 5673 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5674 omp_task_stmt->child_fn = child_fn;
726a989a
RB
5675}
5676
5677
5678/* Return the artificial argument used to send variables and values
5679 from the parent to the children threads in OMP_TASK GS. */
5680
5681static inline tree
355fe088 5682gimple_omp_task_data_arg (const gimple *gs)
726a989a 5683{
538dd0b7 5684 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5685 return omp_task_stmt->data_arg;
726a989a
RB
5686}
5687
5688
5689/* Return a pointer to the data argument for OMP_TASK GS. */
5690
5691static inline tree *
355fe088 5692gimple_omp_task_data_arg_ptr (gimple *gs)
726a989a 5693{
538dd0b7 5694 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5695 return &omp_task_stmt->data_arg;
726a989a
RB
5696}
5697
5698
5699/* Set DATA_ARG to be the data argument for OMP_TASK GS. */
5700
5701static inline void
355fe088 5702gimple_omp_task_set_data_arg (gimple *gs, tree data_arg)
726a989a 5703{
538dd0b7 5704 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5705 omp_task_stmt->data_arg = data_arg;
726a989a
RB
5706}
5707
5708
5709/* Return the clauses associated with OMP_TASK GS. */
5710
5711static inline tree
355fe088 5712gimple_omp_taskreg_clauses (const gimple *gs)
726a989a 5713{
538dd0b7
DM
5714 const gimple_statement_omp_taskreg *omp_taskreg_stmt
5715 = as_a <const gimple_statement_omp_taskreg *> (gs);
9b95612e 5716 return omp_taskreg_stmt->clauses;
726a989a
RB
5717}
5718
5719
5720/* Return a pointer to the clauses associated with OMP_TASK GS. */
5721
5722static inline tree *
355fe088 5723gimple_omp_taskreg_clauses_ptr (gimple *gs)
726a989a 5724{
538dd0b7
DM
5725 gimple_statement_omp_taskreg *omp_taskreg_stmt
5726 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5727 return &omp_taskreg_stmt->clauses;
726a989a
RB
5728}
5729
5730
5731/* Set CLAUSES to be the list of clauses associated with OMP_TASK
5732 GS. */
5733
5734static inline void
355fe088 5735gimple_omp_taskreg_set_clauses (gimple *gs, tree clauses)
726a989a 5736{
538dd0b7
DM
5737 gimple_statement_omp_taskreg *omp_taskreg_stmt
5738 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5739 omp_taskreg_stmt->clauses = clauses;
726a989a
RB
5740}
5741
5742
5743/* Return the child function used to hold the body of OMP_TASK GS. */
5744
5745static inline tree
355fe088 5746gimple_omp_taskreg_child_fn (const gimple *gs)
726a989a 5747{
538dd0b7
DM
5748 const gimple_statement_omp_taskreg *omp_taskreg_stmt
5749 = as_a <const gimple_statement_omp_taskreg *> (gs);
9b95612e 5750 return omp_taskreg_stmt->child_fn;
726a989a
RB
5751}
5752
5753/* Return a pointer to the child function used to hold the body of
5754 OMP_TASK GS. */
5755
5756static inline tree *
355fe088 5757gimple_omp_taskreg_child_fn_ptr (gimple *gs)
726a989a 5758{
538dd0b7
DM
5759 gimple_statement_omp_taskreg *omp_taskreg_stmt
5760 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5761 return &omp_taskreg_stmt->child_fn;
726a989a
RB
5762}
5763
5764
5765/* Set CHILD_FN to be the child function for OMP_TASK GS. */
5766
5767static inline void
355fe088 5768gimple_omp_taskreg_set_child_fn (gimple *gs, tree child_fn)
726a989a 5769{
538dd0b7
DM
5770 gimple_statement_omp_taskreg *omp_taskreg_stmt
5771 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5772 omp_taskreg_stmt->child_fn = child_fn;
726a989a
RB
5773}
5774
5775
5776/* Return the artificial argument used to send variables and values
5777 from the parent to the children threads in OMP_TASK GS. */
5778
5779static inline tree
355fe088 5780gimple_omp_taskreg_data_arg (const gimple *gs)
726a989a 5781{
538dd0b7
DM
5782 const gimple_statement_omp_taskreg *omp_taskreg_stmt
5783 = as_a <const gimple_statement_omp_taskreg *> (gs);
9b95612e 5784 return omp_taskreg_stmt->data_arg;
726a989a
RB
5785}
5786
5787
5788/* Return a pointer to the data argument for OMP_TASK GS. */
5789
5790static inline tree *
355fe088 5791gimple_omp_taskreg_data_arg_ptr (gimple *gs)
726a989a 5792{
538dd0b7
DM
5793 gimple_statement_omp_taskreg *omp_taskreg_stmt
5794 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5795 return &omp_taskreg_stmt->data_arg;
726a989a
RB
5796}
5797
5798
5799/* Set DATA_ARG to be the data argument for OMP_TASK GS. */
5800
5801static inline void
355fe088 5802gimple_omp_taskreg_set_data_arg (gimple *gs, tree data_arg)
726a989a 5803{
538dd0b7
DM
5804 gimple_statement_omp_taskreg *omp_taskreg_stmt
5805 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5806 omp_taskreg_stmt->data_arg = data_arg;
726a989a
RB
5807}
5808
5809
5810/* Return the copy function used to hold the body of OMP_TASK GS. */
5811
5812static inline tree
355fe088 5813gimple_omp_task_copy_fn (const gimple *gs)
726a989a 5814{
538dd0b7 5815 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5816 return omp_task_stmt->copy_fn;
726a989a
RB
5817}
5818
5819/* Return a pointer to the copy function used to hold the body of
5820 OMP_TASK GS. */
5821
5822static inline tree *
355fe088 5823gimple_omp_task_copy_fn_ptr (gimple *gs)
726a989a 5824{
538dd0b7 5825 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5826 return &omp_task_stmt->copy_fn;
726a989a
RB
5827}
5828
5829
5830/* Set CHILD_FN to be the copy function for OMP_TASK GS. */
5831
5832static inline void
355fe088 5833gimple_omp_task_set_copy_fn (gimple *gs, tree copy_fn)
726a989a 5834{
538dd0b7 5835 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5836 omp_task_stmt->copy_fn = copy_fn;
726a989a
RB
5837}
5838
5839
5840/* Return size of the data block in bytes in OMP_TASK GS. */
5841
5842static inline tree
355fe088 5843gimple_omp_task_arg_size (const gimple *gs)
726a989a 5844{
538dd0b7 5845 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5846 return omp_task_stmt->arg_size;
726a989a
RB
5847}
5848
5849
5850/* Return a pointer to the data block size for OMP_TASK GS. */
5851
5852static inline tree *
355fe088 5853gimple_omp_task_arg_size_ptr (gimple *gs)
726a989a 5854{
538dd0b7 5855 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5856 return &omp_task_stmt->arg_size;
726a989a
RB
5857}
5858
5859
5860/* Set ARG_SIZE to be the data block size for OMP_TASK GS. */
5861
5862static inline void
355fe088 5863gimple_omp_task_set_arg_size (gimple *gs, tree arg_size)
726a989a 5864{
538dd0b7 5865 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5866 omp_task_stmt->arg_size = arg_size;
726a989a
RB
5867}
5868
5869
5870/* Return align of the data block in bytes in OMP_TASK GS. */
5871
5872static inline tree
355fe088 5873gimple_omp_task_arg_align (const gimple *gs)
726a989a 5874{
538dd0b7 5875 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5876 return omp_task_stmt->arg_align;
726a989a
RB
5877}
5878
5879
5880/* Return a pointer to the data block align for OMP_TASK GS. */
5881
5882static inline tree *
355fe088 5883gimple_omp_task_arg_align_ptr (gimple *gs)
726a989a 5884{
538dd0b7 5885 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5886 return &omp_task_stmt->arg_align;
726a989a
RB
5887}
5888
5889
5890/* Set ARG_SIZE to be the data block align for OMP_TASK GS. */
5891
5892static inline void
355fe088 5893gimple_omp_task_set_arg_align (gimple *gs, tree arg_align)
726a989a 5894{
538dd0b7 5895 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5896 omp_task_stmt->arg_align = arg_align;
726a989a
RB
5897}
5898
5899
5900/* Return the clauses associated with OMP_SINGLE GS. */
5901
5902static inline tree
355fe088 5903gimple_omp_single_clauses (const gimple *gs)
726a989a 5904{
538dd0b7 5905 const gomp_single *omp_single_stmt = as_a <const gomp_single *> (gs);
daa6e488 5906 return omp_single_stmt->clauses;
726a989a
RB
5907}
5908
5909
5910/* Return a pointer to the clauses associated with OMP_SINGLE GS. */
5911
5912static inline tree *
355fe088 5913gimple_omp_single_clauses_ptr (gimple *gs)
726a989a 5914{
538dd0b7 5915 gomp_single *omp_single_stmt = as_a <gomp_single *> (gs);
daa6e488 5916 return &omp_single_stmt->clauses;
726a989a
RB
5917}
5918
5919
538dd0b7 5920/* Set CLAUSES to be the clauses associated with OMP_SINGLE_STMT. */
726a989a
RB
5921
5922static inline void
538dd0b7 5923gimple_omp_single_set_clauses (gomp_single *omp_single_stmt, tree clauses)
726a989a 5924{
daa6e488 5925 omp_single_stmt->clauses = clauses;
726a989a
RB
5926}
5927
5928
acf0174b
JJ
5929/* Return the clauses associated with OMP_TARGET GS. */
5930
5931static inline tree
355fe088 5932gimple_omp_target_clauses (const gimple *gs)
acf0174b 5933{
538dd0b7 5934 const gomp_target *omp_target_stmt = as_a <const gomp_target *> (gs);
9b95612e 5935 return omp_target_stmt->clauses;
acf0174b
JJ
5936}
5937
5938
5939/* Return a pointer to the clauses associated with OMP_TARGET GS. */
5940
5941static inline tree *
355fe088 5942gimple_omp_target_clauses_ptr (gimple *gs)
acf0174b 5943{
538dd0b7 5944 gomp_target *omp_target_stmt = as_a <gomp_target *> (gs);
9b95612e 5945 return &omp_target_stmt->clauses;
acf0174b
JJ
5946}
5947
5948
538dd0b7 5949/* Set CLAUSES to be the clauses associated with OMP_TARGET_STMT. */
acf0174b
JJ
5950
5951static inline void
538dd0b7
DM
5952gimple_omp_target_set_clauses (gomp_target *omp_target_stmt,
5953 tree clauses)
acf0174b 5954{
9b95612e 5955 omp_target_stmt->clauses = clauses;
acf0174b
JJ
5956}
5957
5958
41dbbb37 5959/* Return the kind of the OMP_TARGET G. */
acf0174b
JJ
5960
5961static inline int
355fe088 5962gimple_omp_target_kind (const gimple *g)
acf0174b
JJ
5963{
5964 GIMPLE_CHECK (g, GIMPLE_OMP_TARGET);
5965 return (gimple_omp_subcode (g) & GF_OMP_TARGET_KIND_MASK);
5966}
5967
5968
41dbbb37 5969/* Set the kind of the OMP_TARGET G. */
acf0174b
JJ
5970
5971static inline void
538dd0b7 5972gimple_omp_target_set_kind (gomp_target *g, int kind)
acf0174b 5973{
daa6e488 5974 g->subcode = (g->subcode & ~GF_OMP_TARGET_KIND_MASK)
acf0174b
JJ
5975 | (kind & GF_OMP_TARGET_KIND_MASK);
5976}
5977
5978
538dd0b7 5979/* Return the child function used to hold the body of OMP_TARGET_STMT. */
acf0174b
JJ
5980
5981static inline tree
538dd0b7 5982gimple_omp_target_child_fn (const gomp_target *omp_target_stmt)
acf0174b 5983{
9b95612e 5984 return omp_target_stmt->child_fn;
acf0174b
JJ
5985}
5986
5987/* Return a pointer to the child function used to hold the body of
538dd0b7 5988 OMP_TARGET_STMT. */
acf0174b
JJ
5989
5990static inline tree *
538dd0b7 5991gimple_omp_target_child_fn_ptr (gomp_target *omp_target_stmt)
acf0174b 5992{
9b95612e 5993 return &omp_target_stmt->child_fn;
acf0174b
JJ
5994}
5995
5996
538dd0b7 5997/* Set CHILD_FN to be the child function for OMP_TARGET_STMT. */
acf0174b
JJ
5998
5999static inline void
538dd0b7
DM
6000gimple_omp_target_set_child_fn (gomp_target *omp_target_stmt,
6001 tree child_fn)
acf0174b 6002{
9b95612e 6003 omp_target_stmt->child_fn = child_fn;
acf0174b
JJ
6004}
6005
6006
6007/* Return the artificial argument used to send variables and values
538dd0b7 6008 from the parent to the children threads in OMP_TARGET_STMT. */
acf0174b
JJ
6009
6010static inline tree
538dd0b7 6011gimple_omp_target_data_arg (const gomp_target *omp_target_stmt)
acf0174b 6012{
9b95612e 6013 return omp_target_stmt->data_arg;
acf0174b
JJ
6014}
6015
6016
6017/* Return a pointer to the data argument for OMP_TARGET GS. */
6018
6019static inline tree *
538dd0b7 6020gimple_omp_target_data_arg_ptr (gomp_target *omp_target_stmt)
acf0174b 6021{
9b95612e 6022 return &omp_target_stmt->data_arg;
acf0174b
JJ
6023}
6024
6025
538dd0b7 6026/* Set DATA_ARG to be the data argument for OMP_TARGET_STMT. */
acf0174b
JJ
6027
6028static inline void
538dd0b7
DM
6029gimple_omp_target_set_data_arg (gomp_target *omp_target_stmt,
6030 tree data_arg)
acf0174b 6031{
9b95612e 6032 omp_target_stmt->data_arg = data_arg;
acf0174b
JJ
6033}
6034
6035
6036/* Return the clauses associated with OMP_TEAMS GS. */
6037
6038static inline tree
355fe088 6039gimple_omp_teams_clauses (const gimple *gs)
acf0174b 6040{
538dd0b7 6041 const gomp_teams *omp_teams_stmt = as_a <const gomp_teams *> (gs);
9b95612e 6042 return omp_teams_stmt->clauses;
acf0174b
JJ
6043}
6044
6045
6046/* Return a pointer to the clauses associated with OMP_TEAMS GS. */
6047
6048static inline tree *
355fe088 6049gimple_omp_teams_clauses_ptr (gimple *gs)
acf0174b 6050{
538dd0b7 6051 gomp_teams *omp_teams_stmt = as_a <gomp_teams *> (gs);
9b95612e 6052 return &omp_teams_stmt->clauses;
acf0174b
JJ
6053}
6054
6055
538dd0b7 6056/* Set CLAUSES to be the clauses associated with OMP_TEAMS_STMT. */
acf0174b
JJ
6057
6058static inline void
538dd0b7 6059gimple_omp_teams_set_clauses (gomp_teams *omp_teams_stmt, tree clauses)
acf0174b 6060{
9b95612e 6061 omp_teams_stmt->clauses = clauses;
acf0174b
JJ
6062}
6063
28567c40
JJ
6064/* Return the child function used to hold the body of OMP_TEAMS_STMT. */
6065
6066static inline tree
6067gimple_omp_teams_child_fn (const gomp_teams *omp_teams_stmt)
6068{
6069 return omp_teams_stmt->child_fn;
6070}
6071
6072/* Return a pointer to the child function used to hold the body of
6073 OMP_TEAMS_STMT. */
6074
6075static inline tree *
6076gimple_omp_teams_child_fn_ptr (gomp_teams *omp_teams_stmt)
6077{
6078 return &omp_teams_stmt->child_fn;
6079}
6080
6081
6082/* Set CHILD_FN to be the child function for OMP_TEAMS_STMT. */
6083
6084static inline void
6085gimple_omp_teams_set_child_fn (gomp_teams *omp_teams_stmt, tree child_fn)
6086{
6087 omp_teams_stmt->child_fn = child_fn;
6088}
6089
6090
6091/* Return the artificial argument used to send variables and values
6092 from the parent to the children threads in OMP_TEAMS_STMT. */
6093
6094static inline tree
6095gimple_omp_teams_data_arg (const gomp_teams *omp_teams_stmt)
6096{
6097 return omp_teams_stmt->data_arg;
6098}
6099
6100
6101/* Return a pointer to the data argument for OMP_TEAMS_STMT. */
6102
6103static inline tree *
6104gimple_omp_teams_data_arg_ptr (gomp_teams *omp_teams_stmt)
6105{
6106 return &omp_teams_stmt->data_arg;
6107}
6108
6109
6110/* Set DATA_ARG to be the data argument for OMP_TEAMS_STMT. */
6111
6112static inline void
6113gimple_omp_teams_set_data_arg (gomp_teams *omp_teams_stmt, tree data_arg)
6114{
6115 omp_teams_stmt->data_arg = data_arg;
6116}
6117
28567c40
JJ
6118/* Return the host flag of an OMP_TEAMS_STMT. */
6119
6120static inline bool
6121gimple_omp_teams_host (const gomp_teams *omp_teams_stmt)
6122{
6123 return (gimple_omp_subcode (omp_teams_stmt) & GF_OMP_TEAMS_HOST) != 0;
6124}
6125
6126/* Set host flag of an OMP_TEAMS_STMT to VALUE. */
6127
6128static inline void
6129gimple_omp_teams_set_host (gomp_teams *omp_teams_stmt, bool value)
6130{
6131 if (value)
6132 omp_teams_stmt->subcode |= GF_OMP_TEAMS_HOST;
6133 else
6134 omp_teams_stmt->subcode &= ~GF_OMP_TEAMS_HOST;
6135}
6136
726a989a
RB
6137/* Return the clauses associated with OMP_SECTIONS GS. */
6138
6139static inline tree
355fe088 6140gimple_omp_sections_clauses (const gimple *gs)
726a989a 6141{
538dd0b7 6142 const gomp_sections *omp_sections_stmt = as_a <const gomp_sections *> (gs);
daa6e488 6143 return omp_sections_stmt->clauses;
726a989a
RB
6144}
6145
6146
6147/* Return a pointer to the clauses associated with OMP_SECTIONS GS. */
6148
6149static inline tree *
355fe088 6150gimple_omp_sections_clauses_ptr (gimple *gs)
726a989a 6151{
538dd0b7 6152 gomp_sections *omp_sections_stmt = as_a <gomp_sections *> (gs);
daa6e488 6153 return &omp_sections_stmt->clauses;
726a989a
RB
6154}
6155
6156
6157/* Set CLAUSES to be the set of clauses associated with OMP_SECTIONS
6158 GS. */
6159
6160static inline void
355fe088 6161gimple_omp_sections_set_clauses (gimple *gs, tree clauses)
726a989a 6162{
538dd0b7 6163 gomp_sections *omp_sections_stmt = as_a <gomp_sections *> (gs);
daa6e488 6164 omp_sections_stmt->clauses = clauses;
726a989a
RB
6165}
6166
6167
6168/* Return the control variable associated with the GIMPLE_OMP_SECTIONS
6169 in GS. */
6170
6171static inline tree
355fe088 6172gimple_omp_sections_control (const gimple *gs)
726a989a 6173{
538dd0b7 6174 const gomp_sections *omp_sections_stmt = as_a <const gomp_sections *> (gs);
daa6e488 6175 return omp_sections_stmt->control;
726a989a
RB
6176}
6177
6178
6179/* Return a pointer to the clauses associated with the GIMPLE_OMP_SECTIONS
6180 GS. */
6181
6182static inline tree *
355fe088 6183gimple_omp_sections_control_ptr (gimple *gs)
726a989a 6184{
538dd0b7 6185 gomp_sections *omp_sections_stmt = as_a <gomp_sections *> (gs);
daa6e488 6186 return &omp_sections_stmt->control;
726a989a
RB
6187}
6188
6189
6190/* Set CONTROL to be the set of clauses associated with the
6191 GIMPLE_OMP_SECTIONS in GS. */
6192
6193static inline void
355fe088 6194gimple_omp_sections_set_control (gimple *gs, tree control)
726a989a 6195{
538dd0b7 6196 gomp_sections *omp_sections_stmt = as_a <gomp_sections *> (gs);
daa6e488 6197 omp_sections_stmt->control = control;
726a989a
RB
6198}
6199
6200
726a989a
RB
6201/* Set the value being stored in an atomic store. */
6202
6203static inline void
538dd0b7 6204gimple_omp_atomic_store_set_val (gomp_atomic_store *store_stmt, tree val)
726a989a 6205{
538dd0b7 6206 store_stmt->val = val;
726a989a
RB
6207}
6208
6209
6210/* Return the value being stored in an atomic store. */
6211
6212static inline tree
538dd0b7 6213gimple_omp_atomic_store_val (const gomp_atomic_store *store_stmt)
726a989a 6214{
538dd0b7 6215 return store_stmt->val;
726a989a
RB
6216}
6217
6218
6219/* Return a pointer to the value being stored in an atomic store. */
6220
6221static inline tree *
538dd0b7 6222gimple_omp_atomic_store_val_ptr (gomp_atomic_store *store_stmt)
726a989a 6223{
538dd0b7 6224 return &store_stmt->val;
726a989a
RB
6225}
6226
6227
6228/* Set the LHS of an atomic load. */
6229
6230static inline void
538dd0b7 6231gimple_omp_atomic_load_set_lhs (gomp_atomic_load *load_stmt, tree lhs)
726a989a 6232{
538dd0b7 6233 load_stmt->lhs = lhs;
726a989a
RB
6234}
6235
6236
6237/* Get the LHS of an atomic load. */
6238
6239static inline tree
538dd0b7 6240gimple_omp_atomic_load_lhs (const gomp_atomic_load *load_stmt)
726a989a 6241{
538dd0b7 6242 return load_stmt->lhs;
726a989a
RB
6243}
6244
6245
6246/* Return a pointer to the LHS of an atomic load. */
6247
6248static inline tree *
538dd0b7 6249gimple_omp_atomic_load_lhs_ptr (gomp_atomic_load *load_stmt)
726a989a 6250{
538dd0b7 6251 return &load_stmt->lhs;
726a989a
RB
6252}
6253
6254
6255/* Set the RHS of an atomic load. */
6256
6257static inline void
538dd0b7 6258gimple_omp_atomic_load_set_rhs (gomp_atomic_load *load_stmt, tree rhs)
726a989a 6259{
538dd0b7 6260 load_stmt->rhs = rhs;
726a989a
RB
6261}
6262
6263
6264/* Get the RHS of an atomic load. */
6265
6266static inline tree
538dd0b7 6267gimple_omp_atomic_load_rhs (const gomp_atomic_load *load_stmt)
726a989a 6268{
538dd0b7 6269 return load_stmt->rhs;
726a989a
RB
6270}
6271
6272
6273/* Return a pointer to the RHS of an atomic load. */
6274
6275static inline tree *
538dd0b7 6276gimple_omp_atomic_load_rhs_ptr (gomp_atomic_load *load_stmt)
726a989a 6277{
538dd0b7 6278 return &load_stmt->rhs;
726a989a
RB
6279}
6280
6281
6282/* Get the definition of the control variable in a GIMPLE_OMP_CONTINUE. */
6283
6284static inline tree
538dd0b7 6285gimple_omp_continue_control_def (const gomp_continue *cont_stmt)
726a989a 6286{
538dd0b7 6287 return cont_stmt->control_def;
726a989a
RB
6288}
6289
6290/* The same as above, but return the address. */
6291
6292static inline tree *
538dd0b7 6293gimple_omp_continue_control_def_ptr (gomp_continue *cont_stmt)
726a989a 6294{
538dd0b7 6295 return &cont_stmt->control_def;
726a989a
RB
6296}
6297
6298/* Set the definition of the control variable in a GIMPLE_OMP_CONTINUE. */
6299
6300static inline void
538dd0b7 6301gimple_omp_continue_set_control_def (gomp_continue *cont_stmt, tree def)
726a989a 6302{
538dd0b7 6303 cont_stmt->control_def = def;
726a989a
RB
6304}
6305
6306
6307/* Get the use of the control variable in a GIMPLE_OMP_CONTINUE. */
6308
6309static inline tree
538dd0b7 6310gimple_omp_continue_control_use (const gomp_continue *cont_stmt)
726a989a 6311{
538dd0b7 6312 return cont_stmt->control_use;
726a989a
RB
6313}
6314
6315
6316/* The same as above, but return the address. */
6317
6318static inline tree *
538dd0b7 6319gimple_omp_continue_control_use_ptr (gomp_continue *cont_stmt)
726a989a 6320{
538dd0b7 6321 return &cont_stmt->control_use;
726a989a
RB
6322}
6323
6324
6325/* Set the use of the control variable in a GIMPLE_OMP_CONTINUE. */
6326
6327static inline void
538dd0b7 6328gimple_omp_continue_set_control_use (gomp_continue *cont_stmt, tree use)
726a989a 6329{
538dd0b7 6330 cont_stmt->control_use = use;
726a989a
RB
6331}
6332
538dd0b7
DM
6333/* Return a pointer to the body for the GIMPLE_TRANSACTION statement
6334 TRANSACTION_STMT. */
355a7673
MM
6335
6336static inline gimple_seq *
538dd0b7 6337gimple_transaction_body_ptr (gtransaction *transaction_stmt)
355a7673 6338{
daa6e488 6339 return &transaction_stmt->body;
355a7673
MM
6340}
6341
538dd0b7 6342/* Return the body for the GIMPLE_TRANSACTION statement TRANSACTION_STMT. */
0a35513e
AH
6343
6344static inline gimple_seq
0e7b6a51 6345gimple_transaction_body (const gtransaction *transaction_stmt)
0a35513e 6346{
7c11b0fe 6347 return transaction_stmt->body;
0a35513e
AH
6348}
6349
6350/* Return the label associated with a GIMPLE_TRANSACTION. */
6351
6352static inline tree
7c11b0fe 6353gimple_transaction_label_norm (const gtransaction *transaction_stmt)
0a35513e 6354{
7c11b0fe 6355 return transaction_stmt->label_norm;
0a35513e
AH
6356}
6357
6358static inline tree *
7c11b0fe 6359gimple_transaction_label_norm_ptr (gtransaction *transaction_stmt)
0a35513e 6360{
7c11b0fe
RH
6361 return &transaction_stmt->label_norm;
6362}
6363
6364static inline tree
6365gimple_transaction_label_uninst (const gtransaction *transaction_stmt)
6366{
6367 return transaction_stmt->label_uninst;
6368}
6369
6370static inline tree *
6371gimple_transaction_label_uninst_ptr (gtransaction *transaction_stmt)
6372{
6373 return &transaction_stmt->label_uninst;
6374}
6375
6376static inline tree
6377gimple_transaction_label_over (const gtransaction *transaction_stmt)
6378{
6379 return transaction_stmt->label_over;
6380}
6381
6382static inline tree *
6383gimple_transaction_label_over_ptr (gtransaction *transaction_stmt)
6384{
6385 return &transaction_stmt->label_over;
0a35513e
AH
6386}
6387
6388/* Return the subcode associated with a GIMPLE_TRANSACTION. */
6389
6390static inline unsigned int
538dd0b7 6391gimple_transaction_subcode (const gtransaction *transaction_stmt)
0a35513e 6392{
538dd0b7 6393 return transaction_stmt->subcode;
0a35513e
AH
6394}
6395
538dd0b7
DM
6396/* Set BODY to be the body for the GIMPLE_TRANSACTION statement
6397 TRANSACTION_STMT. */
0a35513e
AH
6398
6399static inline void
538dd0b7
DM
6400gimple_transaction_set_body (gtransaction *transaction_stmt,
6401 gimple_seq body)
0a35513e 6402{
daa6e488 6403 transaction_stmt->body = body;
0a35513e
AH
6404}
6405
6406/* Set the label associated with a GIMPLE_TRANSACTION. */
6407
6408static inline void
7c11b0fe
RH
6409gimple_transaction_set_label_norm (gtransaction *transaction_stmt, tree label)
6410{
6411 transaction_stmt->label_norm = label;
6412}
6413
6414static inline void
6415gimple_transaction_set_label_uninst (gtransaction *transaction_stmt, tree label)
6416{
6417 transaction_stmt->label_uninst = label;
6418}
6419
6420static inline void
6421gimple_transaction_set_label_over (gtransaction *transaction_stmt, tree label)
0a35513e 6422{
7c11b0fe 6423 transaction_stmt->label_over = label;
0a35513e
AH
6424}
6425
6426/* Set the subcode associated with a GIMPLE_TRANSACTION. */
6427
6428static inline void
538dd0b7
DM
6429gimple_transaction_set_subcode (gtransaction *transaction_stmt,
6430 unsigned int subcode)
0a35513e 6431{
538dd0b7 6432 transaction_stmt->subcode = subcode;
0a35513e
AH
6433}
6434
726a989a
RB
6435/* Return a pointer to the return value for GIMPLE_RETURN GS. */
6436
6437static inline tree *
1d10676d 6438gimple_return_retval_ptr (greturn *gs)
726a989a 6439{
1d10676d 6440 return &gs->op[0];
726a989a
RB
6441}
6442
6443/* Return the return value for GIMPLE_RETURN GS. */
6444
6445static inline tree
538dd0b7 6446gimple_return_retval (const greturn *gs)
726a989a 6447{
a3fe41f5 6448 return gs->op[0];
726a989a
RB
6449}
6450
6451
6452/* Set RETVAL to be the return value for GIMPLE_RETURN GS. */
6453
6454static inline void
538dd0b7 6455gimple_return_set_retval (greturn *gs, tree retval)
726a989a 6456{
a3fe41f5 6457 gs->op[0] = retval;
726a989a
RB
6458}
6459
6460
41dbbb37 6461/* Returns true when the gimple statement STMT is any of the OMP types. */
726a989a 6462
8b9db065
RH
6463#define CASE_GIMPLE_OMP \
6464 case GIMPLE_OMP_PARALLEL: \
6465 case GIMPLE_OMP_TASK: \
6466 case GIMPLE_OMP_FOR: \
6467 case GIMPLE_OMP_SECTIONS: \
6468 case GIMPLE_OMP_SECTIONS_SWITCH: \
6469 case GIMPLE_OMP_SINGLE: \
acf0174b
JJ
6470 case GIMPLE_OMP_TARGET: \
6471 case GIMPLE_OMP_TEAMS: \
8b9db065
RH
6472 case GIMPLE_OMP_SECTION: \
6473 case GIMPLE_OMP_MASTER: \
acf0174b 6474 case GIMPLE_OMP_TASKGROUP: \
8b9db065
RH
6475 case GIMPLE_OMP_ORDERED: \
6476 case GIMPLE_OMP_CRITICAL: \
bf38f7e9 6477 case GIMPLE_OMP_SCAN: \
8b9db065
RH
6478 case GIMPLE_OMP_RETURN: \
6479 case GIMPLE_OMP_ATOMIC_LOAD: \
6480 case GIMPLE_OMP_ATOMIC_STORE: \
c56684fd 6481 case GIMPLE_OMP_CONTINUE
8b9db065 6482
726a989a 6483static inline bool
355fe088 6484is_gimple_omp (const gimple *stmt)
726a989a 6485{
8b9db065
RH
6486 switch (gimple_code (stmt))
6487 {
6488 CASE_GIMPLE_OMP:
6489 return true;
6490 default:
6491 return false;
6492 }
726a989a
RB
6493}
6494
41dbbb37
TS
6495/* Return true if the OMP gimple statement STMT is any of the OpenACC types
6496 specifically. */
6497
6498static inline bool
355fe088 6499is_gimple_omp_oacc (const gimple *stmt)
41dbbb37
TS
6500{
6501 gcc_assert (is_gimple_omp (stmt));
6502 switch (gimple_code (stmt))
6503 {
6504 case GIMPLE_OMP_FOR:
6505 switch (gimple_omp_for_kind (stmt))
6506 {
6507 case GF_OMP_FOR_KIND_OACC_LOOP:
6508 return true;
6509 default:
6510 return false;
6511 }
6512 case GIMPLE_OMP_TARGET:
6513 switch (gimple_omp_target_kind (stmt))
6514 {
6515 case GF_OMP_TARGET_KIND_OACC_PARALLEL:
6516 case GF_OMP_TARGET_KIND_OACC_KERNELS:
62aee289 6517 case GF_OMP_TARGET_KIND_OACC_SERIAL:
41dbbb37
TS
6518 case GF_OMP_TARGET_KIND_OACC_DATA:
6519 case GF_OMP_TARGET_KIND_OACC_UPDATE:
6520 case GF_OMP_TARGET_KIND_OACC_ENTER_EXIT_DATA:
6e232ba4 6521 case GF_OMP_TARGET_KIND_OACC_DECLARE:
37d5ad46 6522 case GF_OMP_TARGET_KIND_OACC_HOST_DATA:
e898ce79
GB
6523 case GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_PARALLELIZED:
6524 case GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_GANG_SINGLE:
6525 case GF_OMP_TARGET_KIND_OACC_DATA_KERNELS:
41dbbb37
TS
6526 return true;
6527 default:
6528 return false;
6529 }
6530 default:
6531 return false;
6532 }
6533}
6534
6535
6536/* Return true if the OMP gimple statement STMT is offloaded. */
6537
6538static inline bool
355fe088 6539is_gimple_omp_offloaded (const gimple *stmt)
41dbbb37
TS
6540{
6541 gcc_assert (is_gimple_omp (stmt));
6542 switch (gimple_code (stmt))
6543 {
6544 case GIMPLE_OMP_TARGET:
6545 switch (gimple_omp_target_kind (stmt))
6546 {
6547 case GF_OMP_TARGET_KIND_REGION:
6548 case GF_OMP_TARGET_KIND_OACC_PARALLEL:
6549 case GF_OMP_TARGET_KIND_OACC_KERNELS:
62aee289 6550 case GF_OMP_TARGET_KIND_OACC_SERIAL:
e898ce79
GB
6551 case GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_PARALLELIZED:
6552 case GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_GANG_SINGLE:
41dbbb37
TS
6553 return true;
6554 default:
6555 return false;
6556 }
6557 default:
6558 return false;
6559 }
6560}
6561
726a989a
RB
6562
6563/* Returns TRUE if statement G is a GIMPLE_NOP. */
6564
6565static inline bool
355fe088 6566gimple_nop_p (const gimple *g)
726a989a
RB
6567{
6568 return gimple_code (g) == GIMPLE_NOP;
6569}
6570
6571
1d65f45c
RH
6572/* Return true if GS is a GIMPLE_RESX. */
6573
6574static inline bool
355fe088 6575is_gimple_resx (const gimple *gs)
1d65f45c
RH
6576{
6577 return gimple_code (gs) == GIMPLE_RESX;
6578}
6579
828552ed
RG
6580/* Return the type of the main expression computed by STMT. Return
6581 void_type_node if the statement computes nothing. */
6582
6583static inline tree
355fe088 6584gimple_expr_type (const gimple *stmt)
828552ed
RG
6585{
6586 enum gimple_code code = gimple_code (stmt);
9dbe0d83
AK
6587 /* In general we want to pass out a type that can be substituted
6588 for both the RHS and the LHS types if there is a possibly
6589 useless conversion involved. That means returning the
6590 original RHS type as far as we can reconstruct it. */
6591 if (code == GIMPLE_CALL)
828552ed 6592 {
9dbe0d83 6593 const gcall *call_stmt = as_a <const gcall *> (stmt);
f307441a
RS
6594 if (gimple_call_internal_p (call_stmt))
6595 switch (gimple_call_internal_fn (call_stmt))
6596 {
6597 case IFN_MASK_STORE:
6598 case IFN_SCATTER_STORE:
6599 return TREE_TYPE (gimple_call_arg (call_stmt, 3));
6600 case IFN_MASK_SCATTER_STORE:
6601 return TREE_TYPE (gimple_call_arg (call_stmt, 4));
6602 default:
6603 break;
6604 }
6605 return gimple_call_return_type (call_stmt);
9dbe0d83
AK
6606 }
6607 else if (code == GIMPLE_ASSIGN)
6608 {
6609 if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR)
6610 return TREE_TYPE (gimple_assign_rhs1 (stmt));
828552ed 6611 else
9dbe0d83
AK
6612 /* As fallback use the type of the LHS. */
6613 return TREE_TYPE (gimple_get_lhs (stmt));
828552ed
RG
6614 }
6615 else if (code == GIMPLE_COND)
6616 return boolean_type_node;
4a369d19
RB
6617 else if (code == GIMPLE_PHI)
6618 return TREE_TYPE (gimple_phi_result (stmt));
828552ed
RG
6619 else
6620 return void_type_node;
6621}
6622
726a989a
RB
6623/* Enum and arrays used for allocation stats. Keep in sync with
6624 gimple.c:gimple_alloc_kind_names. */
6625enum gimple_alloc_kind
6626{
6627 gimple_alloc_kind_assign, /* Assignments. */
6628 gimple_alloc_kind_phi, /* PHI nodes. */
6629 gimple_alloc_kind_cond, /* Conditionals. */
726a989a
RB
6630 gimple_alloc_kind_rest, /* Everything else. */
6631 gimple_alloc_kind_all
6632};
6633
33b366c3
ML
6634extern uint64_t gimple_alloc_counts[];
6635extern uint64_t gimple_alloc_sizes[];
726a989a
RB
6636
6637/* Return the allocation kind for a given stmt CODE. */
6638static inline enum gimple_alloc_kind
6639gimple_alloc_kind (enum gimple_code code)
6640{
6641 switch (code)
6642 {
6643 case GIMPLE_ASSIGN:
6644 return gimple_alloc_kind_assign;
6645 case GIMPLE_PHI:
6646 return gimple_alloc_kind_phi;
6647 case GIMPLE_COND:
6648 return gimple_alloc_kind_cond;
6649 default:
6650 return gimple_alloc_kind_rest;
6651 }
6652}
726a989a 6653
45b0be94
AM
6654/* Return true if a location should not be emitted for this statement
6655 by annotate_all_with_location. */
6656
6657static inline bool
355fe088 6658gimple_do_not_emit_location_p (gimple *g)
45b0be94
AM
6659{
6660 return gimple_plf (g, GF_PLF_1);
6661}
6662
6663/* Mark statement G so a location will not be emitted by
6664 annotate_one_with_location. */
6665
6666static inline void
355fe088 6667gimple_set_do_not_emit_location (gimple *g)
45b0be94
AM
6668{
6669 /* The PLF flags are initialized to 0 when a new tuple is created,
6670 so no need to initialize it anywhere. */
6671 gimple_set_plf (g, GF_PLF_1, true);
6672}
6673
726a989a 6674#endif /* GCC_GIMPLE_H */