]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/gimple.h
expander: Optimize store_expr from STRING_CST [PR95052]
[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,
726a989a 152 GF_OMP_PARALLEL_COMBINED = 1 << 0,
b2b40051 153 GF_OMP_PARALLEL_GRID_PHONY = 1 << 1,
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,
dfa6e5b4
JJ
161 GF_OMP_FOR_KIND_GRID_LOOP = 5,
162 GF_OMP_FOR_KIND_SIMD = 6,
163 GF_OMP_FOR_COMBINED = 1 << 3,
164 GF_OMP_FOR_COMBINED_INTO = 1 << 4,
56b1c60e
MJ
165 /* The following flag must not be used on GF_OMP_FOR_KIND_GRID_LOOP loop
166 statements. */
dfa6e5b4 167 GF_OMP_FOR_GRID_PHONY = 1 << 5,
56b1c60e
MJ
168 /* The following two flags should only be set on GF_OMP_FOR_KIND_GRID_LOOP
169 loop statements. */
dfa6e5b4
JJ
170 GF_OMP_FOR_GRID_INTRA_GROUP = 1 << 5,
171 GF_OMP_FOR_GRID_GROUP_ITER = 1 << 6,
d9a6bd32 172 GF_OMP_TARGET_KIND_MASK = (1 << 4) - 1,
eb63c927
TS
173 GF_OMP_TARGET_KIND_REGION = 0,
174 GF_OMP_TARGET_KIND_DATA = 1,
175 GF_OMP_TARGET_KIND_UPDATE = 2,
d9a6bd32
JJ
176 GF_OMP_TARGET_KIND_ENTER_DATA = 3,
177 GF_OMP_TARGET_KIND_EXIT_DATA = 4,
178 GF_OMP_TARGET_KIND_OACC_PARALLEL = 5,
179 GF_OMP_TARGET_KIND_OACC_KERNELS = 6,
62aee289
MR
180 GF_OMP_TARGET_KIND_OACC_SERIAL = 7,
181 GF_OMP_TARGET_KIND_OACC_DATA = 8,
182 GF_OMP_TARGET_KIND_OACC_UPDATE = 9,
183 GF_OMP_TARGET_KIND_OACC_ENTER_EXIT_DATA = 10,
184 GF_OMP_TARGET_KIND_OACC_DECLARE = 11,
185 GF_OMP_TARGET_KIND_OACC_HOST_DATA = 12,
b2b40051 186 GF_OMP_TEAMS_GRID_PHONY = 1 << 0,
28567c40 187 GF_OMP_TEAMS_HOST = 1 << 1,
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);
b2b40051 1562gimple *gimple_build_omp_grid_body (gimple_seq);
28567c40 1563gimple *gimple_build_omp_taskgroup (gimple_seq, tree);
538dd0b7 1564gomp_continue *gimple_build_omp_continue (tree, tree);
d9a6bd32 1565gomp_ordered *gimple_build_omp_ordered (gimple_seq, tree);
355fe088 1566gimple *gimple_build_omp_return (bool);
bf38f7e9 1567gomp_scan *gimple_build_omp_scan (gimple_seq, tree);
538dd0b7 1568gomp_sections *gimple_build_omp_sections (gimple_seq, tree);
355fe088 1569gimple *gimple_build_omp_sections_switch (void);
538dd0b7
DM
1570gomp_single *gimple_build_omp_single (gimple_seq, tree);
1571gomp_target *gimple_build_omp_target (gimple_seq, int, tree);
1572gomp_teams *gimple_build_omp_teams (gimple_seq, tree);
28567c40
JJ
1573gomp_atomic_load *gimple_build_omp_atomic_load (tree, tree,
1574 enum omp_memory_order);
1575gomp_atomic_store *gimple_build_omp_atomic_store (tree, enum omp_memory_order);
7c11b0fe 1576gtransaction *gimple_build_transaction (gimple_seq);
355fe088
TS
1577extern void gimple_seq_add_stmt (gimple_seq *, gimple *);
1578extern void gimple_seq_add_stmt_without_update (gimple_seq *, gimple *);
726a989a 1579void gimple_seq_add_seq (gimple_seq *, gimple_seq);
fef5a0d9 1580void gimple_seq_add_seq_without_update (gimple_seq *, gimple_seq);
1fe37220
AM
1581extern void annotate_all_with_location_after (gimple_seq, gimple_stmt_iterator,
1582 location_t);
1583extern void annotate_all_with_location (gimple_seq, location_t);
1584bool empty_body_p (gimple_seq);
726a989a 1585gimple_seq gimple_seq_copy (gimple_seq);
355fe088
TS
1586bool gimple_call_same_target_p (const gimple *, const gimple *);
1587int gimple_call_flags (const gimple *);
538dd0b7
DM
1588int gimple_call_arg_flags (const gcall *, unsigned);
1589int gimple_call_return_flags (const gcall *);
288aaa5f
AH
1590bool gimple_call_nonnull_result_p (gcall *);
1591tree gimple_call_nonnull_arg (gcall *);
355fe088
TS
1592bool gimple_assign_copy_p (gimple *);
1593bool gimple_assign_ssa_name_copy_p (gimple *);
1594bool gimple_assign_unary_nop_p (gimple *);
1595void gimple_set_bb (gimple *, basic_block);
726a989a 1596void gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *, tree);
00d66391
JJ
1597void gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *, enum tree_code,
1598 tree, tree, tree);
355fe088
TS
1599tree gimple_get_lhs (const gimple *);
1600void gimple_set_lhs (gimple *, tree);
1601gimple *gimple_copy (gimple *);
779724a5 1602void gimple_move_vops (gimple *, gimple *);
355fe088
TS
1603bool gimple_has_side_effects (const gimple *);
1604bool gimple_could_trap_p_1 (gimple *, bool, bool);
1605bool gimple_could_trap_p (gimple *);
1606bool gimple_assign_rhs_could_trap_p (gimple *);
1fe37220 1607extern void dump_gimple_statistics (void);
726a989a 1608unsigned get_gimple_rhs_num_ops (enum tree_code);
1fe37220 1609extern tree canonicalize_cond_expr_cond (tree);
538dd0b7 1610gcall *gimple_call_copy_skip_args (gcall *, bitmap);
d025732d 1611extern bool gimple_compare_field_offset (tree, tree);
d7f09764
DN
1612extern tree gimple_unsigned_type (tree);
1613extern tree gimple_signed_type (tree);
1614extern alias_set_type gimple_get_alias_set (tree);
355fe088
TS
1615extern bool gimple_ior_addresses_taken (bitmap, gimple *);
1616extern bool gimple_builtin_call_types_compatible_p (const gimple *, tree);
00175cb2 1617extern combined_fn gimple_call_combined_fn (const gimple *);
70df40ca 1618extern bool gimple_call_replaceable_operator_delete_p (const gcall *);
355fe088
TS
1619extern bool gimple_call_builtin_p (const gimple *);
1620extern bool gimple_call_builtin_p (const gimple *, enum built_in_class);
1621extern bool gimple_call_builtin_p (const gimple *, enum built_in_function);
538dd0b7 1622extern bool gimple_asm_clobbers_memory_p (const gasm *);
1fe37220 1623extern void dump_decl_set (FILE *, bitmap);
355fe088 1624extern bool nonfreeing_call_p (gimple *);
c000cd7c 1625extern bool nonbarrier_call_p (gimple *);
355fe088
TS
1626extern bool infer_nonnull_range (gimple *, tree);
1627extern bool infer_nonnull_range_by_dereference (gimple *, tree);
1628extern bool infer_nonnull_range_by_attribute (gimple *, tree);
73049af5
JJ
1629extern void sort_case_labels (vec<tree>);
1630extern void preprocess_case_label_vec_for_gimple (vec<tree>, tree, tree *);
1631extern void gimple_seq_set_location (gimple_seq, location_t);
1632extern void gimple_seq_discard (gimple_seq);
355fe088 1633extern void maybe_remove_unused_call_args (struct function *, gimple *);
ce120587 1634extern bool gimple_inexpensive_call_p (gcall *);
21bcd7be 1635extern bool stmt_can_terminate_bb_p (gimple *);
55ace4d1
JL
1636extern location_t gimple_or_expr_nonartificial_location (gimple *, tree);
1637
726a989a 1638
4a8fb1a1
LC
1639/* Formal (expression) temporary table handling: multiple occurrences of
1640 the same scalar expression are evaluated into the same temporary. */
1641
1642typedef struct gimple_temp_hash_elt
1643{
1644 tree val; /* Key */
1645 tree temp; /* Value */
1646} elt_t;
1647
cc524fc7
AM
1648/* Get the number of the next statement uid to be allocated. */
1649static inline unsigned int
1650gimple_stmt_max_uid (struct function *fn)
1651{
1652 return fn->last_stmt_uid;
1653}
1654
1655/* Set the number of the next statement uid to be allocated. */
1656static inline void
1657set_gimple_stmt_max_uid (struct function *fn, unsigned int maxid)
1658{
1659 fn->last_stmt_uid = maxid;
1660}
1661
1662/* Set the number of the next statement uid to be allocated. */
1663static inline unsigned int
1664inc_gimple_stmt_max_uid (struct function *fn)
1665{
1666 return fn->last_stmt_uid++;
1667}
1668
355a7673
MM
1669/* Return the first node in GIMPLE sequence S. */
1670
1671static inline gimple_seq_node
3e8b732e 1672gimple_seq_first (gimple_seq s)
355a7673
MM
1673{
1674 return s;
1675}
1676
1677
1678/* Return the first statement in GIMPLE sequence S. */
1679
355fe088 1680static inline gimple *
3e8b732e 1681gimple_seq_first_stmt (gimple_seq s)
355a7673
MM
1682{
1683 gimple_seq_node n = gimple_seq_first (s);
1684 return n;
1685}
1686
538dd0b7
DM
1687/* Return the first statement in GIMPLE sequence S as a gbind *,
1688 verifying that it has code GIMPLE_BIND in a checked build. */
1689
1690static inline gbind *
1691gimple_seq_first_stmt_as_a_bind (gimple_seq s)
1692{
1693 gimple_seq_node n = gimple_seq_first (s);
1694 return as_a <gbind *> (n);
1695}
1696
355a7673
MM
1697
1698/* Return the last node in GIMPLE sequence S. */
1699
1700static inline gimple_seq_node
3e8b732e 1701gimple_seq_last (gimple_seq s)
355a7673 1702{
daa6e488 1703 return s ? s->prev : NULL;
355a7673
MM
1704}
1705
1706
1707/* Return the last statement in GIMPLE sequence S. */
1708
355fe088 1709static inline gimple *
3e8b732e 1710gimple_seq_last_stmt (gimple_seq s)
355a7673
MM
1711{
1712 gimple_seq_node n = gimple_seq_last (s);
1713 return n;
1714}
1715
1716
1717/* Set the last node in GIMPLE sequence *PS to LAST. */
1718
1719static inline void
1720gimple_seq_set_last (gimple_seq *ps, gimple_seq_node last)
1721{
daa6e488 1722 (*ps)->prev = last;
355a7673
MM
1723}
1724
1725
1726/* Set the first node in GIMPLE sequence *PS to FIRST. */
1727
1728static inline void
1729gimple_seq_set_first (gimple_seq *ps, gimple_seq_node first)
1730{
1731 *ps = first;
1732}
1733
1734
1735/* Return true if GIMPLE sequence S is empty. */
1736
1737static inline bool
3e8b732e 1738gimple_seq_empty_p (gimple_seq s)
355a7673
MM
1739{
1740 return s == NULL;
1741}
1742
355a7673
MM
1743/* Allocate a new sequence and initialize its first element with STMT. */
1744
1745static inline gimple_seq
355fe088 1746gimple_seq_alloc_with_stmt (gimple *stmt)
355a7673
MM
1747{
1748 gimple_seq seq = NULL;
1749 gimple_seq_add_stmt (&seq, stmt);
1750 return seq;
1751}
1752
1753
1754/* Returns the sequence of statements in BB. */
1755
1756static inline gimple_seq
1757bb_seq (const_basic_block bb)
1758{
3e8b732e 1759 return (!(bb->flags & BB_RTL)) ? bb->il.gimple.seq : NULL;
355a7673
MM
1760}
1761
1762static inline gimple_seq *
3e8b732e 1763bb_seq_addr (basic_block bb)
355a7673 1764{
3e8b732e 1765 return (!(bb->flags & BB_RTL)) ? &bb->il.gimple.seq : NULL;
355a7673
MM
1766}
1767
1768/* Sets the sequence of statements in BB to SEQ. */
1769
1770static inline void
1771set_bb_seq (basic_block bb, gimple_seq seq)
1772{
1773 gcc_checking_assert (!(bb->flags & BB_RTL));
3e8b732e 1774 bb->il.gimple.seq = seq;
355a7673
MM
1775}
1776
1777
726a989a
RB
1778/* Return the code for GIMPLE statement G. */
1779
1780static inline enum gimple_code
355fe088 1781gimple_code (const gimple *g)
726a989a 1782{
daa6e488 1783 return g->code;
726a989a
RB
1784}
1785
1786
f2c4a81c
RH
1787/* Return the GSS code used by a GIMPLE code. */
1788
1789static inline enum gimple_statement_structure_enum
1790gss_for_code (enum gimple_code code)
1791{
2bc0a660 1792 gcc_gimple_checking_assert ((unsigned int)code < LAST_AND_UNUSED_GIMPLE_CODE);
f2c4a81c
RH
1793 return gss_for_code_[code];
1794}
1795
1796
1797/* Return which GSS code is used by GS. */
1798
1799static inline enum gimple_statement_structure_enum
355fe088 1800gimple_statement_structure (gimple *gs)
f2c4a81c
RH
1801{
1802 return gss_for_code (gimple_code (gs));
1803}
1804
1805
726a989a
RB
1806/* Return true if statement G has sub-statements. This is only true for
1807 High GIMPLE statements. */
1808
1809static inline bool
355fe088 1810gimple_has_substatements (gimple *g)
726a989a
RB
1811{
1812 switch (gimple_code (g))
1813 {
1814 case GIMPLE_BIND:
1815 case GIMPLE_CATCH:
1816 case GIMPLE_EH_FILTER:
0a35513e 1817 case GIMPLE_EH_ELSE:
726a989a
RB
1818 case GIMPLE_TRY:
1819 case GIMPLE_OMP_FOR:
1820 case GIMPLE_OMP_MASTER:
acf0174b 1821 case GIMPLE_OMP_TASKGROUP:
726a989a
RB
1822 case GIMPLE_OMP_ORDERED:
1823 case GIMPLE_OMP_SECTION:
1824 case GIMPLE_OMP_PARALLEL:
1825 case GIMPLE_OMP_TASK:
1826 case GIMPLE_OMP_SECTIONS:
1827 case GIMPLE_OMP_SINGLE:
acf0174b
JJ
1828 case GIMPLE_OMP_TARGET:
1829 case GIMPLE_OMP_TEAMS:
05a26161 1830 case GIMPLE_OMP_CRITICAL:
726a989a 1831 case GIMPLE_WITH_CLEANUP_EXPR:
0a35513e 1832 case GIMPLE_TRANSACTION:
b2b40051 1833 case GIMPLE_OMP_GRID_BODY:
726a989a
RB
1834 return true;
1835
1836 default:
1837 return false;
1838 }
1839}
b8698a0f 1840
726a989a
RB
1841
1842/* Return the basic block holding statement G. */
1843
b8244d74 1844static inline basic_block
355fe088 1845gimple_bb (const gimple *g)
726a989a 1846{
daa6e488 1847 return g->bb;
726a989a
RB
1848}
1849
1850
1851/* Return the lexical scope block holding statement G. */
1852
1853static inline tree
355fe088 1854gimple_block (const gimple *g)
726a989a 1855{
daa6e488 1856 return LOCATION_BLOCK (g->location);
726a989a
RB
1857}
1858
1859
1860/* Set BLOCK to be the lexical scope block holding statement G. */
1861
1862static inline void
355fe088 1863gimple_set_block (gimple *g, tree block)
726a989a 1864{
ebedc9a3 1865 g->location = set_block (g->location, block);
726a989a
RB
1866}
1867
1868
1869/* Return location information for statement G. */
1870
1871static inline location_t
355fe088 1872gimple_location (const gimple *g)
726a989a 1873{
daa6e488 1874 return g->location;
726a989a
RB
1875}
1876
807b7d62
ML
1877/* Return location information for statement G if g is not NULL.
1878 Otherwise, UNKNOWN_LOCATION is returned. */
1879
1880static inline location_t
355fe088 1881gimple_location_safe (const gimple *g)
807b7d62
ML
1882{
1883 return g ? gimple_location (g) : UNKNOWN_LOCATION;
1884}
1885
726a989a
RB
1886/* Set location information for statement G. */
1887
1888static inline void
355fe088 1889gimple_set_location (gimple *g, location_t location)
726a989a 1890{
daa6e488 1891 g->location = location;
726a989a
RB
1892}
1893
1894
1895/* Return true if G contains location information. */
1896
1897static inline bool
355fe088 1898gimple_has_location (const gimple *g)
726a989a 1899{
2f13f2de 1900 return LOCATION_LOCUS (gimple_location (g)) != UNKNOWN_LOCATION;
726a989a
RB
1901}
1902
1903
e3329a78
MS
1904/* Return non-artificial location information for statement G. */
1905
1906static inline location_t
1907gimple_nonartificial_location (const gimple *g)
1908{
1909 location_t *ploc = NULL;
1910
1911 if (tree block = gimple_block (g))
1912 ploc = block_nonartificial_location (block);
1913
1914 return ploc ? *ploc : gimple_location (g);
1915}
1916
1917
726a989a
RB
1918/* Return the file name of the location of STMT. */
1919
1920static inline const char *
355fe088 1921gimple_filename (const gimple *stmt)
726a989a
RB
1922{
1923 return LOCATION_FILE (gimple_location (stmt));
1924}
1925
1926
1927/* Return the line number of the location of STMT. */
1928
1929static inline int
355fe088 1930gimple_lineno (const gimple *stmt)
726a989a
RB
1931{
1932 return LOCATION_LINE (gimple_location (stmt));
1933}
1934
1935
1936/* Determine whether SEQ is a singleton. */
1937
1938static inline bool
1939gimple_seq_singleton_p (gimple_seq seq)
1940{
1941 return ((gimple_seq_first (seq) != NULL)
1942 && (gimple_seq_first (seq) == gimple_seq_last (seq)));
1943}
1944
1945/* Return true if no warnings should be emitted for statement STMT. */
1946
1947static inline bool
355fe088 1948gimple_no_warning_p (const gimple *stmt)
726a989a 1949{
daa6e488 1950 return stmt->no_warning;
726a989a
RB
1951}
1952
1953/* Set the no_warning flag of STMT to NO_WARNING. */
1954
1955static inline void
355fe088 1956gimple_set_no_warning (gimple *stmt, bool no_warning)
726a989a 1957{
daa6e488 1958 stmt->no_warning = (unsigned) no_warning;
726a989a
RB
1959}
1960
3d8b06d3
DS
1961/* Set the visited status on statement STMT to VISITED_P.
1962
1963 Please note that this 'visited' property of the gimple statement is
1964 supposed to be undefined at pass boundaries. This means that a
1965 given pass should not assume it contains any useful value when the
1966 pass starts and thus can set it to any value it sees fit.
1967
1968 You can learn more about the visited property of the gimple
1969 statement by reading the comments of the 'visited' data member of
7b954766 1970 struct gimple.
3d8b06d3 1971 */
726a989a
RB
1972
1973static inline void
355fe088 1974gimple_set_visited (gimple *stmt, bool visited_p)
726a989a 1975{
daa6e488 1976 stmt->visited = (unsigned) visited_p;
726a989a
RB
1977}
1978
1979
3d8b06d3
DS
1980/* Return the visited status for statement STMT.
1981
1982 Please note that this 'visited' property of the gimple statement is
1983 supposed to be undefined at pass boundaries. This means that a
1984 given pass should not assume it contains any useful value when the
1985 pass starts and thus can set it to any value it sees fit.
1986
1987 You can learn more about the visited property of the gimple
1988 statement by reading the comments of the 'visited' data member of
7b954766 1989 struct gimple. */
726a989a
RB
1990
1991static inline bool
355fe088 1992gimple_visited_p (gimple *stmt)
726a989a 1993{
daa6e488 1994 return stmt->visited;
726a989a
RB
1995}
1996
1997
3d8b06d3
DS
1998/* Set pass local flag PLF on statement STMT to VAL_P.
1999
2000 Please note that this PLF property of the gimple statement is
2001 supposed to be undefined at pass boundaries. This means that a
2002 given pass should not assume it contains any useful value when the
2003 pass starts and thus can set it to any value it sees fit.
2004
2005 You can learn more about the PLF property by reading the comment of
2006 the 'plf' data member of struct gimple_statement_structure. */
726a989a
RB
2007
2008static inline void
355fe088 2009gimple_set_plf (gimple *stmt, enum plf_mask plf, bool val_p)
726a989a
RB
2010{
2011 if (val_p)
daa6e488 2012 stmt->plf |= (unsigned int) plf;
726a989a 2013 else
daa6e488 2014 stmt->plf &= ~((unsigned int) plf);
726a989a
RB
2015}
2016
2017
3d8b06d3
DS
2018/* Return the value of pass local flag PLF on statement STMT.
2019
2020 Please note that this 'plf' property of the gimple statement is
2021 supposed to be undefined at pass boundaries. This means that a
2022 given pass should not assume it contains any useful value when the
2023 pass starts and thus can set it to any value it sees fit.
2024
2025 You can learn more about the plf property by reading the comment of
2026 the 'plf' data member of struct gimple_statement_structure. */
726a989a
RB
2027
2028static inline unsigned int
355fe088 2029gimple_plf (gimple *stmt, enum plf_mask plf)
726a989a 2030{
daa6e488 2031 return stmt->plf & ((unsigned int) plf);
726a989a
RB
2032}
2033
2034
3d8b06d3
DS
2035/* Set the UID of statement.
2036
2037 Please note that this UID property is supposed to be undefined at
2038 pass boundaries. This means that a given pass should not assume it
2039 contains any useful value when the pass starts and thus can set it
2040 to any value it sees fit. */
726a989a
RB
2041
2042static inline void
355fe088 2043gimple_set_uid (gimple *g, unsigned uid)
726a989a 2044{
daa6e488 2045 g->uid = uid;
726a989a
RB
2046}
2047
2048
3d8b06d3
DS
2049/* Return the UID of statement.
2050
2051 Please note that this UID property is supposed to be undefined at
2052 pass boundaries. This means that a given pass should not assume it
2053 contains any useful value when the pass starts and thus can set it
2054 to any value it sees fit. */
726a989a
RB
2055
2056static inline unsigned
355fe088 2057gimple_uid (const gimple *g)
726a989a 2058{
daa6e488 2059 return g->uid;
726a989a
RB
2060}
2061
2062
355a7673
MM
2063/* Make statement G a singleton sequence. */
2064
2065static inline void
355fe088 2066gimple_init_singleton (gimple *g)
355a7673 2067{
daa6e488
DM
2068 g->next = NULL;
2069 g->prev = g;
355a7673
MM
2070}
2071
2072
726a989a
RB
2073/* Return true if GIMPLE statement G has register or memory operands. */
2074
2075static inline bool
355fe088 2076gimple_has_ops (const gimple *g)
726a989a
RB
2077{
2078 return gimple_code (g) >= GIMPLE_COND && gimple_code (g) <= GIMPLE_RETURN;
2079}
2080
daa6e488
DM
2081template <>
2082template <>
2083inline bool
355fe088 2084is_a_helper <const gimple_statement_with_ops *>::test (const gimple *gs)
daa6e488
DM
2085{
2086 return gimple_has_ops (gs);
2087}
2088
2089template <>
2090template <>
2091inline bool
355fe088 2092is_a_helper <gimple_statement_with_ops *>::test (gimple *gs)
daa6e488
DM
2093{
2094 return gimple_has_ops (gs);
2095}
726a989a
RB
2096
2097/* Return true if GIMPLE statement G has memory operands. */
2098
2099static inline bool
355fe088 2100gimple_has_mem_ops (const gimple *g)
726a989a
RB
2101{
2102 return gimple_code (g) >= GIMPLE_ASSIGN && gimple_code (g) <= GIMPLE_RETURN;
2103}
2104
daa6e488
DM
2105template <>
2106template <>
2107inline bool
355fe088 2108is_a_helper <const gimple_statement_with_memory_ops *>::test (const gimple *gs)
daa6e488
DM
2109{
2110 return gimple_has_mem_ops (gs);
2111}
2112
2113template <>
2114template <>
2115inline bool
355fe088 2116is_a_helper <gimple_statement_with_memory_ops *>::test (gimple *gs)
daa6e488
DM
2117{
2118 return gimple_has_mem_ops (gs);
2119}
726a989a 2120
726a989a
RB
2121/* Return the set of USE operands for statement G. */
2122
2123static inline struct use_optype_d *
355fe088 2124gimple_use_ops (const gimple *g)
726a989a 2125{
daa6e488 2126 const gimple_statement_with_ops *ops_stmt =
7de90a6c 2127 dyn_cast <const gimple_statement_with_ops *> (g);
daa6e488 2128 if (!ops_stmt)
726a989a 2129 return NULL;
daa6e488 2130 return ops_stmt->use_ops;
726a989a
RB
2131}
2132
2133
2134/* Set USE to be the set of USE operands for statement G. */
2135
2136static inline void
355fe088 2137gimple_set_use_ops (gimple *g, struct use_optype_d *use)
726a989a 2138{
daa6e488 2139 gimple_statement_with_ops *ops_stmt =
7de90a6c 2140 as_a <gimple_statement_with_ops *> (g);
daa6e488 2141 ops_stmt->use_ops = use;
726a989a
RB
2142}
2143
2144
5006671f 2145/* Return the single VUSE operand of the statement G. */
726a989a 2146
5006671f 2147static inline tree
355fe088 2148gimple_vuse (const gimple *g)
726a989a 2149{
daa6e488 2150 const gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2151 dyn_cast <const gimple_statement_with_memory_ops *> (g);
daa6e488 2152 if (!mem_ops_stmt)
5006671f 2153 return NULL_TREE;
daa6e488 2154 return mem_ops_stmt->vuse;
726a989a
RB
2155}
2156
5006671f 2157/* Return the single VDEF operand of the statement G. */
726a989a 2158
5006671f 2159static inline tree
355fe088 2160gimple_vdef (const gimple *g)
726a989a 2161{
daa6e488 2162 const gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2163 dyn_cast <const gimple_statement_with_memory_ops *> (g);
daa6e488 2164 if (!mem_ops_stmt)
5006671f 2165 return NULL_TREE;
daa6e488 2166 return mem_ops_stmt->vdef;
726a989a
RB
2167}
2168
5006671f 2169/* Return the single VUSE operand of the statement G. */
726a989a 2170
5006671f 2171static inline tree *
355fe088 2172gimple_vuse_ptr (gimple *g)
726a989a 2173{
daa6e488 2174 gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2175 dyn_cast <gimple_statement_with_memory_ops *> (g);
daa6e488 2176 if (!mem_ops_stmt)
726a989a 2177 return NULL;
daa6e488 2178 return &mem_ops_stmt->vuse;
726a989a
RB
2179}
2180
5006671f 2181/* Return the single VDEF operand of the statement G. */
726a989a 2182
5006671f 2183static inline tree *
355fe088 2184gimple_vdef_ptr (gimple *g)
726a989a 2185{
daa6e488 2186 gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2187 dyn_cast <gimple_statement_with_memory_ops *> (g);
daa6e488 2188 if (!mem_ops_stmt)
726a989a 2189 return NULL;
daa6e488 2190 return &mem_ops_stmt->vdef;
5006671f
RG
2191}
2192
2193/* Set the single VUSE operand of the statement G. */
2194
2195static inline void
355fe088 2196gimple_set_vuse (gimple *g, tree vuse)
5006671f 2197{
daa6e488 2198 gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2199 as_a <gimple_statement_with_memory_ops *> (g);
daa6e488 2200 mem_ops_stmt->vuse = vuse;
5006671f
RG
2201}
2202
2203/* Set the single VDEF operand of the statement G. */
2204
2205static inline void
355fe088 2206gimple_set_vdef (gimple *g, tree vdef)
5006671f 2207{
daa6e488 2208 gimple_statement_with_memory_ops *mem_ops_stmt =
7de90a6c 2209 as_a <gimple_statement_with_memory_ops *> (g);
daa6e488 2210 mem_ops_stmt->vdef = vdef;
726a989a
RB
2211}
2212
2213
2214/* Return true if statement G has operands and the modified field has
2215 been set. */
2216
2217static inline bool
355fe088 2218gimple_modified_p (const gimple *g)
726a989a 2219{
daa6e488 2220 return (gimple_has_ops (g)) ? (bool) g->modified : false;
726a989a
RB
2221}
2222
726a989a 2223
a02f0c5d
RG
2224/* Set the MODIFIED flag to MODIFIEDP, iff the gimple statement G has
2225 a MODIFIED field. */
2226
2227static inline void
355fe088 2228gimple_set_modified (gimple *s, bool modifiedp)
a02f0c5d
RG
2229{
2230 if (gimple_has_ops (s))
daa6e488 2231 s->modified = (unsigned) modifiedp;
a02f0c5d
RG
2232}
2233
2234
726a989a
RB
2235/* Return the tree code for the expression computed by STMT. This is
2236 only valid for GIMPLE_COND, GIMPLE_CALL and GIMPLE_ASSIGN. For
2237 GIMPLE_CALL, return CALL_EXPR as the expression code for
2238 consistency. This is useful when the caller needs to deal with the
2239 three kinds of computation that GIMPLE supports. */
2240
2241static inline enum tree_code
355fe088 2242gimple_expr_code (const gimple *stmt)
726a989a
RB
2243{
2244 enum gimple_code code = gimple_code (stmt);
2245 if (code == GIMPLE_ASSIGN || code == GIMPLE_COND)
daa6e488 2246 return (enum tree_code) stmt->subcode;
726a989a 2247 else
b074e783
JH
2248 {
2249 gcc_gimple_checking_assert (code == GIMPLE_CALL);
2250 return CALL_EXPR;
2251 }
726a989a
RB
2252}
2253
2254
726a989a
RB
2255/* Return true if statement STMT contains volatile operands. */
2256
2257static inline bool
355fe088 2258gimple_has_volatile_ops (const gimple *stmt)
726a989a
RB
2259{
2260 if (gimple_has_mem_ops (stmt))
daa6e488 2261 return stmt->has_volatile_ops;
726a989a
RB
2262 else
2263 return false;
2264}
2265
2266
2267/* Set the HAS_VOLATILE_OPS flag to VOLATILEP. */
2268
2269static inline void
355fe088 2270gimple_set_has_volatile_ops (gimple *stmt, bool volatilep)
726a989a
RB
2271{
2272 if (gimple_has_mem_ops (stmt))
daa6e488 2273 stmt->has_volatile_ops = (unsigned) volatilep;
726a989a
RB
2274}
2275
19c0d7df
AH
2276/* Return true if STMT is in a transaction. */
2277
2278static inline bool
355fe088 2279gimple_in_transaction (const gimple *stmt)
19c0d7df 2280{
7783daa7 2281 return bb_in_transaction (gimple_bb (stmt));
19c0d7df 2282}
726a989a
RB
2283
2284/* Return true if statement STMT may access memory. */
2285
2286static inline bool
355fe088 2287gimple_references_memory_p (gimple *stmt)
726a989a 2288{
5006671f 2289 return gimple_has_mem_ops (stmt) && gimple_vuse (stmt);
726a989a
RB
2290}
2291
2292
726a989a
RB
2293/* Return the subcode for OMP statement S. */
2294
2295static inline unsigned
355fe088 2296gimple_omp_subcode (const gimple *s)
726a989a 2297{
2bc0a660 2298 gcc_gimple_checking_assert (gimple_code (s) >= GIMPLE_OMP_ATOMIC_LOAD
28567c40 2299 && gimple_code (s) <= GIMPLE_OMP_TEAMS);
daa6e488 2300 return s->subcode;
726a989a
RB
2301}
2302
2303/* Set the subcode for OMP statement S to SUBCODE. */
2304
2305static inline void
355fe088 2306gimple_omp_set_subcode (gimple *s, unsigned int subcode)
726a989a
RB
2307{
2308 /* We only have 16 bits for the subcode. Assert that we are not
2309 overflowing it. */
2bc0a660 2310 gcc_gimple_checking_assert (subcode < (1 << 16));
daa6e488 2311 s->subcode = subcode;
726a989a
RB
2312}
2313
2314/* Set the nowait flag on OMP_RETURN statement S. */
2315
2316static inline void
355fe088 2317gimple_omp_return_set_nowait (gimple *s)
726a989a
RB
2318{
2319 GIMPLE_CHECK (s, GIMPLE_OMP_RETURN);
daa6e488 2320 s->subcode |= GF_OMP_RETURN_NOWAIT;
726a989a
RB
2321}
2322
2323
2324/* Return true if OMP return statement G has the GF_OMP_RETURN_NOWAIT
2325 flag set. */
2326
2327static inline bool
355fe088 2328gimple_omp_return_nowait_p (const gimple *g)
726a989a
RB
2329{
2330 GIMPLE_CHECK (g, GIMPLE_OMP_RETURN);
2331 return (gimple_omp_subcode (g) & GF_OMP_RETURN_NOWAIT) != 0;
2332}
2333
2334
acf0174b
JJ
2335/* Set the LHS of OMP return. */
2336
2337static inline void
355fe088 2338gimple_omp_return_set_lhs (gimple *g, tree lhs)
acf0174b 2339{
9b95612e 2340 gimple_statement_omp_return *omp_return_stmt =
7de90a6c 2341 as_a <gimple_statement_omp_return *> (g);
9b95612e 2342 omp_return_stmt->val = lhs;
acf0174b
JJ
2343}
2344
2345
2346/* Get the LHS of OMP return. */
2347
2348static inline tree
355fe088 2349gimple_omp_return_lhs (const gimple *g)
acf0174b 2350{
9b95612e 2351 const gimple_statement_omp_return *omp_return_stmt =
7de90a6c 2352 as_a <const gimple_statement_omp_return *> (g);
9b95612e 2353 return omp_return_stmt->val;
acf0174b
JJ
2354}
2355
2356
2357/* Return a pointer to the LHS of OMP return. */
2358
2359static inline tree *
355fe088 2360gimple_omp_return_lhs_ptr (gimple *g)
acf0174b 2361{
9b95612e 2362 gimple_statement_omp_return *omp_return_stmt =
7de90a6c 2363 as_a <gimple_statement_omp_return *> (g);
9b95612e 2364 return &omp_return_stmt->val;
acf0174b
JJ
2365}
2366
2367
726a989a
RB
2368/* Return true if OMP section statement G has the GF_OMP_SECTION_LAST
2369 flag set. */
2370
2371static inline bool
355fe088 2372gimple_omp_section_last_p (const gimple *g)
726a989a
RB
2373{
2374 GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
2375 return (gimple_omp_subcode (g) & GF_OMP_SECTION_LAST) != 0;
2376}
2377
2378
2379/* Set the GF_OMP_SECTION_LAST flag on G. */
2380
2381static inline void
355fe088 2382gimple_omp_section_set_last (gimple *g)
726a989a
RB
2383{
2384 GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
daa6e488 2385 g->subcode |= GF_OMP_SECTION_LAST;
726a989a
RB
2386}
2387
2388
2389/* Return true if OMP parallel statement G has the
2390 GF_OMP_PARALLEL_COMBINED flag set. */
2391
2392static inline bool
355fe088 2393gimple_omp_parallel_combined_p (const gimple *g)
726a989a
RB
2394{
2395 GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
2396 return (gimple_omp_subcode (g) & GF_OMP_PARALLEL_COMBINED) != 0;
2397}
2398
2399
2400/* Set the GF_OMP_PARALLEL_COMBINED field in G depending on the boolean
2401 value of COMBINED_P. */
2402
2403static inline void
355fe088 2404gimple_omp_parallel_set_combined_p (gimple *g, bool combined_p)
726a989a
RB
2405{
2406 GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
2407 if (combined_p)
daa6e488 2408 g->subcode |= GF_OMP_PARALLEL_COMBINED;
726a989a 2409 else
daa6e488 2410 g->subcode &= ~GF_OMP_PARALLEL_COMBINED;
726a989a
RB
2411}
2412
2413
20906c66
JJ
2414/* Return true if OMP atomic load/store statement G has the
2415 GF_OMP_ATOMIC_NEED_VALUE flag set. */
2416
2417static inline bool
355fe088 2418gimple_omp_atomic_need_value_p (const gimple *g)
20906c66
JJ
2419{
2420 if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
2421 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
2422 return (gimple_omp_subcode (g) & GF_OMP_ATOMIC_NEED_VALUE) != 0;
2423}
2424
2425
2426/* Set the GF_OMP_ATOMIC_NEED_VALUE flag on G. */
2427
2428static inline void
355fe088 2429gimple_omp_atomic_set_need_value (gimple *g)
20906c66
JJ
2430{
2431 if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
2432 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
daa6e488 2433 g->subcode |= GF_OMP_ATOMIC_NEED_VALUE;
20906c66
JJ
2434}
2435
2436
28567c40 2437/* Return the memory order of the OMP atomic load/store statement G. */
acf0174b 2438
28567c40
JJ
2439static inline enum omp_memory_order
2440gimple_omp_atomic_memory_order (const gimple *g)
acf0174b
JJ
2441{
2442 if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
2443 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
28567c40
JJ
2444 return (enum omp_memory_order)
2445 (gimple_omp_subcode (g) & GF_OMP_ATOMIC_MEMORY_ORDER);
acf0174b
JJ
2446}
2447
2448
28567c40 2449/* Set the memory order on G. */
acf0174b
JJ
2450
2451static inline void
28567c40 2452gimple_omp_atomic_set_memory_order (gimple *g, enum omp_memory_order mo)
acf0174b
JJ
2453{
2454 if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
2455 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
28567c40
JJ
2456 g->subcode = ((g->subcode & ~GF_OMP_ATOMIC_MEMORY_ORDER)
2457 | (mo & GF_OMP_ATOMIC_MEMORY_ORDER));
acf0174b
JJ
2458}
2459
2460
726a989a
RB
2461/* Return the number of operands for statement GS. */
2462
2463static inline unsigned
355fe088 2464gimple_num_ops (const gimple *gs)
726a989a 2465{
daa6e488 2466 return gs->num_ops;
726a989a
RB
2467}
2468
2469
2470/* Set the number of operands for statement GS. */
2471
2472static inline void
355fe088 2473gimple_set_num_ops (gimple *gs, unsigned num_ops)
726a989a 2474{
daa6e488 2475 gs->num_ops = num_ops;
726a989a
RB
2476}
2477
2478
2479/* Return the array of operands for statement GS. */
2480
2481static inline tree *
355fe088 2482gimple_ops (gimple *gs)
726a989a 2483{
f2c4a81c 2484 size_t off;
726a989a
RB
2485
2486 /* All the tuples have their operand vector at the very bottom
f2c4a81c
RH
2487 of the structure. Note that those structures that do not
2488 have an operand vector have a zero offset. */
2489 off = gimple_ops_offset_[gimple_statement_structure (gs)];
2bc0a660 2490 gcc_gimple_checking_assert (off != 0);
f2c4a81c
RH
2491
2492 return (tree *) ((char *) gs + off);
726a989a
RB
2493}
2494
2495
2496/* Return operand I for statement GS. */
2497
2498static inline tree
355fe088 2499gimple_op (const 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));
726a989a
RB
2504 return gimple_ops (CONST_CAST_GIMPLE (gs))[i];
2505 }
2506 else
2507 return NULL_TREE;
2508}
2509
2510/* Return a pointer to operand I for statement GS. */
2511
2512static inline tree *
1d10676d 2513gimple_op_ptr (gimple *gs, unsigned i)
726a989a
RB
2514{
2515 if (gimple_has_ops (gs))
2516 {
2bc0a660 2517 gcc_gimple_checking_assert (i < gimple_num_ops (gs));
1d10676d 2518 return gimple_ops (gs) + i;
726a989a
RB
2519 }
2520 else
2521 return NULL;
2522}
2523
2524/* Set operand I of statement GS to OP. */
2525
2526static inline void
355fe088 2527gimple_set_op (gimple *gs, unsigned i, tree op)
726a989a 2528{
2bc0a660 2529 gcc_gimple_checking_assert (gimple_has_ops (gs) && i < gimple_num_ops (gs));
726a989a
RB
2530
2531 /* Note. It may be tempting to assert that OP matches
2532 is_gimple_operand, but that would be wrong. Different tuples
2533 accept slightly different sets of tree operands. Each caller
2534 should perform its own validation. */
2535 gimple_ops (gs)[i] = op;
2536}
2537
2538/* Return true if GS is a GIMPLE_ASSIGN. */
2539
2540static inline bool
355fe088 2541is_gimple_assign (const gimple *gs)
726a989a
RB
2542{
2543 return gimple_code (gs) == GIMPLE_ASSIGN;
2544}
2545
2546/* Determine if expression CODE is one of the valid expressions that can
2547 be used on the RHS of GIMPLE assignments. */
2548
2549static inline enum gimple_rhs_class
2550get_gimple_rhs_class (enum tree_code code)
2551{
2552 return (enum gimple_rhs_class) gimple_rhs_class_table[(int) code];
2553}
2554
2555/* Return the LHS of assignment statement GS. */
2556
bde351d5
RB
2557static inline tree
2558gimple_assign_lhs (const gassign *gs)
2559{
2560 return gs->op[0];
2561}
2562
726a989a 2563static inline tree
355fe088 2564gimple_assign_lhs (const gimple *gs)
726a989a 2565{
bde351d5
RB
2566 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2567 return gimple_assign_lhs (ass);
726a989a
RB
2568}
2569
2570
2571/* Return a pointer to the LHS of assignment statement GS. */
2572
bde351d5 2573static inline tree *
1d10676d 2574gimple_assign_lhs_ptr (gassign *gs)
bde351d5 2575{
1d10676d 2576 return &gs->op[0];
bde351d5
RB
2577}
2578
726a989a 2579static inline tree *
1d10676d 2580gimple_assign_lhs_ptr (gimple *gs)
726a989a 2581{
1d10676d 2582 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
bde351d5 2583 return gimple_assign_lhs_ptr (ass);
726a989a
RB
2584}
2585
2586
2587/* Set LHS to be the LHS operand of assignment statement GS. */
2588
2589static inline void
bde351d5 2590gimple_assign_set_lhs (gassign *gs, tree lhs)
726a989a 2591{
bde351d5 2592 gs->op[0] = lhs;
726a989a
RB
2593
2594 if (lhs && TREE_CODE (lhs) == SSA_NAME)
2595 SSA_NAME_DEF_STMT (lhs) = gs;
2596}
2597
bde351d5 2598static inline void
355fe088 2599gimple_assign_set_lhs (gimple *gs, tree lhs)
bde351d5
RB
2600{
2601 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
2602 gimple_assign_set_lhs (ass, lhs);
2603}
2604
726a989a
RB
2605
2606/* Return the first operand on the RHS of assignment statement GS. */
2607
bde351d5
RB
2608static inline tree
2609gimple_assign_rhs1 (const gassign *gs)
2610{
2611 return gs->op[1];
2612}
2613
726a989a 2614static inline tree
355fe088 2615gimple_assign_rhs1 (const gimple *gs)
726a989a 2616{
bde351d5
RB
2617 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2618 return gimple_assign_rhs1 (ass);
726a989a
RB
2619}
2620
2621
2622/* Return a pointer to the first operand on the RHS of assignment
2623 statement GS. */
2624
bde351d5 2625static inline tree *
1d10676d 2626gimple_assign_rhs1_ptr (gassign *gs)
bde351d5 2627{
1d10676d 2628 return &gs->op[1];
bde351d5
RB
2629}
2630
726a989a 2631static inline tree *
1d10676d 2632gimple_assign_rhs1_ptr (gimple *gs)
726a989a 2633{
1d10676d 2634 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
bde351d5 2635 return gimple_assign_rhs1_ptr (ass);
726a989a
RB
2636}
2637
2638/* Set RHS to be the first operand on the RHS of assignment statement GS. */
2639
2640static inline void
bde351d5 2641gimple_assign_set_rhs1 (gassign *gs, tree rhs)
726a989a 2642{
bde351d5
RB
2643 gs->op[1] = rhs;
2644}
726a989a 2645
bde351d5 2646static inline void
355fe088 2647gimple_assign_set_rhs1 (gimple *gs, tree rhs)
bde351d5
RB
2648{
2649 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
2650 gimple_assign_set_rhs1 (ass, rhs);
726a989a
RB
2651}
2652
2653
2654/* Return the second operand on the RHS of assignment statement GS.
2655 If GS does not have two operands, NULL is returned instead. */
2656
2657static inline tree
bde351d5 2658gimple_assign_rhs2 (const gassign *gs)
726a989a 2659{
726a989a 2660 if (gimple_num_ops (gs) >= 3)
bde351d5 2661 return gs->op[2];
726a989a
RB
2662 else
2663 return NULL_TREE;
2664}
2665
bde351d5 2666static inline tree
355fe088 2667gimple_assign_rhs2 (const gimple *gs)
bde351d5
RB
2668{
2669 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2670 return gimple_assign_rhs2 (ass);
2671}
2672
726a989a
RB
2673
2674/* Return a pointer to the second operand on the RHS of assignment
2675 statement GS. */
2676
bde351d5 2677static inline tree *
1d10676d 2678gimple_assign_rhs2_ptr (gassign *gs)
bde351d5
RB
2679{
2680 gcc_gimple_checking_assert (gimple_num_ops (gs) >= 3);
1d10676d 2681 return &gs->op[2];
bde351d5
RB
2682}
2683
726a989a 2684static inline tree *
1d10676d 2685gimple_assign_rhs2_ptr (gimple *gs)
726a989a 2686{
1d10676d 2687 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
bde351d5 2688 return gimple_assign_rhs2_ptr (ass);
726a989a
RB
2689}
2690
2691
2692/* Set RHS to be the second operand on the RHS of assignment statement GS. */
2693
2694static inline void
bde351d5 2695gimple_assign_set_rhs2 (gassign *gs, tree rhs)
726a989a 2696{
bde351d5
RB
2697 gcc_gimple_checking_assert (gimple_num_ops (gs) >= 3);
2698 gs->op[2] = rhs;
2699}
726a989a 2700
bde351d5 2701static inline void
355fe088 2702gimple_assign_set_rhs2 (gimple *gs, tree rhs)
bde351d5
RB
2703{
2704 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
2705 return gimple_assign_set_rhs2 (ass, rhs);
726a989a
RB
2706}
2707
0354c0c7
BS
2708/* Return the third operand on the RHS of assignment statement GS.
2709 If GS does not have two operands, NULL is returned instead. */
2710
2711static inline tree
bde351d5 2712gimple_assign_rhs3 (const gassign *gs)
0354c0c7 2713{
0354c0c7 2714 if (gimple_num_ops (gs) >= 4)
bde351d5 2715 return gs->op[3];
0354c0c7
BS
2716 else
2717 return NULL_TREE;
2718}
2719
bde351d5 2720static inline tree
355fe088 2721gimple_assign_rhs3 (const gimple *gs)
bde351d5
RB
2722{
2723 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2724 return gimple_assign_rhs3 (ass);
2725}
2726
0354c0c7
BS
2727/* Return a pointer to the third operand on the RHS of assignment
2728 statement GS. */
2729
2730static inline tree *
1d10676d 2731gimple_assign_rhs3_ptr (gimple *gs)
0354c0c7 2732{
1d10676d 2733 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
bde351d5 2734 gcc_gimple_checking_assert (gimple_num_ops (gs) >= 4);
1d10676d 2735 return &ass->op[3];
0354c0c7
BS
2736}
2737
2738
2739/* Set RHS to be the third operand on the RHS of assignment statement GS. */
2740
2741static inline void
bde351d5 2742gimple_assign_set_rhs3 (gassign *gs, tree rhs)
0354c0c7 2743{
bde351d5
RB
2744 gcc_gimple_checking_assert (gimple_num_ops (gs) >= 4);
2745 gs->op[3] = rhs;
2746}
0354c0c7 2747
bde351d5 2748static inline void
355fe088 2749gimple_assign_set_rhs3 (gimple *gs, tree rhs)
bde351d5
RB
2750{
2751 gassign *ass = GIMPLE_CHECK2<gassign *> (gs);
2752 gimple_assign_set_rhs3 (ass, rhs);
0354c0c7
BS
2753}
2754
bde351d5 2755
00d66391
JJ
2756/* A wrapper around 3 operand gimple_assign_set_rhs_with_ops, for callers
2757 which expect to see only two operands. */
0354c0c7
BS
2758
2759static inline void
2760gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
2761 tree op1, tree op2)
2762{
00d66391
JJ
2763 gimple_assign_set_rhs_with_ops (gsi, code, op1, op2, NULL);
2764}
2765
2766/* A wrapper around 3 operand gimple_assign_set_rhs_with_ops, for callers
2767 which expect to see only one operands. */
2768
2769static inline void
2770gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
2771 tree op1)
2772{
2773 gimple_assign_set_rhs_with_ops (gsi, code, op1, NULL, NULL);
0354c0c7
BS
2774}
2775
726a989a
RB
2776/* Returns true if GS is a nontemporal move. */
2777
2778static inline bool
538dd0b7 2779gimple_assign_nontemporal_move_p (const gassign *gs)
726a989a 2780{
daa6e488 2781 return gs->nontemporal_move;
726a989a
RB
2782}
2783
2784/* Sets nontemporal move flag of GS to NONTEMPORAL. */
2785
2786static inline void
355fe088 2787gimple_assign_set_nontemporal_move (gimple *gs, bool nontemporal)
726a989a
RB
2788{
2789 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
daa6e488 2790 gs->nontemporal_move = nontemporal;
726a989a
RB
2791}
2792
2793
2794/* Return the code of the expression computed on the rhs of assignment
2795 statement GS. In case that the RHS is a single object, returns the
2796 tree code of the object. */
2797
2798static inline enum tree_code
bde351d5 2799gimple_assign_rhs_code (const gassign *gs)
726a989a 2800{
bde351d5 2801 enum tree_code code = (enum tree_code) gs->subcode;
3dbe9454
RG
2802 /* While we initially set subcode to the TREE_CODE of the rhs for
2803 GIMPLE_SINGLE_RHS assigns we do not update that subcode to stay
2804 in sync when we rewrite stmts into SSA form or do SSA propagations. */
726a989a 2805 if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
bde351d5 2806 code = TREE_CODE (gs->op[1]);
726a989a
RB
2807
2808 return code;
2809}
2810
bde351d5 2811static inline enum tree_code
355fe088 2812gimple_assign_rhs_code (const gimple *gs)
bde351d5
RB
2813{
2814 const gassign *ass = GIMPLE_CHECK2<const gassign *> (gs);
2815 return gimple_assign_rhs_code (ass);
2816}
2817
726a989a
RB
2818
2819/* Set CODE to be the code for the expression computed on the RHS of
2820 assignment S. */
2821
2822static inline void
355fe088 2823gimple_assign_set_rhs_code (gimple *s, enum tree_code code)
726a989a
RB
2824{
2825 GIMPLE_CHECK (s, GIMPLE_ASSIGN);
daa6e488 2826 s->subcode = code;
726a989a
RB
2827}
2828
2829
0f336c35
RG
2830/* Return the gimple rhs class of the code of the expression computed on
2831 the rhs of assignment statement GS.
2832 This will never return GIMPLE_INVALID_RHS. */
2833
2834static inline enum gimple_rhs_class
355fe088 2835gimple_assign_rhs_class (const gimple *gs)
0f336c35
RG
2836{
2837 return get_gimple_rhs_class (gimple_assign_rhs_code (gs));
2838}
2839
3dbe9454
RG
2840/* Return true if GS is an assignment with a singleton RHS, i.e.,
2841 there is no operator associated with the assignment itself.
2842 Unlike gimple_assign_copy_p, this predicate returns true for
2843 any RHS operand, including those that perform an operation
2844 and do not have the semantics of a copy, such as COND_EXPR. */
2845
2846static inline bool
355fe088 2847gimple_assign_single_p (const gimple *gs)
3dbe9454
RG
2848{
2849 return (is_gimple_assign (gs)
2850 && gimple_assign_rhs_class (gs) == GIMPLE_SINGLE_RHS);
2851}
2852
c12d9242
RB
2853/* Return true if GS performs a store to its lhs. */
2854
2855static inline bool
355fe088 2856gimple_store_p (const gimple *gs)
c12d9242
RB
2857{
2858 tree lhs = gimple_get_lhs (gs);
2859 return lhs && !is_gimple_reg (lhs);
2860}
2861
2862/* Return true if GS is an assignment that loads from its rhs1. */
2863
2864static inline bool
355fe088 2865gimple_assign_load_p (const gimple *gs)
c12d9242
RB
2866{
2867 tree rhs;
2868 if (!gimple_assign_single_p (gs))
2869 return false;
2870 rhs = gimple_assign_rhs1 (gs);
2871 if (TREE_CODE (rhs) == WITH_SIZE_EXPR)
2872 return true;
2873 rhs = get_base_address (rhs);
2874 return (DECL_P (rhs)
2875 || TREE_CODE (rhs) == MEM_REF || TREE_CODE (rhs) == TARGET_MEM_REF);
2876}
2877
0f336c35 2878
726a989a
RB
2879/* Return true if S is a type-cast assignment. */
2880
2881static inline bool
355fe088 2882gimple_assign_cast_p (const gimple *s)
726a989a
RB
2883{
2884 if (is_gimple_assign (s))
2885 {
2886 enum tree_code sc = gimple_assign_rhs_code (s);
1a87cf0c 2887 return CONVERT_EXPR_CODE_P (sc)
726a989a
RB
2888 || sc == VIEW_CONVERT_EXPR
2889 || sc == FIX_TRUNC_EXPR;
2890 }
2891
2892 return false;
2893}
2894
47598145
MM
2895/* Return true if S is a clobber statement. */
2896
2897static inline bool
355fe088 2898gimple_clobber_p (const gimple *s)
47598145
MM
2899{
2900 return gimple_assign_single_p (s)
2901 && TREE_CLOBBER_P (gimple_assign_rhs1 (s));
2902}
726a989a
RB
2903
2904/* Return true if GS is a GIMPLE_CALL. */
2905
2906static inline bool
355fe088 2907is_gimple_call (const gimple *gs)
726a989a
RB
2908{
2909 return gimple_code (gs) == GIMPLE_CALL;
2910}
2911
2912/* Return the LHS of call statement GS. */
2913
003b40ae
RB
2914static inline tree
2915gimple_call_lhs (const gcall *gs)
2916{
2917 return gs->op[0];
2918}
2919
726a989a 2920static inline tree
355fe088 2921gimple_call_lhs (const gimple *gs)
726a989a 2922{
003b40ae
RB
2923 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
2924 return gimple_call_lhs (gc);
726a989a
RB
2925}
2926
2927
2928/* Return a pointer to the LHS of call statement GS. */
2929
003b40ae 2930static inline tree *
1d10676d 2931gimple_call_lhs_ptr (gcall *gs)
003b40ae 2932{
1d10676d 2933 return &gs->op[0];
003b40ae
RB
2934}
2935
726a989a 2936static inline tree *
1d10676d 2937gimple_call_lhs_ptr (gimple *gs)
726a989a 2938{
1d10676d 2939 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
003b40ae 2940 return gimple_call_lhs_ptr (gc);
726a989a
RB
2941}
2942
2943
2944/* Set LHS to be the LHS operand of call statement GS. */
2945
2946static inline void
003b40ae 2947gimple_call_set_lhs (gcall *gs, tree lhs)
726a989a 2948{
003b40ae 2949 gs->op[0] = lhs;
726a989a
RB
2950 if (lhs && TREE_CODE (lhs) == SSA_NAME)
2951 SSA_NAME_DEF_STMT (lhs) = gs;
2952}
2953
003b40ae 2954static inline void
355fe088 2955gimple_call_set_lhs (gimple *gs, tree lhs)
003b40ae
RB
2956{
2957 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
2958 gimple_call_set_lhs (gc, lhs);
2959}
2960
726a989a 2961
25583c4f
RS
2962/* Return true if call GS calls an internal-only function, as enumerated
2963 by internal_fn. */
2964
2965static inline bool
003b40ae 2966gimple_call_internal_p (const gcall *gs)
25583c4f 2967{
daa6e488 2968 return (gs->subcode & GF_CALL_INTERNAL) != 0;
25583c4f
RS
2969}
2970
003b40ae 2971static inline bool
355fe088 2972gimple_call_internal_p (const gimple *gs)
003b40ae
RB
2973{
2974 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
2975 return gimple_call_internal_p (gc);
2976}
2977
5c5f0b65
IT
2978/* Return true if call GS is marked as nocf_check. */
2979
2980static inline bool
2981gimple_call_nocf_check_p (const gcall *gs)
2982{
2983 return (gs->subcode & GF_CALL_NOCF_CHECK) != 0;
2984}
2985
2986/* Mark statement GS as nocf_check call. */
2987
2988static inline void
2989gimple_call_set_nocf_check (gcall *gs, bool nocf_check)
2990{
2991 if (nocf_check)
2992 gs->subcode |= GF_CALL_NOCF_CHECK;
2993 else
2994 gs->subcode &= ~GF_CALL_NOCF_CHECK;
2995}
2996
25583c4f
RS
2997/* Return the target of internal call GS. */
2998
2999static inline enum internal_fn
003b40ae 3000gimple_call_internal_fn (const gcall *gs)
25583c4f
RS
3001{
3002 gcc_gimple_checking_assert (gimple_call_internal_p (gs));
003b40ae
RB
3003 return gs->u.internal_fn;
3004}
3005
3006static inline enum internal_fn
355fe088 3007gimple_call_internal_fn (const gimple *gs)
003b40ae
RB
3008{
3009 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3010 return gimple_call_internal_fn (gc);
25583c4f
RS
3011}
3012
8ab78162
NS
3013/* Return true, if this internal gimple call is unique. */
3014
3015static inline bool
3016gimple_call_internal_unique_p (const gcall *gs)
3017{
3018 return gimple_call_internal_fn (gs) == IFN_UNIQUE;
3019}
3020
3021static inline bool
3022gimple_call_internal_unique_p (const gimple *gs)
3023{
3024 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3025 return gimple_call_internal_unique_p (gc);
3026}
3027
81fea426
MP
3028/* Return true if GS is an internal function FN. */
3029
3030static inline bool
3031gimple_call_internal_p (const gimple *gs, internal_fn fn)
3032{
3033 return (is_gimple_call (gs)
3034 && gimple_call_internal_p (gs)
3035 && gimple_call_internal_fn (gs) == fn);
3036}
3037
58041fe6
MJ
3038/* If CTRL_ALTERING_P is true, mark GIMPLE_CALL S to be a stmt
3039 that could alter control flow. */
3040
3041static inline void
003b40ae 3042gimple_call_set_ctrl_altering (gcall *s, bool ctrl_altering_p)
58041fe6 3043{
58041fe6
MJ
3044 if (ctrl_altering_p)
3045 s->subcode |= GF_CALL_CTRL_ALTERING;
3046 else
3047 s->subcode &= ~GF_CALL_CTRL_ALTERING;
3048}
3049
003b40ae 3050static inline void
355fe088 3051gimple_call_set_ctrl_altering (gimple *s, bool ctrl_altering_p)
003b40ae
RB
3052{
3053 gcall *gc = GIMPLE_CHECK2<gcall *> (s);
3054 gimple_call_set_ctrl_altering (gc, ctrl_altering_p);
3055}
3056
58041fe6
MJ
3057/* Return true if call GS calls an func whose GF_CALL_CTRL_ALTERING
3058 flag is set. Such call could not be a stmt in the middle of a bb. */
3059
3060static inline bool
003b40ae 3061gimple_call_ctrl_altering_p (const gcall *gs)
58041fe6 3062{
58041fe6
MJ
3063 return (gs->subcode & GF_CALL_CTRL_ALTERING) != 0;
3064}
3065
003b40ae 3066static inline bool
355fe088 3067gimple_call_ctrl_altering_p (const gimple *gs)
003b40ae
RB
3068{
3069 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3070 return gimple_call_ctrl_altering_p (gc);
3071}
3072
25583c4f 3073
f20ca725 3074/* Return the function type of the function called by GS. */
726a989a
RB
3075
3076static inline tree
003b40ae 3077gimple_call_fntype (const gcall *gs)
726a989a 3078{
25583c4f
RS
3079 if (gimple_call_internal_p (gs))
3080 return NULL_TREE;
003b40ae
RB
3081 return gs->u.fntype;
3082}
3083
3084static inline tree
355fe088 3085gimple_call_fntype (const gimple *gs)
003b40ae
RB
3086{
3087 const gcall *call_stmt = GIMPLE_CHECK2<const gcall *> (gs);
3088 return gimple_call_fntype (call_stmt);
726a989a
RB
3089}
3090
538dd0b7 3091/* Set the type of the function called by CALL_STMT to FNTYPE. */
f20ca725
RG
3092
3093static inline void
538dd0b7 3094gimple_call_set_fntype (gcall *call_stmt, tree fntype)
f20ca725 3095{
538dd0b7 3096 gcc_gimple_checking_assert (!gimple_call_internal_p (call_stmt));
daa6e488 3097 call_stmt->u.fntype = fntype;
f20ca725
RG
3098}
3099
3100
3101/* Return the tree node representing the function called by call
3102 statement GS. */
9bfc434b 3103
003b40ae
RB
3104static inline tree
3105gimple_call_fn (const gcall *gs)
3106{
3107 return gs->op[1];
3108}
3109
9bfc434b 3110static inline tree
355fe088 3111gimple_call_fn (const gimple *gs)
9bfc434b 3112{
003b40ae
RB
3113 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3114 return gimple_call_fn (gc);
9bfc434b 3115}
726a989a
RB
3116
3117/* Return a pointer to the tree node representing the function called by call
3118 statement GS. */
3119
003b40ae 3120static inline tree *
1d10676d 3121gimple_call_fn_ptr (gcall *gs)
003b40ae 3122{
1d10676d 3123 return &gs->op[1];
003b40ae
RB
3124}
3125
726a989a 3126static inline tree *
1d10676d 3127gimple_call_fn_ptr (gimple *gs)
726a989a 3128{
1d10676d 3129 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
003b40ae 3130 return gimple_call_fn_ptr (gc);
726a989a
RB
3131}
3132
3133
3134/* Set FN to be the function called by call statement GS. */
3135
3136static inline void
538dd0b7 3137gimple_call_set_fn (gcall *gs, tree fn)
726a989a 3138{
25583c4f 3139 gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
a3fe41f5 3140 gs->op[1] = fn;
726a989a
RB
3141}
3142
3143
5fa9163d
AM
3144/* Set FNDECL to be the function called by call statement GS. */
3145
3146static inline void
003b40ae 3147gimple_call_set_fndecl (gcall *gs, tree decl)
5fa9163d 3148{
5fa9163d 3149 gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
003b40ae
RB
3150 gs->op[1] = build1_loc (gimple_location (gs), ADDR_EXPR,
3151 build_pointer_type (TREE_TYPE (decl)), decl);
3152}
3153
3154static inline void
355fe088 3155gimple_call_set_fndecl (gimple *gs, tree decl)
003b40ae
RB
3156{
3157 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
3158 gimple_call_set_fndecl (gc, decl);
5fa9163d
AM
3159}
3160
3161
538dd0b7 3162/* Set internal function FN to be the function called by call statement CALL_STMT. */
25583c4f
RS
3163
3164static inline void
538dd0b7 3165gimple_call_set_internal_fn (gcall *call_stmt, enum internal_fn fn)
25583c4f 3166{
538dd0b7 3167 gcc_gimple_checking_assert (gimple_call_internal_p (call_stmt));
daa6e488 3168 call_stmt->u.internal_fn = fn;
25583c4f
RS
3169}
3170
3171
726a989a
RB
3172/* If a given GIMPLE_CALL's callee is a FUNCTION_DECL, return it.
3173 Otherwise return NULL. This function is analogous to
3174 get_callee_fndecl in tree land. */
3175
3176static inline tree
003b40ae 3177gimple_call_fndecl (const gcall *gs)
726a989a 3178{
3b45a007 3179 return gimple_call_addr_fndecl (gimple_call_fn (gs));
726a989a
RB
3180}
3181
003b40ae 3182static inline tree
355fe088 3183gimple_call_fndecl (const gimple *gs)
003b40ae
RB
3184{
3185 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3186 return gimple_call_fndecl (gc);
3187}
3188
726a989a
RB
3189
3190/* Return the type returned by call statement GS. */
3191
3192static inline tree
538dd0b7 3193gimple_call_return_type (const gcall *gs)
726a989a 3194{
9bfc434b 3195 tree type = gimple_call_fntype (gs);
726a989a 3196
25583c4f
RS
3197 if (type == NULL_TREE)
3198 return TREE_TYPE (gimple_call_lhs (gs));
3199
9bfc434b 3200 /* The type returned by a function is the type of its
726a989a
RB
3201 function type. */
3202 return TREE_TYPE (type);
3203}
3204
3205
3206/* Return the static chain for call statement GS. */
3207
003b40ae
RB
3208static inline tree
3209gimple_call_chain (const gcall *gs)
3210{
3211 return gs->op[2];
3212}
3213
726a989a 3214static inline tree
355fe088 3215gimple_call_chain (const gimple *gs)
726a989a 3216{
003b40ae
RB
3217 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3218 return gimple_call_chain (gc);
726a989a
RB
3219}
3220
3221
538dd0b7 3222/* Return a pointer to the static chain for call statement CALL_STMT. */
726a989a
RB
3223
3224static inline tree *
1d10676d 3225gimple_call_chain_ptr (gcall *call_stmt)
726a989a 3226{
1d10676d 3227 return &call_stmt->op[2];
726a989a
RB
3228}
3229
538dd0b7 3230/* Set CHAIN to be the static chain for call statement CALL_STMT. */
726a989a
RB
3231
3232static inline void
538dd0b7 3233gimple_call_set_chain (gcall *call_stmt, tree chain)
726a989a 3234{
a3fe41f5 3235 call_stmt->op[2] = chain;
726a989a
RB
3236}
3237
3238
3239/* Return the number of arguments used by call statement GS. */
3240
003b40ae
RB
3241static inline unsigned
3242gimple_call_num_args (const gcall *gs)
3243{
3244 return gimple_num_ops (gs) - 3;
3245}
3246
726a989a 3247static inline unsigned
355fe088 3248gimple_call_num_args (const gimple *gs)
726a989a 3249{
003b40ae
RB
3250 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3251 return gimple_call_num_args (gc);
726a989a
RB
3252}
3253
3254
3255/* Return the argument at position INDEX for call statement GS. */
3256
003b40ae
RB
3257static inline tree
3258gimple_call_arg (const gcall *gs, unsigned index)
3259{
3260 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 3);
3261 return gs->op[index + 3];
3262}
3263
726a989a 3264static inline tree
355fe088 3265gimple_call_arg (const gimple *gs, unsigned index)
726a989a 3266{
003b40ae
RB
3267 const gcall *gc = GIMPLE_CHECK2<const gcall *> (gs);
3268 return gimple_call_arg (gc, index);
726a989a
RB
3269}
3270
3271
3272/* Return a pointer to the argument at position INDEX for call
3273 statement GS. */
3274
003b40ae 3275static inline tree *
1d10676d 3276gimple_call_arg_ptr (gcall *gs, unsigned index)
003b40ae
RB
3277{
3278 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 3);
1d10676d 3279 return &gs->op[index + 3];
003b40ae
RB
3280}
3281
726a989a 3282static inline tree *
1d10676d 3283gimple_call_arg_ptr (gimple *gs, unsigned index)
726a989a 3284{
1d10676d 3285 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
003b40ae 3286 return gimple_call_arg_ptr (gc, index);
726a989a
RB
3287}
3288
3289
3290/* Set ARG to be the argument at position INDEX for call statement GS. */
3291
003b40ae
RB
3292static inline void
3293gimple_call_set_arg (gcall *gs, unsigned index, tree arg)
3294{
3295 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 3);
3296 gs->op[index + 3] = arg;
3297}
3298
726a989a 3299static inline void
355fe088 3300gimple_call_set_arg (gimple *gs, unsigned index, tree arg)
726a989a 3301{
003b40ae
RB
3302 gcall *gc = GIMPLE_CHECK2<gcall *> (gs);
3303 gimple_call_set_arg (gc, index, arg);
726a989a
RB
3304}
3305
3306
3307/* If TAIL_P is true, mark call statement S as being a tail call
3308 (i.e., a call just before the exit of a function). These calls are
3309 candidate for tail call optimization. */
3310
3311static inline void
538dd0b7 3312gimple_call_set_tail (gcall *s, bool tail_p)
726a989a 3313{
726a989a 3314 if (tail_p)
daa6e488 3315 s->subcode |= GF_CALL_TAILCALL;
726a989a 3316 else
daa6e488 3317 s->subcode &= ~GF_CALL_TAILCALL;
726a989a
RB
3318}
3319
3320
3321/* Return true if GIMPLE_CALL S is marked as a tail call. */
3322
3323static inline bool
0e7b6a51 3324gimple_call_tail_p (const gcall *s)
726a989a 3325{
daa6e488 3326 return (s->subcode & GF_CALL_TAILCALL) != 0;
726a989a
RB
3327}
3328
9a385c2d
DM
3329/* Mark (or clear) call statement S as requiring tail call optimization. */
3330
3331static inline void
3332gimple_call_set_must_tail (gcall *s, bool must_tail_p)
3333{
3334 if (must_tail_p)
3335 s->subcode |= GF_CALL_MUST_TAIL_CALL;
3336 else
3337 s->subcode &= ~GF_CALL_MUST_TAIL_CALL;
3338}
3339
3340/* Return true if call statement has been marked as requiring
3341 tail call optimization. */
3342
3343static inline bool
3344gimple_call_must_tail_p (const gcall *s)
3345{
3346 return (s->subcode & GF_CALL_MUST_TAIL_CALL) != 0;
3347}
726a989a 3348
726a989a
RB
3349/* If RETURN_SLOT_OPT_P is true mark GIMPLE_CALL S as valid for return
3350 slot optimization. This transformation uses the target of the call
3351 expansion as the return slot for calls that return in memory. */
3352
3353static inline void
538dd0b7 3354gimple_call_set_return_slot_opt (gcall *s, bool return_slot_opt_p)
726a989a 3355{
726a989a 3356 if (return_slot_opt_p)
daa6e488 3357 s->subcode |= GF_CALL_RETURN_SLOT_OPT;
726a989a 3358 else
daa6e488 3359 s->subcode &= ~GF_CALL_RETURN_SLOT_OPT;
726a989a
RB
3360}
3361
3362
3363/* Return true if S is marked for return slot optimization. */
3364
3365static inline bool
0e7b6a51 3366gimple_call_return_slot_opt_p (const gcall *s)
726a989a 3367{
daa6e488 3368 return (s->subcode & GF_CALL_RETURN_SLOT_OPT) != 0;
726a989a
RB
3369}
3370
3371
3372/* If FROM_THUNK_P is true, mark GIMPLE_CALL S as being the jump from a
3373 thunk to the thunked-to function. */
3374
3375static inline void
538dd0b7 3376gimple_call_set_from_thunk (gcall *s, bool from_thunk_p)
726a989a 3377{
726a989a 3378 if (from_thunk_p)
daa6e488 3379 s->subcode |= GF_CALL_FROM_THUNK;
726a989a 3380 else
daa6e488 3381 s->subcode &= ~GF_CALL_FROM_THUNK;
726a989a
RB
3382}
3383
3384
3385/* Return true if GIMPLE_CALL S is a jump from a thunk. */
3386
3387static inline bool
538dd0b7 3388gimple_call_from_thunk_p (gcall *s)
726a989a 3389{
daa6e488 3390 return (s->subcode & GF_CALL_FROM_THUNK) != 0;
726a989a
RB
3391}
3392
3393
3394/* If PASS_ARG_PACK_P is true, GIMPLE_CALL S is a stdarg call that needs the
3395 argument pack in its argument list. */
3396
3397static inline void
538dd0b7 3398gimple_call_set_va_arg_pack (gcall *s, bool pass_arg_pack_p)
726a989a 3399{
726a989a 3400 if (pass_arg_pack_p)
daa6e488 3401 s->subcode |= GF_CALL_VA_ARG_PACK;
726a989a 3402 else
daa6e488 3403 s->subcode &= ~GF_CALL_VA_ARG_PACK;
726a989a
RB
3404}
3405
3406
3407/* Return true if GIMPLE_CALL S is a stdarg call that needs the
3408 argument pack in its argument list. */
3409
3410static inline bool
0e7b6a51 3411gimple_call_va_arg_pack_p (const gcall *s)
726a989a 3412{
daa6e488 3413 return (s->subcode & GF_CALL_VA_ARG_PACK) != 0;
726a989a
RB
3414}
3415
3416
3417/* Return true if S is a noreturn call. */
3418
3419static inline bool
003b40ae 3420gimple_call_noreturn_p (const gcall *s)
726a989a 3421{
726a989a
RB
3422 return (gimple_call_flags (s) & ECF_NORETURN) != 0;
3423}
3424
003b40ae 3425static inline bool
355fe088 3426gimple_call_noreturn_p (const gimple *s)
003b40ae
RB
3427{
3428 const gcall *gc = GIMPLE_CHECK2<const gcall *> (s);
3429 return gimple_call_noreturn_p (gc);
3430}
3431
726a989a 3432
9bb1a81b
JM
3433/* If NOTHROW_P is true, GIMPLE_CALL S is a call that is known to not throw
3434 even if the called function can throw in other cases. */
3435
3436static inline void
538dd0b7 3437gimple_call_set_nothrow (gcall *s, bool nothrow_p)
9bb1a81b 3438{
9bb1a81b 3439 if (nothrow_p)
daa6e488 3440 s->subcode |= GF_CALL_NOTHROW;
9bb1a81b 3441 else
daa6e488 3442 s->subcode &= ~GF_CALL_NOTHROW;
9bb1a81b
JM
3443}
3444
726a989a
RB
3445/* Return true if S is a nothrow call. */
3446
3447static inline bool
538dd0b7 3448gimple_call_nothrow_p (gcall *s)
726a989a 3449{
726a989a
RB
3450 return (gimple_call_flags (s) & ECF_NOTHROW) != 0;
3451}
3452
63d2a353
MM
3453/* If FOR_VAR is true, GIMPLE_CALL S is a call to builtin_alloca that
3454 is known to be emitted for VLA objects. Those are wrapped by
3455 stack_save/stack_restore calls and hence can't lead to unbounded
3456 stack growth even when they occur in loops. */
3457
3458static inline void
538dd0b7 3459gimple_call_set_alloca_for_var (gcall *s, bool for_var)
63d2a353 3460{
63d2a353 3461 if (for_var)
daa6e488 3462 s->subcode |= GF_CALL_ALLOCA_FOR_VAR;
63d2a353 3463 else
daa6e488 3464 s->subcode &= ~GF_CALL_ALLOCA_FOR_VAR;
63d2a353
MM
3465}
3466
3467/* Return true of S is a call to builtin_alloca emitted for VLA objects. */
3468
3469static inline bool
538dd0b7 3470gimple_call_alloca_for_var_p (gcall *s)
63d2a353 3471{
daa6e488 3472 return (s->subcode & GF_CALL_ALLOCA_FOR_VAR) != 0;
63d2a353 3473}
726a989a 3474
4c640e26
EB
3475/* If BY_DESCRIPTOR_P is true, GIMPLE_CALL S is an indirect call for which
3476 pointers to nested function are descriptors instead of trampolines. */
3477
3478static inline void
3479gimple_call_set_by_descriptor (gcall *s, bool by_descriptor_p)
3480{
3481 if (by_descriptor_p)
3482 s->subcode |= GF_CALL_BY_DESCRIPTOR;
3483 else
3484 s->subcode &= ~GF_CALL_BY_DESCRIPTOR;
3485}
3486
3487/* Return true if S is a by-descriptor call. */
3488
3489static inline bool
3490gimple_call_by_descriptor_p (gcall *s)
3491{
3492 return (s->subcode & GF_CALL_BY_DESCRIPTOR) != 0;
3493}
3494
726a989a
RB
3495/* Copy all the GF_CALL_* flags from ORIG_CALL to DEST_CALL. */
3496
3497static inline void
538dd0b7 3498gimple_call_copy_flags (gcall *dest_call, gcall *orig_call)
726a989a 3499{
daa6e488 3500 dest_call->subcode = orig_call->subcode;
726a989a
RB
3501}
3502
3503
d086d311 3504/* Return a pointer to the points-to solution for the set of call-used
538dd0b7 3505 variables of the call CALL_STMT. */
d086d311
RG
3506
3507static inline struct pt_solution *
538dd0b7 3508gimple_call_use_set (gcall *call_stmt)
d086d311 3509{
daa6e488 3510 return &call_stmt->call_used;
d086d311
RG
3511}
3512
0e7b6a51
DM
3513/* As above, but const. */
3514
3515static inline const pt_solution *
3516gimple_call_use_set (const gcall *call_stmt)
3517{
3518 return &call_stmt->call_used;
3519}
d086d311
RG
3520
3521/* Return a pointer to the points-to solution for the set of call-used
538dd0b7 3522 variables of the call CALL_STMT. */
d086d311
RG
3523
3524static inline struct pt_solution *
538dd0b7 3525gimple_call_clobber_set (gcall *call_stmt)
d086d311 3526{
daa6e488 3527 return &call_stmt->call_clobbered;
d086d311
RG
3528}
3529
0e7b6a51
DM
3530/* As above, but const. */
3531
3532static inline const pt_solution *
3533gimple_call_clobber_set (const gcall *call_stmt)
3534{
3535 return &call_stmt->call_clobbered;
3536}
3537
d086d311 3538
726a989a
RB
3539/* Returns true if this is a GIMPLE_ASSIGN or a GIMPLE_CALL with a
3540 non-NULL lhs. */
3541
3542static inline bool
0e7b6a51 3543gimple_has_lhs (const gimple *stmt)
726a989a 3544{
003b40ae
RB
3545 if (is_gimple_assign (stmt))
3546 return true;
0e7b6a51 3547 if (const gcall *call = dyn_cast <const gcall *> (stmt))
003b40ae
RB
3548 return gimple_call_lhs (call) != NULL_TREE;
3549 return false;
726a989a
RB
3550}
3551
3552
3553/* Return the code of the predicate computed by conditional statement GS. */
3554
3555static inline enum tree_code
003b40ae 3556gimple_cond_code (const gcond *gs)
726a989a 3557{
daa6e488 3558 return (enum tree_code) gs->subcode;
726a989a
RB
3559}
3560
003b40ae 3561static inline enum tree_code
355fe088 3562gimple_cond_code (const gimple *gs)
003b40ae
RB
3563{
3564 const gcond *gc = GIMPLE_CHECK2<const gcond *> (gs);
3565 return gimple_cond_code (gc);
3566}
3567
726a989a
RB
3568
3569/* Set CODE to be the predicate code for the conditional statement GS. */
3570
3571static inline void
538dd0b7 3572gimple_cond_set_code (gcond *gs, enum tree_code code)
726a989a 3573{
daa6e488 3574 gs->subcode = code;
726a989a
RB
3575}
3576
3577
3578/* Return the LHS of the predicate computed by conditional statement GS. */
3579
003b40ae
RB
3580static inline tree
3581gimple_cond_lhs (const gcond *gs)
3582{
3583 return gs->op[0];
3584}
3585
726a989a 3586static inline tree
355fe088 3587gimple_cond_lhs (const gimple *gs)
726a989a 3588{
003b40ae
RB
3589 const gcond *gc = GIMPLE_CHECK2<const gcond *> (gs);
3590 return gimple_cond_lhs (gc);
726a989a
RB
3591}
3592
3593/* Return the pointer to the LHS of the predicate computed by conditional
3594 statement GS. */
3595
3596static inline tree *
1d10676d 3597gimple_cond_lhs_ptr (gcond *gs)
726a989a 3598{
1d10676d 3599 return &gs->op[0];
726a989a
RB
3600}
3601
3602/* Set LHS to be the LHS operand of the predicate computed by
3603 conditional statement GS. */
3604
3605static inline void
538dd0b7 3606gimple_cond_set_lhs (gcond *gs, tree lhs)
726a989a 3607{
a3fe41f5 3608 gs->op[0] = lhs;
726a989a
RB
3609}
3610
3611
3612/* Return the RHS operand of the predicate computed by conditional GS. */
3613
003b40ae
RB
3614static inline tree
3615gimple_cond_rhs (const gcond *gs)
3616{
3617 return gs->op[1];
3618}
3619
726a989a 3620static inline tree
355fe088 3621gimple_cond_rhs (const gimple *gs)
726a989a 3622{
003b40ae
RB
3623 const gcond *gc = GIMPLE_CHECK2<const gcond *> (gs);
3624 return gimple_cond_rhs (gc);
726a989a
RB
3625}
3626
3627/* Return the pointer to the RHS operand of the predicate computed by
3628 conditional GS. */
3629
3630static inline tree *
1d10676d 3631gimple_cond_rhs_ptr (gcond *gs)
726a989a 3632{
1d10676d 3633 return &gs->op[1];
726a989a
RB
3634}
3635
3636
3637/* Set RHS to be the RHS operand of the predicate computed by
3638 conditional statement GS. */
3639
3640static inline void
538dd0b7 3641gimple_cond_set_rhs (gcond *gs, tree rhs)
726a989a 3642{
a3fe41f5 3643 gs->op[1] = rhs;
726a989a
RB
3644}
3645
3646
3647/* Return the label used by conditional statement GS when its
3648 predicate evaluates to true. */
3649
3650static inline tree
538dd0b7 3651gimple_cond_true_label (const gcond *gs)
726a989a 3652{
a3fe41f5 3653 return gs->op[2];
726a989a
RB
3654}
3655
3656
3657/* Set LABEL to be the label used by conditional statement GS when its
3658 predicate evaluates to true. */
3659
3660static inline void
538dd0b7 3661gimple_cond_set_true_label (gcond *gs, tree label)
726a989a 3662{
a3fe41f5 3663 gs->op[2] = label;
726a989a
RB
3664}
3665
3666
3667/* Set LABEL to be the label used by conditional statement GS when its
3668 predicate evaluates to false. */
3669
3670static inline void
538dd0b7 3671gimple_cond_set_false_label (gcond *gs, tree label)
726a989a 3672{
a3fe41f5 3673 gs->op[3] = label;
726a989a
RB
3674}
3675
3676
3677/* Return the label used by conditional statement GS when its
3678 predicate evaluates to false. */
3679
3680static inline tree
538dd0b7 3681gimple_cond_false_label (const gcond *gs)
726a989a 3682{
a3fe41f5 3683 return gs->op[3];
726a989a
RB
3684}
3685
3686
3687/* Set the conditional COND_STMT to be of the form 'if (1 == 0)'. */
3688
3689static inline void
538dd0b7 3690gimple_cond_make_false (gcond *gs)
726a989a 3691{
bde7d04b 3692 gimple_cond_set_lhs (gs, boolean_false_node);
726a989a 3693 gimple_cond_set_rhs (gs, boolean_false_node);
bde7d04b 3694 gs->subcode = NE_EXPR;
726a989a
RB
3695}
3696
3697
3698/* Set the conditional COND_STMT to be of the form 'if (1 == 1)'. */
3699
3700static inline void
538dd0b7 3701gimple_cond_make_true (gcond *gs)
726a989a
RB
3702{
3703 gimple_cond_set_lhs (gs, boolean_true_node);
bde7d04b
RB
3704 gimple_cond_set_rhs (gs, boolean_false_node);
3705 gs->subcode = NE_EXPR;
726a989a
RB
3706}
3707
3708/* Check if conditional statemente GS is of the form 'if (1 == 1)',
3709 'if (0 == 0)', 'if (1 != 0)' or 'if (0 != 1)' */
3710
3711static inline bool
538dd0b7 3712gimple_cond_true_p (const gcond *gs)
726a989a
RB
3713{
3714 tree lhs = gimple_cond_lhs (gs);
3715 tree rhs = gimple_cond_rhs (gs);
3716 enum tree_code code = gimple_cond_code (gs);
3717
3718 if (lhs != boolean_true_node && lhs != boolean_false_node)
3719 return false;
3720
3721 if (rhs != boolean_true_node && rhs != boolean_false_node)
3722 return false;
3723
3724 if (code == NE_EXPR && lhs != rhs)
3725 return true;
3726
3727 if (code == EQ_EXPR && lhs == rhs)
3728 return true;
3729
3730 return false;
3731}
3732
3733/* Check if conditional statement GS is of the form 'if (1 != 1)',
3734 'if (0 != 0)', 'if (1 == 0)' or 'if (0 == 1)' */
3735
3736static inline bool
538dd0b7 3737gimple_cond_false_p (const gcond *gs)
726a989a
RB
3738{
3739 tree lhs = gimple_cond_lhs (gs);
3740 tree rhs = gimple_cond_rhs (gs);
3741 enum tree_code code = gimple_cond_code (gs);
3742
3743 if (lhs != boolean_true_node && lhs != boolean_false_node)
3744 return false;
3745
3746 if (rhs != boolean_true_node && rhs != boolean_false_node)
3747 return false;
3748
3749 if (code == NE_EXPR && lhs == rhs)
3750 return true;
3751
3752 if (code == EQ_EXPR && lhs != rhs)
3753 return true;
3754
3755 return false;
3756}
3757
726a989a
RB
3758/* Set the code, LHS and RHS of GIMPLE_COND STMT from CODE, LHS and RHS. */
3759
3760static inline void
538dd0b7
DM
3761gimple_cond_set_condition (gcond *stmt, enum tree_code code, tree lhs,
3762 tree rhs)
726a989a
RB
3763{
3764 gimple_cond_set_code (stmt, code);
3765 gimple_cond_set_lhs (stmt, lhs);
3766 gimple_cond_set_rhs (stmt, rhs);
3767}
3768
3769/* Return the LABEL_DECL node used by GIMPLE_LABEL statement GS. */
3770
3771static inline tree
538dd0b7 3772gimple_label_label (const glabel *gs)
726a989a 3773{
a3fe41f5 3774 return gs->op[0];
726a989a
RB
3775}
3776
3777
3778/* Set LABEL to be the LABEL_DECL node used by GIMPLE_LABEL statement
3779 GS. */
3780
3781static inline void
538dd0b7 3782gimple_label_set_label (glabel *gs, tree label)
726a989a 3783{
a3fe41f5 3784 gs->op[0] = label;
726a989a
RB
3785}
3786
3787
3788/* Return the destination of the unconditional jump GS. */
3789
3790static inline tree
355fe088 3791gimple_goto_dest (const gimple *gs)
726a989a
RB
3792{
3793 GIMPLE_CHECK (gs, GIMPLE_GOTO);
3794 return gimple_op (gs, 0);
3795}
3796
3797
3798/* Set DEST to be the destination of the unconditonal jump GS. */
3799
b8698a0f 3800static inline void
538dd0b7 3801gimple_goto_set_dest (ggoto *gs, tree dest)
726a989a 3802{
a3fe41f5 3803 gs->op[0] = dest;
726a989a
RB
3804}
3805
3806
3807/* Return the variables declared in the GIMPLE_BIND statement GS. */
3808
3809static inline tree
538dd0b7 3810gimple_bind_vars (const gbind *bind_stmt)
726a989a 3811{
daa6e488 3812 return bind_stmt->vars;
726a989a
RB
3813}
3814
3815
3816/* Set VARS to be the set of variables declared in the GIMPLE_BIND
3817 statement GS. */
3818
3819static inline void
538dd0b7 3820gimple_bind_set_vars (gbind *bind_stmt, tree vars)
726a989a 3821{
daa6e488 3822 bind_stmt->vars = vars;
726a989a
RB
3823}
3824
3825
3826/* Append VARS to the set of variables declared in the GIMPLE_BIND
3827 statement GS. */
3828
3829static inline void
538dd0b7 3830gimple_bind_append_vars (gbind *bind_stmt, tree vars)
726a989a 3831{
daa6e488 3832 bind_stmt->vars = chainon (bind_stmt->vars, vars);
726a989a
RB
3833}
3834
3835
355a7673 3836static inline gimple_seq *
538dd0b7 3837gimple_bind_body_ptr (gbind *bind_stmt)
355a7673 3838{
daa6e488 3839 return &bind_stmt->body;
355a7673
MM
3840}
3841
726a989a
RB
3842/* Return the GIMPLE sequence contained in the GIMPLE_BIND statement GS. */
3843
3844static inline gimple_seq
0e7b6a51 3845gimple_bind_body (const gbind *gs)
726a989a 3846{
0e7b6a51 3847 return *gimple_bind_body_ptr (const_cast <gbind *> (gs));
726a989a
RB
3848}
3849
3850
3851/* Set SEQ to be the GIMPLE sequence contained in the GIMPLE_BIND
3852 statement GS. */
3853
3854static inline void
538dd0b7 3855gimple_bind_set_body (gbind *bind_stmt, gimple_seq seq)
726a989a 3856{
daa6e488 3857 bind_stmt->body = seq;
726a989a
RB
3858}
3859
3860
3861/* Append a statement to the end of a GIMPLE_BIND's body. */
3862
3863static inline void
355fe088 3864gimple_bind_add_stmt (gbind *bind_stmt, gimple *stmt)
726a989a 3865{
daa6e488 3866 gimple_seq_add_stmt (&bind_stmt->body, stmt);
726a989a
RB
3867}
3868
3869
3870/* Append a sequence of statements to the end of a GIMPLE_BIND's body. */
3871
3872static inline void
538dd0b7 3873gimple_bind_add_seq (gbind *bind_stmt, gimple_seq seq)
726a989a 3874{
daa6e488 3875 gimple_seq_add_seq (&bind_stmt->body, seq);
726a989a
RB
3876}
3877
3878
3879/* Return the TREE_BLOCK node associated with GIMPLE_BIND statement
3880 GS. This is analogous to the BIND_EXPR_BLOCK field in trees. */
3881
3882static inline tree
538dd0b7 3883gimple_bind_block (const gbind *bind_stmt)
726a989a 3884{
daa6e488 3885 return bind_stmt->block;
726a989a
RB
3886}
3887
3888
3889/* Set BLOCK to be the TREE_BLOCK node associated with GIMPLE_BIND
3890 statement GS. */
3891
3892static inline void
538dd0b7 3893gimple_bind_set_block (gbind *bind_stmt, tree block)
726a989a 3894{
2bc0a660
JH
3895 gcc_gimple_checking_assert (block == NULL_TREE
3896 || TREE_CODE (block) == BLOCK);
daa6e488 3897 bind_stmt->block = block;
726a989a
RB
3898}
3899
3900
538dd0b7 3901/* Return the number of input operands for GIMPLE_ASM ASM_STMT. */
726a989a
RB
3902
3903static inline unsigned
538dd0b7 3904gimple_asm_ninputs (const gasm *asm_stmt)
726a989a 3905{
daa6e488 3906 return asm_stmt->ni;
726a989a
RB
3907}
3908
3909
538dd0b7 3910/* Return the number of output operands for GIMPLE_ASM ASM_STMT. */
726a989a
RB
3911
3912static inline unsigned
538dd0b7 3913gimple_asm_noutputs (const gasm *asm_stmt)
726a989a 3914{
daa6e488 3915 return asm_stmt->no;
726a989a
RB
3916}
3917
3918
538dd0b7 3919/* Return the number of clobber operands for GIMPLE_ASM ASM_STMT. */
726a989a
RB
3920
3921static inline unsigned
538dd0b7 3922gimple_asm_nclobbers (const gasm *asm_stmt)
726a989a 3923{
daa6e488 3924 return asm_stmt->nc;
726a989a
RB
3925}
3926
538dd0b7 3927/* Return the number of label operands for GIMPLE_ASM ASM_STMT. */
1c384bf1
RH
3928
3929static inline unsigned
538dd0b7 3930gimple_asm_nlabels (const gasm *asm_stmt)
1c384bf1 3931{
daa6e488 3932 return asm_stmt->nl;
1c384bf1 3933}
726a989a 3934
538dd0b7 3935/* Return input operand INDEX of GIMPLE_ASM ASM_STMT. */
726a989a
RB
3936
3937static inline tree
538dd0b7 3938gimple_asm_input_op (const gasm *asm_stmt, unsigned index)
726a989a 3939{
daa6e488 3940 gcc_gimple_checking_assert (index < asm_stmt->ni);
a3fe41f5 3941 return asm_stmt->op[index + asm_stmt->no];
726a989a
RB
3942}
3943
538dd0b7 3944/* Set IN_OP to be input operand INDEX in GIMPLE_ASM ASM_STMT. */
726a989a
RB
3945
3946static inline void
538dd0b7 3947gimple_asm_set_input_op (gasm *asm_stmt, unsigned index, tree in_op)
726a989a 3948{
daa6e488 3949 gcc_gimple_checking_assert (index < asm_stmt->ni
2bc0a660 3950 && TREE_CODE (in_op) == TREE_LIST);
a3fe41f5 3951 asm_stmt->op[index + asm_stmt->no] = in_op;
726a989a
RB
3952}
3953
3954
538dd0b7 3955/* Return output operand INDEX of GIMPLE_ASM ASM_STMT. */
726a989a
RB
3956
3957static inline tree
538dd0b7 3958gimple_asm_output_op (const gasm *asm_stmt, unsigned index)
726a989a 3959{
daa6e488 3960 gcc_gimple_checking_assert (index < asm_stmt->no);
a3fe41f5 3961 return asm_stmt->op[index];
726a989a
RB
3962}
3963
538dd0b7 3964/* Set OUT_OP to be output operand INDEX in GIMPLE_ASM ASM_STMT. */
726a989a
RB
3965
3966static inline void
538dd0b7 3967gimple_asm_set_output_op (gasm *asm_stmt, unsigned index, tree out_op)
726a989a 3968{
daa6e488 3969 gcc_gimple_checking_assert (index < asm_stmt->no
2bc0a660 3970 && TREE_CODE (out_op) == TREE_LIST);
a3fe41f5 3971 asm_stmt->op[index] = out_op;
726a989a
RB
3972}
3973
3974
538dd0b7 3975/* Return clobber operand INDEX of GIMPLE_ASM ASM_STMT. */
726a989a
RB
3976
3977static inline tree
538dd0b7 3978gimple_asm_clobber_op (const gasm *asm_stmt, unsigned index)
726a989a 3979{
daa6e488 3980 gcc_gimple_checking_assert (index < asm_stmt->nc);
a3fe41f5 3981 return asm_stmt->op[index + asm_stmt->ni + asm_stmt->no];
726a989a
RB
3982}
3983
3984
538dd0b7 3985/* Set CLOBBER_OP to be clobber operand INDEX in GIMPLE_ASM ASM_STMT. */
726a989a
RB
3986
3987static inline void
538dd0b7 3988gimple_asm_set_clobber_op (gasm *asm_stmt, unsigned index, tree clobber_op)
726a989a 3989{
daa6e488 3990 gcc_gimple_checking_assert (index < asm_stmt->nc
2bc0a660 3991 && TREE_CODE (clobber_op) == TREE_LIST);
a3fe41f5 3992 asm_stmt->op[index + asm_stmt->ni + asm_stmt->no] = clobber_op;
726a989a
RB
3993}
3994
538dd0b7 3995/* Return label operand INDEX of GIMPLE_ASM ASM_STMT. */
1c384bf1
RH
3996
3997static inline tree
538dd0b7 3998gimple_asm_label_op (const gasm *asm_stmt, unsigned index)
1c384bf1 3999{
daa6e488 4000 gcc_gimple_checking_assert (index < asm_stmt->nl);
a3fe41f5 4001 return asm_stmt->op[index + asm_stmt->ni + asm_stmt->nc];
1c384bf1
RH
4002}
4003
538dd0b7 4004/* Set LABEL_OP to be label operand INDEX in GIMPLE_ASM ASM_STMT. */
1c384bf1
RH
4005
4006static inline void
538dd0b7 4007gimple_asm_set_label_op (gasm *asm_stmt, unsigned index, tree label_op)
1c384bf1 4008{
daa6e488 4009 gcc_gimple_checking_assert (index < asm_stmt->nl
2bc0a660 4010 && TREE_CODE (label_op) == TREE_LIST);
a3fe41f5 4011 asm_stmt->op[index + asm_stmt->ni + asm_stmt->nc] = label_op;
1c384bf1 4012}
726a989a
RB
4013
4014/* Return the string representing the assembly instruction in
538dd0b7 4015 GIMPLE_ASM ASM_STMT. */
726a989a
RB
4016
4017static inline const char *
538dd0b7 4018gimple_asm_string (const gasm *asm_stmt)
726a989a 4019{
daa6e488 4020 return asm_stmt->string;
726a989a
RB
4021}
4022
4023
5b76e75f 4024/* Return true if ASM_STMT is marked volatile. */
726a989a
RB
4025
4026static inline bool
538dd0b7 4027gimple_asm_volatile_p (const gasm *asm_stmt)
726a989a 4028{
538dd0b7 4029 return (asm_stmt->subcode & GF_ASM_VOLATILE) != 0;
726a989a
RB
4030}
4031
4032
5b76e75f 4033/* If VOLATILE_P is true, mark asm statement ASM_STMT as volatile. */
726a989a
RB
4034
4035static inline void
538dd0b7 4036gimple_asm_set_volatile (gasm *asm_stmt, bool volatile_p)
726a989a 4037{
726a989a 4038 if (volatile_p)
538dd0b7 4039 asm_stmt->subcode |= GF_ASM_VOLATILE;
726a989a 4040 else
538dd0b7 4041 asm_stmt->subcode &= ~GF_ASM_VOLATILE;
726a989a
RB
4042}
4043
4044
5b76e75f
SB
4045/* Return true if ASM_STMT is marked inline. */
4046
4047static inline bool
4048gimple_asm_inline_p (const gasm *asm_stmt)
4049{
4050 return (asm_stmt->subcode & GF_ASM_INLINE) != 0;
4051}
4052
4053
4054/* If INLINE_P is true, mark asm statement ASM_STMT as inline. */
4055
4056static inline void
4057gimple_asm_set_inline (gasm *asm_stmt, bool inline_p)
4058{
4059 if (inline_p)
4060 asm_stmt->subcode |= GF_ASM_INLINE;
4061 else
4062 asm_stmt->subcode &= ~GF_ASM_INLINE;
4063}
4064
4065
538dd0b7 4066/* If INPUT_P is true, mark asm ASM_STMT as an ASM_INPUT. */
726a989a
RB
4067
4068static inline void
538dd0b7 4069gimple_asm_set_input (gasm *asm_stmt, bool input_p)
726a989a 4070{
726a989a 4071 if (input_p)
538dd0b7 4072 asm_stmt->subcode |= GF_ASM_INPUT;
726a989a 4073 else
538dd0b7 4074 asm_stmt->subcode &= ~GF_ASM_INPUT;
726a989a
RB
4075}
4076
4077
538dd0b7 4078/* Return true if asm ASM_STMT is an ASM_INPUT. */
726a989a
RB
4079
4080static inline bool
538dd0b7 4081gimple_asm_input_p (const gasm *asm_stmt)
726a989a 4082{
538dd0b7 4083 return (asm_stmt->subcode & GF_ASM_INPUT) != 0;
726a989a
RB
4084}
4085
4086
538dd0b7 4087/* Return the types handled by GIMPLE_CATCH statement CATCH_STMT. */
726a989a
RB
4088
4089static inline tree
538dd0b7 4090gimple_catch_types (const gcatch *catch_stmt)
726a989a 4091{
daa6e488 4092 return catch_stmt->types;
726a989a
RB
4093}
4094
4095
538dd0b7 4096/* Return a pointer to the types handled by GIMPLE_CATCH statement CATCH_STMT. */
726a989a
RB
4097
4098static inline tree *
538dd0b7 4099gimple_catch_types_ptr (gcatch *catch_stmt)
726a989a 4100{
daa6e488 4101 return &catch_stmt->types;
726a989a
RB
4102}
4103
4104
726a989a 4105/* Return a pointer to the GIMPLE sequence representing the body of
538dd0b7 4106 the handler of GIMPLE_CATCH statement CATCH_STMT. */
726a989a
RB
4107
4108static inline gimple_seq *
538dd0b7 4109gimple_catch_handler_ptr (gcatch *catch_stmt)
726a989a 4110{
daa6e488 4111 return &catch_stmt->handler;
726a989a
RB
4112}
4113
4114
355a7673 4115/* Return the GIMPLE sequence representing the body of the handler of
538dd0b7 4116 GIMPLE_CATCH statement CATCH_STMT. */
355a7673
MM
4117
4118static inline gimple_seq
0e7b6a51 4119gimple_catch_handler (const gcatch *catch_stmt)
355a7673 4120{
0e7b6a51 4121 return *gimple_catch_handler_ptr (const_cast <gcatch *> (catch_stmt));
355a7673
MM
4122}
4123
4124
538dd0b7 4125/* Set T to be the set of types handled by GIMPLE_CATCH CATCH_STMT. */
726a989a
RB
4126
4127static inline void
538dd0b7 4128gimple_catch_set_types (gcatch *catch_stmt, tree t)
726a989a 4129{
daa6e488 4130 catch_stmt->types = t;
726a989a
RB
4131}
4132
4133
538dd0b7 4134/* Set HANDLER to be the body of GIMPLE_CATCH CATCH_STMT. */
726a989a
RB
4135
4136static inline void
538dd0b7 4137gimple_catch_set_handler (gcatch *catch_stmt, gimple_seq handler)
726a989a 4138{
daa6e488 4139 catch_stmt->handler = handler;
726a989a
RB
4140}
4141
4142
4143/* Return the types handled by GIMPLE_EH_FILTER statement GS. */
4144
4145static inline tree
355fe088 4146gimple_eh_filter_types (const gimple *gs)
726a989a 4147{
538dd0b7 4148 const geh_filter *eh_filter_stmt = as_a <const geh_filter *> (gs);
daa6e488 4149 return eh_filter_stmt->types;
726a989a
RB
4150}
4151
4152
4153/* Return a pointer to the types handled by GIMPLE_EH_FILTER statement
4154 GS. */
4155
4156static inline tree *
355fe088 4157gimple_eh_filter_types_ptr (gimple *gs)
726a989a 4158{
538dd0b7 4159 geh_filter *eh_filter_stmt = as_a <geh_filter *> (gs);
daa6e488 4160 return &eh_filter_stmt->types;
726a989a
RB
4161}
4162
4163
355a7673
MM
4164/* Return a pointer to the sequence of statement to execute when
4165 GIMPLE_EH_FILTER statement fails. */
4166
4167static inline gimple_seq *
355fe088 4168gimple_eh_filter_failure_ptr (gimple *gs)
355a7673 4169{
538dd0b7 4170 geh_filter *eh_filter_stmt = as_a <geh_filter *> (gs);
daa6e488 4171 return &eh_filter_stmt->failure;
355a7673
MM
4172}
4173
4174
726a989a
RB
4175/* Return the sequence of statement to execute when GIMPLE_EH_FILTER
4176 statement fails. */
4177
4178static inline gimple_seq
0e7b6a51 4179gimple_eh_filter_failure (const gimple *gs)
726a989a 4180{
0e7b6a51 4181 return *gimple_eh_filter_failure_ptr (const_cast <gimple *> (gs));
726a989a
RB
4182}
4183
4184
538dd0b7
DM
4185/* Set TYPES to be the set of types handled by GIMPLE_EH_FILTER
4186 EH_FILTER_STMT. */
726a989a
RB
4187
4188static inline void
538dd0b7 4189gimple_eh_filter_set_types (geh_filter *eh_filter_stmt, tree types)
726a989a 4190{
daa6e488 4191 eh_filter_stmt->types = types;
726a989a
RB
4192}
4193
4194
4195/* Set FAILURE to be the sequence of statements to execute on failure
538dd0b7 4196 for GIMPLE_EH_FILTER EH_FILTER_STMT. */
726a989a
RB
4197
4198static inline void
538dd0b7
DM
4199gimple_eh_filter_set_failure (geh_filter *eh_filter_stmt,
4200 gimple_seq failure)
726a989a 4201{
daa6e488 4202 eh_filter_stmt->failure = failure;
726a989a
RB
4203}
4204
1d65f45c 4205/* Get the function decl to be called by the MUST_NOT_THROW region. */
726a989a 4206
1d65f45c 4207static inline tree
0e7b6a51 4208gimple_eh_must_not_throw_fndecl (const geh_mnt *eh_mnt_stmt)
726a989a 4209{
daa6e488 4210 return eh_mnt_stmt->fndecl;
726a989a
RB
4211}
4212
d7f09764
DN
4213/* Set the function decl to be called by GS to DECL. */
4214
4215static inline void
538dd0b7
DM
4216gimple_eh_must_not_throw_set_fndecl (geh_mnt *eh_mnt_stmt,
4217 tree decl)
d7f09764 4218{
daa6e488 4219 eh_mnt_stmt->fndecl = decl;
d7f09764
DN
4220}
4221
0a35513e
AH
4222/* GIMPLE_EH_ELSE accessors. */
4223
355a7673 4224static inline gimple_seq *
538dd0b7 4225gimple_eh_else_n_body_ptr (geh_else *eh_else_stmt)
355a7673 4226{
daa6e488 4227 return &eh_else_stmt->n_body;
355a7673
MM
4228}
4229
0a35513e 4230static inline gimple_seq
0e7b6a51 4231gimple_eh_else_n_body (const geh_else *eh_else_stmt)
355a7673 4232{
0e7b6a51 4233 return *gimple_eh_else_n_body_ptr (const_cast <geh_else *> (eh_else_stmt));
355a7673
MM
4234}
4235
4236static inline gimple_seq *
538dd0b7 4237gimple_eh_else_e_body_ptr (geh_else *eh_else_stmt)
0a35513e 4238{
daa6e488 4239 return &eh_else_stmt->e_body;
0a35513e
AH
4240}
4241
4242static inline gimple_seq
0e7b6a51 4243gimple_eh_else_e_body (const geh_else *eh_else_stmt)
0a35513e 4244{
0e7b6a51 4245 return *gimple_eh_else_e_body_ptr (const_cast <geh_else *> (eh_else_stmt));
0a35513e
AH
4246}
4247
4248static inline void
538dd0b7 4249gimple_eh_else_set_n_body (geh_else *eh_else_stmt, gimple_seq seq)
0a35513e 4250{
daa6e488 4251 eh_else_stmt->n_body = seq;
0a35513e
AH
4252}
4253
4254static inline void
538dd0b7 4255gimple_eh_else_set_e_body (geh_else *eh_else_stmt, gimple_seq seq)
0a35513e 4256{
daa6e488 4257 eh_else_stmt->e_body = seq;
0a35513e 4258}
d7f09764 4259
726a989a
RB
4260/* GIMPLE_TRY accessors. */
4261
4262/* Return the kind of try block represented by GIMPLE_TRY GS. This is
4263 either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY. */
4264
4265static inline enum gimple_try_flags
355fe088 4266gimple_try_kind (const gimple *gs)
726a989a
RB
4267{
4268 GIMPLE_CHECK (gs, GIMPLE_TRY);
daa6e488 4269 return (enum gimple_try_flags) (gs->subcode & GIMPLE_TRY_KIND);
726a989a
RB
4270}
4271
4272
4273/* Set the kind of try block represented by GIMPLE_TRY GS. */
4274
4275static inline void
538dd0b7 4276gimple_try_set_kind (gtry *gs, enum gimple_try_flags kind)
726a989a 4277{
2bc0a660
JH
4278 gcc_gimple_checking_assert (kind == GIMPLE_TRY_CATCH
4279 || kind == GIMPLE_TRY_FINALLY);
726a989a 4280 if (gimple_try_kind (gs) != kind)
daa6e488 4281 gs->subcode = (unsigned int) kind;
726a989a
RB
4282}
4283
4284
4285/* Return the GIMPLE_TRY_CATCH_IS_CLEANUP flag. */
4286
4287static inline bool
355fe088 4288gimple_try_catch_is_cleanup (const gimple *gs)
726a989a 4289{
2bc0a660 4290 gcc_gimple_checking_assert (gimple_try_kind (gs) == GIMPLE_TRY_CATCH);
daa6e488 4291 return (gs->subcode & GIMPLE_TRY_CATCH_IS_CLEANUP) != 0;
726a989a
RB
4292}
4293
4294
355a7673
MM
4295/* Return a pointer to the sequence of statements used as the
4296 body for GIMPLE_TRY GS. */
4297
4298static inline gimple_seq *
355fe088 4299gimple_try_eval_ptr (gimple *gs)
355a7673 4300{
538dd0b7 4301 gtry *try_stmt = as_a <gtry *> (gs);
daa6e488 4302 return &try_stmt->eval;
355a7673
MM
4303}
4304
4305
726a989a
RB
4306/* Return the sequence of statements used as the body for GIMPLE_TRY GS. */
4307
4308static inline gimple_seq
0e7b6a51 4309gimple_try_eval (const gimple *gs)
355a7673 4310{
0e7b6a51 4311 return *gimple_try_eval_ptr (const_cast <gimple *> (gs));
355a7673
MM
4312}
4313
4314
4315/* Return a pointer to the sequence of statements used as the cleanup body for
4316 GIMPLE_TRY GS. */
4317
4318static inline gimple_seq *
355fe088 4319gimple_try_cleanup_ptr (gimple *gs)
726a989a 4320{
538dd0b7 4321 gtry *try_stmt = as_a <gtry *> (gs);
daa6e488 4322 return &try_stmt->cleanup;
726a989a
RB
4323}
4324
4325
4326/* Return the sequence of statements used as the cleanup body for
4327 GIMPLE_TRY GS. */
4328
4329static inline gimple_seq
0e7b6a51 4330gimple_try_cleanup (const gimple *gs)
726a989a 4331{
0e7b6a51 4332 return *gimple_try_cleanup_ptr (const_cast <gimple *> (gs));
726a989a
RB
4333}
4334
4335
4336/* Set the GIMPLE_TRY_CATCH_IS_CLEANUP flag. */
4337
4338static inline void
538dd0b7 4339gimple_try_set_catch_is_cleanup (gtry *g, bool catch_is_cleanup)
726a989a 4340{
2bc0a660 4341 gcc_gimple_checking_assert (gimple_try_kind (g) == GIMPLE_TRY_CATCH);
726a989a 4342 if (catch_is_cleanup)
daa6e488 4343 g->subcode |= GIMPLE_TRY_CATCH_IS_CLEANUP;
726a989a 4344 else
daa6e488 4345 g->subcode &= ~GIMPLE_TRY_CATCH_IS_CLEANUP;
726a989a
RB
4346}
4347
4348
4349/* Set EVAL to be the sequence of statements to use as the body for
538dd0b7 4350 GIMPLE_TRY TRY_STMT. */
726a989a
RB
4351
4352static inline void
538dd0b7 4353gimple_try_set_eval (gtry *try_stmt, gimple_seq eval)
726a989a 4354{
daa6e488 4355 try_stmt->eval = eval;
726a989a
RB
4356}
4357
4358
4359/* Set CLEANUP to be the sequence of statements to use as the cleanup
538dd0b7 4360 body for GIMPLE_TRY TRY_STMT. */
726a989a
RB
4361
4362static inline void
538dd0b7 4363gimple_try_set_cleanup (gtry *try_stmt, gimple_seq cleanup)
726a989a 4364{
daa6e488 4365 try_stmt->cleanup = cleanup;
726a989a
RB
4366}
4367
4368
355a7673
MM
4369/* Return a pointer to the cleanup sequence for cleanup statement GS. */
4370
4371static inline gimple_seq *
355fe088 4372gimple_wce_cleanup_ptr (gimple *gs)
355a7673 4373{
7de90a6c 4374 gimple_statement_wce *wce_stmt = as_a <gimple_statement_wce *> (gs);
daa6e488 4375 return &wce_stmt->cleanup;
355a7673
MM
4376}
4377
4378
726a989a
RB
4379/* Return the cleanup sequence for cleanup statement GS. */
4380
4381static inline gimple_seq
355fe088 4382gimple_wce_cleanup (gimple *gs)
726a989a 4383{
355a7673 4384 return *gimple_wce_cleanup_ptr (gs);
726a989a
RB
4385}
4386
4387
4388/* Set CLEANUP to be the cleanup sequence for GS. */
4389
4390static inline void
355fe088 4391gimple_wce_set_cleanup (gimple *gs, gimple_seq cleanup)
726a989a 4392{
7de90a6c 4393 gimple_statement_wce *wce_stmt = as_a <gimple_statement_wce *> (gs);
daa6e488 4394 wce_stmt->cleanup = cleanup;
726a989a
RB
4395}
4396
4397
4398/* Return the CLEANUP_EH_ONLY flag for a WCE tuple. */
4399
4400static inline bool
355fe088 4401gimple_wce_cleanup_eh_only (const gimple *gs)
726a989a
RB
4402{
4403 GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
daa6e488 4404 return gs->subcode != 0;
726a989a
RB
4405}
4406
4407
4408/* Set the CLEANUP_EH_ONLY flag for a WCE tuple. */
4409
4410static inline void
355fe088 4411gimple_wce_set_cleanup_eh_only (gimple *gs, bool eh_only_p)
726a989a
RB
4412{
4413 GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
daa6e488 4414 gs->subcode = (unsigned int) eh_only_p;
726a989a
RB
4415}
4416
4417
4418/* Return the maximum number of arguments supported by GIMPLE_PHI GS. */
4419
4420static inline unsigned
355fe088 4421gimple_phi_capacity (const gimple *gs)
726a989a 4422{
538dd0b7 4423 const gphi *phi_stmt = as_a <const gphi *> (gs);
daa6e488 4424 return phi_stmt->capacity;
726a989a
RB
4425}
4426
4427
4428/* Return the number of arguments in GIMPLE_PHI GS. This must always
4429 be exactly the number of incoming edges for the basic block holding
4430 GS. */
4431
4432static inline unsigned
355fe088 4433gimple_phi_num_args (const gimple *gs)
726a989a 4434{
538dd0b7 4435 const gphi *phi_stmt = as_a <const gphi *> (gs);
daa6e488 4436 return phi_stmt->nargs;
726a989a
RB
4437}
4438
4439
4440/* Return the SSA name created by GIMPLE_PHI GS. */
4441
3fa4fad4
RB
4442static inline tree
4443gimple_phi_result (const gphi *gs)
4444{
4445 return gs->result;
4446}
4447
726a989a 4448static inline tree
355fe088 4449gimple_phi_result (const gimple *gs)
726a989a 4450{
538dd0b7 4451 const gphi *phi_stmt = as_a <const gphi *> (gs);
3fa4fad4 4452 return gimple_phi_result (phi_stmt);
726a989a
RB
4453}
4454
4455/* Return a pointer to the SSA name created by GIMPLE_PHI GS. */
4456
3fa4fad4
RB
4457static inline tree *
4458gimple_phi_result_ptr (gphi *gs)
4459{
4460 return &gs->result;
4461}
4462
726a989a 4463static inline tree *
355fe088 4464gimple_phi_result_ptr (gimple *gs)
726a989a 4465{
538dd0b7 4466 gphi *phi_stmt = as_a <gphi *> (gs);
3fa4fad4 4467 return gimple_phi_result_ptr (phi_stmt);
726a989a
RB
4468}
4469
538dd0b7 4470/* Set RESULT to be the SSA name created by GIMPLE_PHI PHI. */
726a989a
RB
4471
4472static inline void
538dd0b7 4473gimple_phi_set_result (gphi *phi, tree result)
726a989a 4474{
538dd0b7 4475 phi->result = result;
dcc748dd 4476 if (result && TREE_CODE (result) == SSA_NAME)
538dd0b7 4477 SSA_NAME_DEF_STMT (result) = phi;
726a989a
RB
4478}
4479
4480
4481/* Return the PHI argument corresponding to incoming edge INDEX for
4482 GIMPLE_PHI GS. */
4483
3fa4fad4
RB
4484static inline struct phi_arg_d *
4485gimple_phi_arg (gphi *gs, unsigned index)
4486{
4487 gcc_gimple_checking_assert (index < gs->nargs);
4488 return &(gs->args[index]);
4489}
4490
0e7b6a51
DM
4491static inline const phi_arg_d *
4492gimple_phi_arg (const gphi *gs, unsigned index)
4493{
4494 gcc_gimple_checking_assert (index < gs->nargs);
4495 return &(gs->args[index]);
4496}
4497
726a989a 4498static inline struct phi_arg_d *
355fe088 4499gimple_phi_arg (gimple *gs, unsigned index)
726a989a 4500{
538dd0b7 4501 gphi *phi_stmt = as_a <gphi *> (gs);
3fa4fad4 4502 return gimple_phi_arg (phi_stmt, index);
726a989a
RB
4503}
4504
4505/* Set PHIARG to be the argument corresponding to incoming edge INDEX
538dd0b7 4506 for GIMPLE_PHI PHI. */
726a989a
RB
4507
4508static inline void
538dd0b7 4509gimple_phi_set_arg (gphi *phi, unsigned index, struct phi_arg_d * phiarg)
726a989a 4510{
8f860bca 4511 gcc_gimple_checking_assert (index < phi->nargs);
538dd0b7 4512 phi->args[index] = *phiarg;
726a989a
RB
4513}
4514
80560f95
AM
4515/* Return the PHI nodes for basic block BB, or NULL if there are no
4516 PHI nodes. */
4517
4518static inline gimple_seq
4519phi_nodes (const_basic_block bb)
4520{
4521 gcc_checking_assert (!(bb->flags & BB_RTL));
4522 return bb->il.gimple.phi_nodes;
4523}
4524
4525/* Return a pointer to the PHI nodes for basic block BB. */
4526
4527static inline gimple_seq *
4528phi_nodes_ptr (basic_block bb)
4529{
4530 gcc_checking_assert (!(bb->flags & BB_RTL));
4531 return &bb->il.gimple.phi_nodes;
4532}
4533
4534/* Return the tree operand for argument I of PHI node GS. */
4535
3fa4fad4 4536static inline tree
0e7b6a51 4537gimple_phi_arg_def (const gphi *gs, size_t index)
3fa4fad4
RB
4538{
4539 return gimple_phi_arg (gs, index)->def;
4540}
4541
80560f95 4542static inline tree
355fe088 4543gimple_phi_arg_def (gimple *gs, size_t index)
80560f95
AM
4544{
4545 return gimple_phi_arg (gs, index)->def;
4546}
4547
4548
538dd0b7 4549/* Return a pointer to the tree operand for argument I of phi node PHI. */
80560f95
AM
4550
4551static inline tree *
538dd0b7 4552gimple_phi_arg_def_ptr (gphi *phi, size_t index)
80560f95 4553{
538dd0b7 4554 return &gimple_phi_arg (phi, index)->def;
80560f95
AM
4555}
4556
538dd0b7 4557/* Return the edge associated with argument I of phi node PHI. */
80560f95
AM
4558
4559static inline edge
0e7b6a51 4560gimple_phi_arg_edge (const gphi *phi, size_t i)
80560f95 4561{
538dd0b7 4562 return EDGE_PRED (gimple_bb (phi), i);
80560f95
AM
4563}
4564
538dd0b7 4565/* Return the source location of gimple argument I of phi node PHI. */
80560f95 4566
620e594b 4567static inline location_t
0e7b6a51 4568gimple_phi_arg_location (const gphi *phi, size_t i)
80560f95 4569{
538dd0b7 4570 return gimple_phi_arg (phi, i)->locus;
80560f95
AM
4571}
4572
538dd0b7 4573/* Return the source location of the argument on edge E of phi node PHI. */
80560f95 4574
620e594b 4575static inline location_t
538dd0b7 4576gimple_phi_arg_location_from_edge (gphi *phi, edge e)
80560f95 4577{
538dd0b7 4578 return gimple_phi_arg (phi, e->dest_idx)->locus;
80560f95
AM
4579}
4580
538dd0b7 4581/* Set the source location of gimple argument I of phi node PHI to LOC. */
80560f95
AM
4582
4583static inline void
620e594b 4584gimple_phi_arg_set_location (gphi *phi, size_t i, location_t loc)
80560f95 4585{
538dd0b7 4586 gimple_phi_arg (phi, i)->locus = loc;
80560f95
AM
4587}
4588
538dd0b7 4589/* Return TRUE if argument I of phi node PHI has a location record. */
80560f95
AM
4590
4591static inline bool
0e7b6a51 4592gimple_phi_arg_has_location (const gphi *phi, size_t i)
80560f95 4593{
538dd0b7 4594 return gimple_phi_arg_location (phi, i) != UNKNOWN_LOCATION;
80560f95
AM
4595}
4596
4597
538dd0b7 4598/* Return the region number for GIMPLE_RESX RESX_STMT. */
726a989a
RB
4599
4600static inline int
538dd0b7 4601gimple_resx_region (const gresx *resx_stmt)
726a989a 4602{
9b95612e 4603 return resx_stmt->region;
726a989a
RB
4604}
4605
538dd0b7 4606/* Set REGION to be the region number for GIMPLE_RESX RESX_STMT. */
726a989a
RB
4607
4608static inline void
538dd0b7 4609gimple_resx_set_region (gresx *resx_stmt, int region)
726a989a 4610{
9b95612e 4611 resx_stmt->region = region;
726a989a
RB
4612}
4613
538dd0b7 4614/* Return the region number for GIMPLE_EH_DISPATCH EH_DISPATCH_STMT. */
1d65f45c
RH
4615
4616static inline int
538dd0b7 4617gimple_eh_dispatch_region (const geh_dispatch *eh_dispatch_stmt)
1d65f45c 4618{
9b95612e 4619 return eh_dispatch_stmt->region;
1d65f45c
RH
4620}
4621
538dd0b7
DM
4622/* Set REGION to be the region number for GIMPLE_EH_DISPATCH
4623 EH_DISPATCH_STMT. */
1d65f45c
RH
4624
4625static inline void
538dd0b7 4626gimple_eh_dispatch_set_region (geh_dispatch *eh_dispatch_stmt, int region)
1d65f45c 4627{
9b95612e 4628 eh_dispatch_stmt->region = region;
1d65f45c 4629}
726a989a
RB
4630
4631/* Return the number of labels associated with the switch statement GS. */
4632
4633static inline unsigned
538dd0b7 4634gimple_switch_num_labels (const gswitch *gs)
726a989a
RB
4635{
4636 unsigned num_ops;
4637 GIMPLE_CHECK (gs, GIMPLE_SWITCH);
4638 num_ops = gimple_num_ops (gs);
2bc0a660 4639 gcc_gimple_checking_assert (num_ops > 1);
726a989a
RB
4640 return num_ops - 1;
4641}
4642
4643
4644/* Set NLABELS to be the number of labels for the switch statement GS. */
4645
4646static inline void
538dd0b7 4647gimple_switch_set_num_labels (gswitch *g, unsigned nlabels)
726a989a
RB
4648{
4649 GIMPLE_CHECK (g, GIMPLE_SWITCH);
4650 gimple_set_num_ops (g, nlabels + 1);
4651}
4652
4653
4654/* Return the index variable used by the switch statement GS. */
4655
4656static inline tree
538dd0b7 4657gimple_switch_index (const gswitch *gs)
726a989a 4658{
a3fe41f5 4659 return gs->op[0];
726a989a
RB
4660}
4661
4662
4663/* Return a pointer to the index variable for the switch statement GS. */
4664
4665static inline tree *
1d10676d 4666gimple_switch_index_ptr (gswitch *gs)
726a989a 4667{
1d10676d 4668 return &gs->op[0];
726a989a
RB
4669}
4670
4671
4672/* Set INDEX to be the index variable for switch statement GS. */
4673
4674static inline void
538dd0b7 4675gimple_switch_set_index (gswitch *gs, tree index)
726a989a 4676{
2bc0a660 4677 gcc_gimple_checking_assert (SSA_VAR_P (index) || CONSTANT_CLASS_P (index));
a3fe41f5 4678 gs->op[0] = index;
726a989a
RB
4679}
4680
4681
4682/* Return the label numbered INDEX. The default label is 0, followed by any
4683 labels in a switch statement. */
4684
4685static inline tree
538dd0b7 4686gimple_switch_label (const gswitch *gs, unsigned index)
726a989a 4687{
2bc0a660 4688 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 1);
a3fe41f5 4689 return gs->op[index + 1];
726a989a
RB
4690}
4691
4692/* Set the label number INDEX to LABEL. 0 is always the default label. */
4693
4694static inline void
538dd0b7 4695gimple_switch_set_label (gswitch *gs, unsigned index, tree label)
726a989a 4696{
2bc0a660
JH
4697 gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 1
4698 && (label == NULL_TREE
4699 || TREE_CODE (label) == CASE_LABEL_EXPR));
a3fe41f5 4700 gs->op[index + 1] = label;
726a989a
RB
4701}
4702
4703/* Return the default label for a switch statement. */
4704
4705static inline tree
538dd0b7 4706gimple_switch_default_label (const gswitch *gs)
726a989a 4707{
fd8d363e
SB
4708 tree label = gimple_switch_label (gs, 0);
4709 gcc_checking_assert (!CASE_LOW (label) && !CASE_HIGH (label));
4710 return label;
726a989a
RB
4711}
4712
4713/* Set the default label for a switch statement. */
4714
4715static inline void
538dd0b7 4716gimple_switch_set_default_label (gswitch *gs, tree label)
726a989a 4717{
fd8d363e 4718 gcc_checking_assert (!CASE_LOW (label) && !CASE_HIGH (label));
726a989a
RB
4719 gimple_switch_set_label (gs, 0, label);
4720}
4721
b5b8b0ac
AO
4722/* Return true if GS is a GIMPLE_DEBUG statement. */
4723
4724static inline bool
355fe088 4725is_gimple_debug (const gimple *gs)
b5b8b0ac
AO
4726{
4727 return gimple_code (gs) == GIMPLE_DEBUG;
4728}
4729
65f4b875 4730
10ea09ee
JJ
4731/* Return the first nondebug statement in GIMPLE sequence S. */
4732
4733static inline gimple *
4734gimple_seq_first_nondebug_stmt (gimple_seq s)
4735{
4736 gimple_seq_node n = gimple_seq_first (s);
4737 while (n && is_gimple_debug (n))
4738 n = n->next;
4739 return n;
4740}
4741
4742
65f4b875
AO
4743/* Return the last nondebug statement in GIMPLE sequence S. */
4744
4745static inline gimple *
4746gimple_seq_last_nondebug_stmt (gimple_seq s)
4747{
4748 gimple_seq_node n;
4749 for (n = gimple_seq_last (s);
4750 n && is_gimple_debug (n);
4751 n = n->prev)
10ea09ee 4752 if (n == s)
65f4b875
AO
4753 return NULL;
4754 return n;
4755}
4756
4757
b5b8b0ac
AO
4758/* Return true if S is a GIMPLE_DEBUG BIND statement. */
4759
4760static inline bool
355fe088 4761gimple_debug_bind_p (const gimple *s)
b5b8b0ac
AO
4762{
4763 if (is_gimple_debug (s))
daa6e488 4764 return s->subcode == GIMPLE_DEBUG_BIND;
b5b8b0ac
AO
4765
4766 return false;
4767}
4768
4769/* Return the variable bound in a GIMPLE_DEBUG bind statement. */
4770
4771static inline tree
0e7b6a51 4772gimple_debug_bind_get_var (const gimple *dbg)
b5b8b0ac
AO
4773{
4774 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4775 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4776 return gimple_op (dbg, 0);
4777}
4778
4779/* Return the value bound to the variable in a GIMPLE_DEBUG bind
4780 statement. */
4781
4782static inline tree
0e7b6a51 4783gimple_debug_bind_get_value (const gimple *dbg)
b5b8b0ac
AO
4784{
4785 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4786 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4787 return gimple_op (dbg, 1);
4788}
4789
4790/* Return a pointer to the value bound to the variable in a
4791 GIMPLE_DEBUG bind statement. */
4792
4793static inline tree *
355fe088 4794gimple_debug_bind_get_value_ptr (gimple *dbg)
b5b8b0ac
AO
4795{
4796 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4797 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4798 return gimple_op_ptr (dbg, 1);
4799}
4800
4801/* Set the variable bound in a GIMPLE_DEBUG bind statement. */
4802
4803static inline void
355fe088 4804gimple_debug_bind_set_var (gimple *dbg, tree var)
b5b8b0ac
AO
4805{
4806 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4807 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4808 gimple_set_op (dbg, 0, var);
4809}
4810
4811/* Set the value bound to the variable in a GIMPLE_DEBUG bind
4812 statement. */
4813
4814static inline void
355fe088 4815gimple_debug_bind_set_value (gimple *dbg, tree value)
b5b8b0ac
AO
4816{
4817 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4818 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4819 gimple_set_op (dbg, 1, value);
4820}
4821
4822/* The second operand of a GIMPLE_DEBUG_BIND, when the value was
4823 optimized away. */
4824#define GIMPLE_DEBUG_BIND_NOVALUE NULL_TREE /* error_mark_node */
4825
4826/* Remove the value bound to the variable in a GIMPLE_DEBUG bind
4827 statement. */
4828
4829static inline void
355fe088 4830gimple_debug_bind_reset_value (gimple *dbg)
b5b8b0ac
AO
4831{
4832 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4833 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4834 gimple_set_op (dbg, 1, GIMPLE_DEBUG_BIND_NOVALUE);
4835}
4836
4837/* Return true if the GIMPLE_DEBUG bind statement is bound to a
4838 value. */
4839
4840static inline bool
355fe088 4841gimple_debug_bind_has_value_p (gimple *dbg)
b5b8b0ac
AO
4842{
4843 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
2bc0a660 4844 gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
b5b8b0ac
AO
4845 return gimple_op (dbg, 1) != GIMPLE_DEBUG_BIND_NOVALUE;
4846}
4847
4848#undef GIMPLE_DEBUG_BIND_NOVALUE
726a989a 4849
ddb555ed
JJ
4850/* Return true if S is a GIMPLE_DEBUG SOURCE BIND statement. */
4851
4852static inline bool
355fe088 4853gimple_debug_source_bind_p (const gimple *s)
ddb555ed
JJ
4854{
4855 if (is_gimple_debug (s))
daa6e488 4856 return s->subcode == GIMPLE_DEBUG_SOURCE_BIND;
ddb555ed
JJ
4857
4858 return false;
4859}
4860
4861/* Return the variable bound in a GIMPLE_DEBUG source bind statement. */
4862
4863static inline tree
0e7b6a51 4864gimple_debug_source_bind_get_var (const gimple *dbg)
ddb555ed
JJ
4865{
4866 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4867 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4868 return gimple_op (dbg, 0);
4869}
4870
4871/* Return the value bound to the variable in a GIMPLE_DEBUG source bind
4872 statement. */
4873
4874static inline tree
0e7b6a51 4875gimple_debug_source_bind_get_value (const gimple *dbg)
ddb555ed
JJ
4876{
4877 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4878 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4879 return gimple_op (dbg, 1);
4880}
4881
4882/* Return a pointer to the value bound to the variable in a
4883 GIMPLE_DEBUG source bind statement. */
4884
4885static inline tree *
355fe088 4886gimple_debug_source_bind_get_value_ptr (gimple *dbg)
ddb555ed
JJ
4887{
4888 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4889 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4890 return gimple_op_ptr (dbg, 1);
4891}
4892
4893/* Set the variable bound in a GIMPLE_DEBUG source bind statement. */
4894
4895static inline void
355fe088 4896gimple_debug_source_bind_set_var (gimple *dbg, tree var)
ddb555ed
JJ
4897{
4898 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4899 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4900 gimple_set_op (dbg, 0, var);
4901}
4902
4903/* Set the value bound to the variable in a GIMPLE_DEBUG source bind
4904 statement. */
4905
4906static inline void
355fe088 4907gimple_debug_source_bind_set_value (gimple *dbg, tree value)
ddb555ed
JJ
4908{
4909 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
4910 gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
4911 gimple_set_op (dbg, 1, value);
4912}
4913
36f52e8f
AO
4914/* Return true if S is a GIMPLE_DEBUG BEGIN_STMT statement. */
4915
4916static inline bool
4917gimple_debug_begin_stmt_p (const gimple *s)
4918{
4919 if (is_gimple_debug (s))
4920 return s->subcode == GIMPLE_DEBUG_BEGIN_STMT;
4921
4922 return false;
4923}
4924
58006663
AO
4925/* Return true if S is a GIMPLE_DEBUG INLINE_ENTRY statement. */
4926
4927static inline bool
4928gimple_debug_inline_entry_p (const gimple *s)
4929{
4930 if (is_gimple_debug (s))
4931 return s->subcode == GIMPLE_DEBUG_INLINE_ENTRY;
4932
4933 return false;
4934}
4935
36f52e8f
AO
4936/* Return true if S is a GIMPLE_DEBUG non-binding marker statement. */
4937
4938static inline bool
4939gimple_debug_nonbind_marker_p (const gimple *s)
4940{
4941 if (is_gimple_debug (s))
58006663
AO
4942 return s->subcode == GIMPLE_DEBUG_BEGIN_STMT
4943 || s->subcode == GIMPLE_DEBUG_INLINE_ENTRY;
36f52e8f
AO
4944
4945 return false;
4946}
4947
cc524fc7
AM
4948/* Return the line number for EXPR, or return -1 if we have no line
4949 number information for it. */
4950static inline int
355fe088 4951get_lineno (const gimple *stmt)
cc524fc7
AM
4952{
4953 location_t loc;
4954
4955 if (!stmt)
4956 return -1;
4957
4958 loc = gimple_location (stmt);
4959 if (loc == UNKNOWN_LOCATION)
4960 return -1;
4961
4962 return LOCATION_LINE (loc);
4963}
4964
355a7673
MM
4965/* Return a pointer to the body for the OMP statement GS. */
4966
4967static inline gimple_seq *
355fe088 4968gimple_omp_body_ptr (gimple *gs)
355a7673 4969{
daa6e488 4970 return &static_cast <gimple_statement_omp *> (gs)->body;
355a7673
MM
4971}
4972
726a989a
RB
4973/* Return the body for the OMP statement GS. */
4974
b8698a0f 4975static inline gimple_seq
0e7b6a51 4976gimple_omp_body (const gimple *gs)
726a989a 4977{
0e7b6a51 4978 return *gimple_omp_body_ptr (const_cast <gimple *> (gs));
726a989a
RB
4979}
4980
4981/* Set BODY to be the body for the OMP statement GS. */
4982
4983static inline void
355fe088 4984gimple_omp_set_body (gimple *gs, gimple_seq body)
726a989a 4985{
daa6e488 4986 static_cast <gimple_statement_omp *> (gs)->body = body;
726a989a
RB
4987}
4988
4989
538dd0b7 4990/* Return the name associated with OMP_CRITICAL statement CRIT_STMT. */
726a989a
RB
4991
4992static inline tree
538dd0b7 4993gimple_omp_critical_name (const gomp_critical *crit_stmt)
726a989a 4994{
538dd0b7 4995 return crit_stmt->name;
726a989a
RB
4996}
4997
4998
d9a6bd32
JJ
4999/* Return a pointer to the name associated with OMP critical statement
5000 CRIT_STMT. */
726a989a
RB
5001
5002static inline tree *
538dd0b7 5003gimple_omp_critical_name_ptr (gomp_critical *crit_stmt)
726a989a 5004{
538dd0b7 5005 return &crit_stmt->name;
726a989a
RB
5006}
5007
5008
d9a6bd32
JJ
5009/* Set NAME to be the name associated with OMP critical statement
5010 CRIT_STMT. */
726a989a
RB
5011
5012static inline void
538dd0b7 5013gimple_omp_critical_set_name (gomp_critical *crit_stmt, tree name)
726a989a 5014{
538dd0b7 5015 crit_stmt->name = name;
726a989a
RB
5016}
5017
5018
d9a6bd32
JJ
5019/* Return the clauses associated with OMP_CRITICAL statement CRIT_STMT. */
5020
5021static inline tree
5022gimple_omp_critical_clauses (const gomp_critical *crit_stmt)
5023{
5024 return crit_stmt->clauses;
5025}
5026
5027
5028/* Return a pointer to the clauses associated with OMP critical statement
5029 CRIT_STMT. */
5030
5031static inline tree *
5032gimple_omp_critical_clauses_ptr (gomp_critical *crit_stmt)
5033{
5034 return &crit_stmt->clauses;
5035}
5036
5037
5038/* Set CLAUSES to be the clauses associated with OMP critical statement
5039 CRIT_STMT. */
5040
5041static inline void
5042gimple_omp_critical_set_clauses (gomp_critical *crit_stmt, tree clauses)
5043{
5044 crit_stmt->clauses = clauses;
5045}
5046
5047
5048/* Return the clauses associated with OMP_ORDERED statement ORD_STMT. */
5049
5050static inline tree
5051gimple_omp_ordered_clauses (const gomp_ordered *ord_stmt)
5052{
5053 return ord_stmt->clauses;
5054}
5055
5056
5057/* Return a pointer to the clauses associated with OMP ordered statement
5058 ORD_STMT. */
5059
5060static inline tree *
5061gimple_omp_ordered_clauses_ptr (gomp_ordered *ord_stmt)
5062{
5063 return &ord_stmt->clauses;
5064}
5065
5066
5067/* Set CLAUSES to be the clauses associated with OMP ordered statement
5068 ORD_STMT. */
5069
5070static inline void
5071gimple_omp_ordered_set_clauses (gomp_ordered *ord_stmt, tree clauses)
5072{
5073 ord_stmt->clauses = clauses;
5074}
5075
5076
bf38f7e9
JJ
5077/* Return the clauses associated with OMP_SCAN statement SCAN_STMT. */
5078
5079static inline tree
5080gimple_omp_scan_clauses (const gomp_scan *scan_stmt)
5081{
5082 return scan_stmt->clauses;
5083}
5084
5085
5086/* Return a pointer to the clauses associated with OMP scan statement
5087 ORD_STMT. */
5088
5089static inline tree *
5090gimple_omp_scan_clauses_ptr (gomp_scan *scan_stmt)
5091{
5092 return &scan_stmt->clauses;
5093}
5094
5095
5096/* Set CLAUSES to be the clauses associated with OMP scan statement
5097 ORD_STMT. */
5098
5099static inline void
5100gimple_omp_scan_set_clauses (gomp_scan *scan_stmt, tree clauses)
5101{
5102 scan_stmt->clauses = clauses;
5103}
5104
5105
28567c40
JJ
5106/* Return the clauses associated with OMP_TASKGROUP statement GS. */
5107
5108static inline tree
5109gimple_omp_taskgroup_clauses (const gimple *gs)
5110{
5111 GIMPLE_CHECK (gs, GIMPLE_OMP_TASKGROUP);
5112 return
5113 static_cast <const gimple_statement_omp_single_layout *> (gs)->clauses;
5114}
5115
5116
5117/* Return a pointer to the clauses associated with OMP taskgroup statement
5118 GS. */
5119
5120static inline tree *
5121gimple_omp_taskgroup_clauses_ptr (gimple *gs)
5122{
5123 GIMPLE_CHECK (gs, GIMPLE_OMP_TASKGROUP);
5124 return &static_cast <gimple_statement_omp_single_layout *> (gs)->clauses;
5125}
5126
5127
5128/* Set CLAUSES to be the clauses associated with OMP taskgroup statement
5129 GS. */
5130
5131static inline void
5132gimple_omp_taskgroup_set_clauses (gimple *gs, tree clauses)
5133{
5134 GIMPLE_CHECK (gs, GIMPLE_OMP_TASKGROUP);
5135 static_cast <gimple_statement_omp_single_layout *> (gs)->clauses
5136 = clauses;
5137}
5138
5139
41dbbb37 5140/* Return the kind of the OMP_FOR statemement G. */
74bf76ed
JJ
5141
5142static inline int
355fe088 5143gimple_omp_for_kind (const gimple *g)
74bf76ed
JJ
5144{
5145 GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
5146 return (gimple_omp_subcode (g) & GF_OMP_FOR_KIND_MASK);
5147}
5148
5149
41dbbb37 5150/* Set the kind of the OMP_FOR statement G. */
74bf76ed
JJ
5151
5152static inline void
538dd0b7 5153gimple_omp_for_set_kind (gomp_for *g, int kind)
74bf76ed 5154{
daa6e488 5155 g->subcode = (g->subcode & ~GF_OMP_FOR_KIND_MASK)
74bf76ed
JJ
5156 | (kind & GF_OMP_FOR_KIND_MASK);
5157}
5158
5159
41dbbb37 5160/* Return true if OMP_FOR statement G has the
acf0174b
JJ
5161 GF_OMP_FOR_COMBINED flag set. */
5162
5163static inline bool
355fe088 5164gimple_omp_for_combined_p (const gimple *g)
acf0174b
JJ
5165{
5166 GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
5167 return (gimple_omp_subcode (g) & GF_OMP_FOR_COMBINED) != 0;
5168}
5169
5170
41dbbb37
TS
5171/* Set the GF_OMP_FOR_COMBINED field in the OMP_FOR statement G depending on
5172 the boolean value of COMBINED_P. */
acf0174b
JJ
5173
5174static inline void
538dd0b7 5175gimple_omp_for_set_combined_p (gomp_for *g, bool combined_p)
acf0174b 5176{
acf0174b 5177 if (combined_p)
daa6e488 5178 g->subcode |= GF_OMP_FOR_COMBINED;
acf0174b 5179 else
daa6e488 5180 g->subcode &= ~GF_OMP_FOR_COMBINED;
acf0174b
JJ
5181}
5182
5183
41dbbb37 5184/* Return true if the OMP_FOR statement G has the
acf0174b
JJ
5185 GF_OMP_FOR_COMBINED_INTO flag set. */
5186
5187static inline bool
355fe088 5188gimple_omp_for_combined_into_p (const gimple *g)
acf0174b
JJ
5189{
5190 GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
5191 return (gimple_omp_subcode (g) & GF_OMP_FOR_COMBINED_INTO) != 0;
5192}
5193
5194
41dbbb37
TS
5195/* Set the GF_OMP_FOR_COMBINED_INTO field in the OMP_FOR statement G depending
5196 on the boolean value of COMBINED_P. */
acf0174b
JJ
5197
5198static inline void
538dd0b7 5199gimple_omp_for_set_combined_into_p (gomp_for *g, bool combined_p)
acf0174b 5200{
acf0174b 5201 if (combined_p)
daa6e488 5202 g->subcode |= GF_OMP_FOR_COMBINED_INTO;
acf0174b 5203 else
daa6e488 5204 g->subcode &= ~GF_OMP_FOR_COMBINED_INTO;
acf0174b
JJ
5205}
5206
5207
41dbbb37 5208/* Return the clauses associated with the OMP_FOR statement GS. */
726a989a
RB
5209
5210static inline tree
355fe088 5211gimple_omp_for_clauses (const gimple *gs)
726a989a 5212{
538dd0b7 5213 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488 5214 return omp_for_stmt->clauses;
726a989a
RB
5215}
5216
5217
41dbbb37
TS
5218/* Return a pointer to the clauses associated with the OMP_FOR statement
5219 GS. */
726a989a
RB
5220
5221static inline tree *
355fe088 5222gimple_omp_for_clauses_ptr (gimple *gs)
726a989a 5223{
538dd0b7 5224 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488 5225 return &omp_for_stmt->clauses;
726a989a
RB
5226}
5227
5228
41dbbb37
TS
5229/* Set CLAUSES to be the list of clauses associated with the OMP_FOR statement
5230 GS. */
726a989a
RB
5231
5232static inline void
355fe088 5233gimple_omp_for_set_clauses (gimple *gs, tree clauses)
726a989a 5234{
538dd0b7 5235 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488 5236 omp_for_stmt->clauses = clauses;
726a989a
RB
5237}
5238
5239
41dbbb37 5240/* Get the collapse count of the OMP_FOR statement GS. */
726a989a
RB
5241
5242static inline size_t
0e7b6a51 5243gimple_omp_for_collapse (const gimple *gs)
726a989a 5244{
0e7b6a51 5245 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488 5246 return omp_for_stmt->collapse;
726a989a
RB
5247}
5248
5249
41dbbb37
TS
5250/* Return the condition code associated with the OMP_FOR statement GS. */
5251
5252static inline enum tree_code
355fe088 5253gimple_omp_for_cond (const gimple *gs, size_t i)
41dbbb37
TS
5254{
5255 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
5256 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5257 return omp_for_stmt->iter[i].cond;
5258}
5259
5260
5261/* Set COND to be the condition code for the OMP_FOR statement GS. */
5262
5263static inline void
355fe088 5264gimple_omp_for_set_cond (gimple *gs, size_t i, enum tree_code cond)
41dbbb37
TS
5265{
5266 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
5267 gcc_gimple_checking_assert (TREE_CODE_CLASS (cond) == tcc_comparison
5268 && i < omp_for_stmt->collapse);
5269 omp_for_stmt->iter[i].cond = cond;
5270}
5271
5272
5273/* Return the index variable for the OMP_FOR statement GS. */
726a989a
RB
5274
5275static inline tree
355fe088 5276gimple_omp_for_index (const gimple *gs, size_t i)
726a989a 5277{
538dd0b7 5278 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488
DM
5279 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5280 return omp_for_stmt->iter[i].index;
726a989a
RB
5281}
5282
5283
41dbbb37 5284/* Return a pointer to the index variable for the OMP_FOR statement GS. */
726a989a
RB
5285
5286static inline tree *
355fe088 5287gimple_omp_for_index_ptr (gimple *gs, size_t i)
726a989a 5288{
538dd0b7 5289 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5290 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5291 return &omp_for_stmt->iter[i].index;
726a989a
RB
5292}
5293
5294
41dbbb37 5295/* Set INDEX to be the index variable for the OMP_FOR statement GS. */
726a989a
RB
5296
5297static inline void
355fe088 5298gimple_omp_for_set_index (gimple *gs, size_t i, tree index)
726a989a 5299{
538dd0b7 5300 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5301 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5302 omp_for_stmt->iter[i].index = index;
726a989a
RB
5303}
5304
5305
41dbbb37 5306/* Return the initial value for the OMP_FOR statement GS. */
726a989a
RB
5307
5308static inline tree
355fe088 5309gimple_omp_for_initial (const gimple *gs, size_t i)
726a989a 5310{
538dd0b7 5311 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488
DM
5312 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5313 return omp_for_stmt->iter[i].initial;
726a989a
RB
5314}
5315
5316
41dbbb37 5317/* Return a pointer to the initial value for the OMP_FOR statement GS. */
726a989a
RB
5318
5319static inline tree *
355fe088 5320gimple_omp_for_initial_ptr (gimple *gs, size_t i)
726a989a 5321{
538dd0b7 5322 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5323 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5324 return &omp_for_stmt->iter[i].initial;
726a989a
RB
5325}
5326
5327
41dbbb37 5328/* Set INITIAL to be the initial value for the OMP_FOR statement GS. */
726a989a
RB
5329
5330static inline void
355fe088 5331gimple_omp_for_set_initial (gimple *gs, size_t i, tree initial)
726a989a 5332{
538dd0b7 5333 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5334 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5335 omp_for_stmt->iter[i].initial = initial;
726a989a
RB
5336}
5337
5338
41dbbb37 5339/* Return the final value for the OMP_FOR statement GS. */
726a989a
RB
5340
5341static inline tree
355fe088 5342gimple_omp_for_final (const gimple *gs, size_t i)
726a989a 5343{
538dd0b7 5344 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488
DM
5345 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5346 return omp_for_stmt->iter[i].final;
726a989a
RB
5347}
5348
5349
41dbbb37 5350/* Return a pointer to the final value for the OMP_FOR statement GS. */
726a989a
RB
5351
5352static inline tree *
355fe088 5353gimple_omp_for_final_ptr (gimple *gs, size_t i)
726a989a 5354{
538dd0b7 5355 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5356 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5357 return &omp_for_stmt->iter[i].final;
726a989a
RB
5358}
5359
5360
41dbbb37 5361/* Set FINAL to be the final value for the OMP_FOR statement GS. */
726a989a
RB
5362
5363static inline void
355fe088 5364gimple_omp_for_set_final (gimple *gs, size_t i, tree final)
726a989a 5365{
538dd0b7 5366 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5367 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5368 omp_for_stmt->iter[i].final = final;
726a989a
RB
5369}
5370
5371
41dbbb37 5372/* Return the increment value for the OMP_FOR statement GS. */
726a989a
RB
5373
5374static inline tree
355fe088 5375gimple_omp_for_incr (const gimple *gs, size_t i)
726a989a 5376{
538dd0b7 5377 const gomp_for *omp_for_stmt = as_a <const gomp_for *> (gs);
daa6e488
DM
5378 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5379 return omp_for_stmt->iter[i].incr;
726a989a
RB
5380}
5381
5382
41dbbb37 5383/* Return a pointer to the increment value for the OMP_FOR statement GS. */
726a989a
RB
5384
5385static inline tree *
355fe088 5386gimple_omp_for_incr_ptr (gimple *gs, size_t i)
726a989a 5387{
538dd0b7 5388 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5389 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5390 return &omp_for_stmt->iter[i].incr;
726a989a
RB
5391}
5392
5393
41dbbb37 5394/* Set INCR to be the increment value for the OMP_FOR statement GS. */
726a989a
RB
5395
5396static inline void
355fe088 5397gimple_omp_for_set_incr (gimple *gs, size_t i, tree incr)
726a989a 5398{
538dd0b7 5399 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488
DM
5400 gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
5401 omp_for_stmt->iter[i].incr = incr;
726a989a
RB
5402}
5403
5404
355a7673
MM
5405/* Return a pointer to the sequence of statements to execute before the OMP_FOR
5406 statement GS starts. */
5407
5408static inline gimple_seq *
355fe088 5409gimple_omp_for_pre_body_ptr (gimple *gs)
355a7673 5410{
538dd0b7 5411 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488 5412 return &omp_for_stmt->pre_body;
355a7673
MM
5413}
5414
5415
726a989a
RB
5416/* Return the sequence of statements to execute before the OMP_FOR
5417 statement GS starts. */
5418
5419static inline gimple_seq
0e7b6a51 5420gimple_omp_for_pre_body (const gimple *gs)
726a989a 5421{
0e7b6a51 5422 return *gimple_omp_for_pre_body_ptr (const_cast <gimple *> (gs));
726a989a
RB
5423}
5424
5425
5426/* Set PRE_BODY to be the sequence of statements to execute before the
5427 OMP_FOR statement GS starts. */
5428
5429static inline void
355fe088 5430gimple_omp_for_set_pre_body (gimple *gs, gimple_seq pre_body)
726a989a 5431{
538dd0b7 5432 gomp_for *omp_for_stmt = as_a <gomp_for *> (gs);
daa6e488 5433 omp_for_stmt->pre_body = pre_body;
726a989a
RB
5434}
5435
b2b40051
MJ
5436/* Return the kernel_phony of OMP_FOR statement. */
5437
5438static inline bool
5439gimple_omp_for_grid_phony (const gomp_for *omp_for)
5440{
56b1c60e
MJ
5441 gcc_checking_assert (gimple_omp_for_kind (omp_for)
5442 != GF_OMP_FOR_KIND_GRID_LOOP);
b2b40051
MJ
5443 return (gimple_omp_subcode (omp_for) & GF_OMP_FOR_GRID_PHONY) != 0;
5444}
5445
5446/* Set kernel_phony flag of OMP_FOR to VALUE. */
5447
5448static inline void
5449gimple_omp_for_set_grid_phony (gomp_for *omp_for, bool value)
5450{
56b1c60e
MJ
5451 gcc_checking_assert (gimple_omp_for_kind (omp_for)
5452 != GF_OMP_FOR_KIND_GRID_LOOP);
b2b40051
MJ
5453 if (value)
5454 omp_for->subcode |= GF_OMP_FOR_GRID_PHONY;
5455 else
5456 omp_for->subcode &= ~GF_OMP_FOR_GRID_PHONY;
5457}
726a989a 5458
56b1c60e
MJ
5459/* Return the kernel_intra_group of a GRID_LOOP OMP_FOR statement. */
5460
5461static inline bool
5462gimple_omp_for_grid_intra_group (const gomp_for *omp_for)
5463{
5464 gcc_checking_assert (gimple_omp_for_kind (omp_for)
5465 == GF_OMP_FOR_KIND_GRID_LOOP);
5466 return (gimple_omp_subcode (omp_for) & GF_OMP_FOR_GRID_INTRA_GROUP) != 0;
5467}
5468
5469/* Set kernel_intra_group flag of OMP_FOR to VALUE. */
5470
5471static inline void
5472gimple_omp_for_set_grid_intra_group (gomp_for *omp_for, bool value)
5473{
5474 gcc_checking_assert (gimple_omp_for_kind (omp_for)
5475 == GF_OMP_FOR_KIND_GRID_LOOP);
5476 if (value)
5477 omp_for->subcode |= GF_OMP_FOR_GRID_INTRA_GROUP;
5478 else
5479 omp_for->subcode &= ~GF_OMP_FOR_GRID_INTRA_GROUP;
5480}
5481
5482/* Return true if iterations of a grid OMP_FOR statement correspond to HSA
5483 groups. */
5484
5485static inline bool
5486gimple_omp_for_grid_group_iter (const gomp_for *omp_for)
5487{
5488 gcc_checking_assert (gimple_omp_for_kind (omp_for)
5489 == GF_OMP_FOR_KIND_GRID_LOOP);
5490 return (gimple_omp_subcode (omp_for) & GF_OMP_FOR_GRID_GROUP_ITER) != 0;
5491}
5492
5493/* Set group_iter flag of OMP_FOR to VALUE. */
5494
5495static inline void
5496gimple_omp_for_set_grid_group_iter (gomp_for *omp_for, bool value)
5497{
5498 gcc_checking_assert (gimple_omp_for_kind (omp_for)
5499 == GF_OMP_FOR_KIND_GRID_LOOP);
5500 if (value)
5501 omp_for->subcode |= GF_OMP_FOR_GRID_GROUP_ITER;
5502 else
5503 omp_for->subcode &= ~GF_OMP_FOR_GRID_GROUP_ITER;
5504}
5505
726a989a
RB
5506/* Return the clauses associated with OMP_PARALLEL GS. */
5507
5508static inline tree
355fe088 5509gimple_omp_parallel_clauses (const gimple *gs)
726a989a 5510{
538dd0b7 5511 const gomp_parallel *omp_parallel_stmt = as_a <const gomp_parallel *> (gs);
daa6e488 5512 return omp_parallel_stmt->clauses;
726a989a
RB
5513}
5514
5515
538dd0b7 5516/* Return a pointer to the clauses associated with OMP_PARALLEL_STMT. */
726a989a
RB
5517
5518static inline tree *
538dd0b7 5519gimple_omp_parallel_clauses_ptr (gomp_parallel *omp_parallel_stmt)
726a989a 5520{
daa6e488 5521 return &omp_parallel_stmt->clauses;
726a989a
RB
5522}
5523
5524
538dd0b7 5525/* Set CLAUSES to be the list of clauses associated with OMP_PARALLEL_STMT. */
726a989a
RB
5526
5527static inline void
538dd0b7
DM
5528gimple_omp_parallel_set_clauses (gomp_parallel *omp_parallel_stmt,
5529 tree clauses)
726a989a 5530{
daa6e488 5531 omp_parallel_stmt->clauses = clauses;
726a989a
RB
5532}
5533
5534
538dd0b7 5535/* Return the child function used to hold the body of OMP_PARALLEL_STMT. */
726a989a
RB
5536
5537static inline tree
538dd0b7 5538gimple_omp_parallel_child_fn (const gomp_parallel *omp_parallel_stmt)
726a989a 5539{
daa6e488 5540 return omp_parallel_stmt->child_fn;
726a989a
RB
5541}
5542
5543/* Return a pointer to the child function used to hold the body of
538dd0b7 5544 OMP_PARALLEL_STMT. */
726a989a
RB
5545
5546static inline tree *
538dd0b7 5547gimple_omp_parallel_child_fn_ptr (gomp_parallel *omp_parallel_stmt)
726a989a 5548{
daa6e488 5549 return &omp_parallel_stmt->child_fn;
726a989a
RB
5550}
5551
5552
538dd0b7 5553/* Set CHILD_FN to be the child function for OMP_PARALLEL_STMT. */
726a989a
RB
5554
5555static inline void
538dd0b7
DM
5556gimple_omp_parallel_set_child_fn (gomp_parallel *omp_parallel_stmt,
5557 tree child_fn)
726a989a 5558{
daa6e488 5559 omp_parallel_stmt->child_fn = child_fn;
726a989a
RB
5560}
5561
5562
5563/* Return the artificial argument used to send variables and values
538dd0b7 5564 from the parent to the children threads in OMP_PARALLEL_STMT. */
726a989a
RB
5565
5566static inline tree
538dd0b7 5567gimple_omp_parallel_data_arg (const gomp_parallel *omp_parallel_stmt)
726a989a 5568{
daa6e488 5569 return omp_parallel_stmt->data_arg;
726a989a
RB
5570}
5571
5572
538dd0b7 5573/* Return a pointer to the data argument for OMP_PARALLEL_STMT. */
726a989a
RB
5574
5575static inline tree *
538dd0b7 5576gimple_omp_parallel_data_arg_ptr (gomp_parallel *omp_parallel_stmt)
726a989a 5577{
daa6e488 5578 return &omp_parallel_stmt->data_arg;
726a989a
RB
5579}
5580
5581
538dd0b7 5582/* Set DATA_ARG to be the data argument for OMP_PARALLEL_STMT. */
726a989a
RB
5583
5584static inline void
538dd0b7
DM
5585gimple_omp_parallel_set_data_arg (gomp_parallel *omp_parallel_stmt,
5586 tree data_arg)
726a989a 5587{
daa6e488 5588 omp_parallel_stmt->data_arg = data_arg;
726a989a
RB
5589}
5590
b2b40051
MJ
5591/* Return the kernel_phony flag of OMP_PARALLEL_STMT. */
5592
5593static inline bool
5594gimple_omp_parallel_grid_phony (const gomp_parallel *stmt)
5595{
5596 return (gimple_omp_subcode (stmt) & GF_OMP_PARALLEL_GRID_PHONY) != 0;
5597}
5598
5599/* Set kernel_phony flag of OMP_PARALLEL_STMT to VALUE. */
5600
5601static inline void
5602gimple_omp_parallel_set_grid_phony (gomp_parallel *stmt, bool value)
5603{
5604 if (value)
5605 stmt->subcode |= GF_OMP_PARALLEL_GRID_PHONY;
5606 else
5607 stmt->subcode &= ~GF_OMP_PARALLEL_GRID_PHONY;
5608}
726a989a
RB
5609
5610/* Return the clauses associated with OMP_TASK GS. */
5611
5612static inline tree
355fe088 5613gimple_omp_task_clauses (const gimple *gs)
726a989a 5614{
538dd0b7 5615 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5616 return omp_task_stmt->clauses;
726a989a
RB
5617}
5618
5619
5620/* Return a pointer to the clauses associated with OMP_TASK GS. */
5621
5622static inline tree *
355fe088 5623gimple_omp_task_clauses_ptr (gimple *gs)
726a989a 5624{
538dd0b7 5625 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5626 return &omp_task_stmt->clauses;
726a989a
RB
5627}
5628
5629
5630/* Set CLAUSES to be the list of clauses associated with OMP_TASK
5631 GS. */
5632
5633static inline void
355fe088 5634gimple_omp_task_set_clauses (gimple *gs, tree clauses)
726a989a 5635{
538dd0b7 5636 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5637 omp_task_stmt->clauses = clauses;
726a989a
RB
5638}
5639
5640
d9a6bd32
JJ
5641/* Return true if OMP task statement G has the
5642 GF_OMP_TASK_TASKLOOP flag set. */
5643
5644static inline bool
5645gimple_omp_task_taskloop_p (const gimple *g)
5646{
5647 GIMPLE_CHECK (g, GIMPLE_OMP_TASK);
5648 return (gimple_omp_subcode (g) & GF_OMP_TASK_TASKLOOP) != 0;
5649}
5650
5651
5652/* Set the GF_OMP_TASK_TASKLOOP field in G depending on the boolean
5653 value of TASKLOOP_P. */
5654
5655static inline void
5656gimple_omp_task_set_taskloop_p (gimple *g, bool taskloop_p)
5657{
5658 GIMPLE_CHECK (g, GIMPLE_OMP_TASK);
5659 if (taskloop_p)
5660 g->subcode |= GF_OMP_TASK_TASKLOOP;
5661 else
5662 g->subcode &= ~GF_OMP_TASK_TASKLOOP;
5663}
5664
5665
28567c40
JJ
5666/* Return true if OMP task statement G has the
5667 GF_OMP_TASK_TASKWAIT flag set. */
5668
5669static inline bool
5670gimple_omp_task_taskwait_p (const gimple *g)
5671{
5672 GIMPLE_CHECK (g, GIMPLE_OMP_TASK);
5673 return (gimple_omp_subcode (g) & GF_OMP_TASK_TASKWAIT) != 0;
5674}
5675
5676
5677/* Set the GF_OMP_TASK_TASKWAIT field in G depending on the boolean
5678 value of TASKWAIT_P. */
5679
5680static inline void
5681gimple_omp_task_set_taskwait_p (gimple *g, bool taskwait_p)
5682{
5683 GIMPLE_CHECK (g, GIMPLE_OMP_TASK);
5684 if (taskwait_p)
5685 g->subcode |= GF_OMP_TASK_TASKWAIT;
5686 else
5687 g->subcode &= ~GF_OMP_TASK_TASKWAIT;
5688}
5689
5690
726a989a
RB
5691/* Return the child function used to hold the body of OMP_TASK GS. */
5692
5693static inline tree
355fe088 5694gimple_omp_task_child_fn (const gimple *gs)
726a989a 5695{
538dd0b7 5696 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5697 return omp_task_stmt->child_fn;
726a989a
RB
5698}
5699
5700/* Return a pointer to the child function used to hold the body of
5701 OMP_TASK GS. */
5702
5703static inline tree *
355fe088 5704gimple_omp_task_child_fn_ptr (gimple *gs)
726a989a 5705{
538dd0b7 5706 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5707 return &omp_task_stmt->child_fn;
726a989a
RB
5708}
5709
5710
5711/* Set CHILD_FN to be the child function for OMP_TASK GS. */
5712
5713static inline void
355fe088 5714gimple_omp_task_set_child_fn (gimple *gs, tree child_fn)
726a989a 5715{
538dd0b7 5716 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5717 omp_task_stmt->child_fn = child_fn;
726a989a
RB
5718}
5719
5720
5721/* Return the artificial argument used to send variables and values
5722 from the parent to the children threads in OMP_TASK GS. */
5723
5724static inline tree
355fe088 5725gimple_omp_task_data_arg (const gimple *gs)
726a989a 5726{
538dd0b7 5727 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5728 return omp_task_stmt->data_arg;
726a989a
RB
5729}
5730
5731
5732/* Return a pointer to the data argument for OMP_TASK GS. */
5733
5734static inline tree *
355fe088 5735gimple_omp_task_data_arg_ptr (gimple *gs)
726a989a 5736{
538dd0b7 5737 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5738 return &omp_task_stmt->data_arg;
726a989a
RB
5739}
5740
5741
5742/* Set DATA_ARG to be the data argument for OMP_TASK GS. */
5743
5744static inline void
355fe088 5745gimple_omp_task_set_data_arg (gimple *gs, tree data_arg)
726a989a 5746{
538dd0b7 5747 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5748 omp_task_stmt->data_arg = data_arg;
726a989a
RB
5749}
5750
5751
5752/* Return the clauses associated with OMP_TASK GS. */
5753
5754static inline tree
355fe088 5755gimple_omp_taskreg_clauses (const gimple *gs)
726a989a 5756{
538dd0b7
DM
5757 const gimple_statement_omp_taskreg *omp_taskreg_stmt
5758 = as_a <const gimple_statement_omp_taskreg *> (gs);
9b95612e 5759 return omp_taskreg_stmt->clauses;
726a989a
RB
5760}
5761
5762
5763/* Return a pointer to the clauses associated with OMP_TASK GS. */
5764
5765static inline tree *
355fe088 5766gimple_omp_taskreg_clauses_ptr (gimple *gs)
726a989a 5767{
538dd0b7
DM
5768 gimple_statement_omp_taskreg *omp_taskreg_stmt
5769 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5770 return &omp_taskreg_stmt->clauses;
726a989a
RB
5771}
5772
5773
5774/* Set CLAUSES to be the list of clauses associated with OMP_TASK
5775 GS. */
5776
5777static inline void
355fe088 5778gimple_omp_taskreg_set_clauses (gimple *gs, tree clauses)
726a989a 5779{
538dd0b7
DM
5780 gimple_statement_omp_taskreg *omp_taskreg_stmt
5781 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5782 omp_taskreg_stmt->clauses = clauses;
726a989a
RB
5783}
5784
5785
5786/* Return the child function used to hold the body of OMP_TASK GS. */
5787
5788static inline tree
355fe088 5789gimple_omp_taskreg_child_fn (const gimple *gs)
726a989a 5790{
538dd0b7
DM
5791 const gimple_statement_omp_taskreg *omp_taskreg_stmt
5792 = as_a <const gimple_statement_omp_taskreg *> (gs);
9b95612e 5793 return omp_taskreg_stmt->child_fn;
726a989a
RB
5794}
5795
5796/* Return a pointer to the child function used to hold the body of
5797 OMP_TASK GS. */
5798
5799static inline tree *
355fe088 5800gimple_omp_taskreg_child_fn_ptr (gimple *gs)
726a989a 5801{
538dd0b7
DM
5802 gimple_statement_omp_taskreg *omp_taskreg_stmt
5803 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5804 return &omp_taskreg_stmt->child_fn;
726a989a
RB
5805}
5806
5807
5808/* Set CHILD_FN to be the child function for OMP_TASK GS. */
5809
5810static inline void
355fe088 5811gimple_omp_taskreg_set_child_fn (gimple *gs, tree child_fn)
726a989a 5812{
538dd0b7
DM
5813 gimple_statement_omp_taskreg *omp_taskreg_stmt
5814 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5815 omp_taskreg_stmt->child_fn = child_fn;
726a989a
RB
5816}
5817
5818
5819/* Return the artificial argument used to send variables and values
5820 from the parent to the children threads in OMP_TASK GS. */
5821
5822static inline tree
355fe088 5823gimple_omp_taskreg_data_arg (const gimple *gs)
726a989a 5824{
538dd0b7
DM
5825 const gimple_statement_omp_taskreg *omp_taskreg_stmt
5826 = as_a <const gimple_statement_omp_taskreg *> (gs);
9b95612e 5827 return omp_taskreg_stmt->data_arg;
726a989a
RB
5828}
5829
5830
5831/* Return a pointer to the data argument for OMP_TASK GS. */
5832
5833static inline tree *
355fe088 5834gimple_omp_taskreg_data_arg_ptr (gimple *gs)
726a989a 5835{
538dd0b7
DM
5836 gimple_statement_omp_taskreg *omp_taskreg_stmt
5837 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5838 return &omp_taskreg_stmt->data_arg;
726a989a
RB
5839}
5840
5841
5842/* Set DATA_ARG to be the data argument for OMP_TASK GS. */
5843
5844static inline void
355fe088 5845gimple_omp_taskreg_set_data_arg (gimple *gs, tree data_arg)
726a989a 5846{
538dd0b7
DM
5847 gimple_statement_omp_taskreg *omp_taskreg_stmt
5848 = as_a <gimple_statement_omp_taskreg *> (gs);
9b95612e 5849 omp_taskreg_stmt->data_arg = data_arg;
726a989a
RB
5850}
5851
5852
5853/* Return the copy function used to hold the body of OMP_TASK GS. */
5854
5855static inline tree
355fe088 5856gimple_omp_task_copy_fn (const gimple *gs)
726a989a 5857{
538dd0b7 5858 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5859 return omp_task_stmt->copy_fn;
726a989a
RB
5860}
5861
5862/* Return a pointer to the copy function used to hold the body of
5863 OMP_TASK GS. */
5864
5865static inline tree *
355fe088 5866gimple_omp_task_copy_fn_ptr (gimple *gs)
726a989a 5867{
538dd0b7 5868 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5869 return &omp_task_stmt->copy_fn;
726a989a
RB
5870}
5871
5872
5873/* Set CHILD_FN to be the copy function for OMP_TASK GS. */
5874
5875static inline void
355fe088 5876gimple_omp_task_set_copy_fn (gimple *gs, tree copy_fn)
726a989a 5877{
538dd0b7 5878 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5879 omp_task_stmt->copy_fn = copy_fn;
726a989a
RB
5880}
5881
5882
5883/* Return size of the data block in bytes in OMP_TASK GS. */
5884
5885static inline tree
355fe088 5886gimple_omp_task_arg_size (const gimple *gs)
726a989a 5887{
538dd0b7 5888 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5889 return omp_task_stmt->arg_size;
726a989a
RB
5890}
5891
5892
5893/* Return a pointer to the data block size for OMP_TASK GS. */
5894
5895static inline tree *
355fe088 5896gimple_omp_task_arg_size_ptr (gimple *gs)
726a989a 5897{
538dd0b7 5898 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5899 return &omp_task_stmt->arg_size;
726a989a
RB
5900}
5901
5902
5903/* Set ARG_SIZE to be the data block size for OMP_TASK GS. */
5904
5905static inline void
355fe088 5906gimple_omp_task_set_arg_size (gimple *gs, tree arg_size)
726a989a 5907{
538dd0b7 5908 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5909 omp_task_stmt->arg_size = arg_size;
726a989a
RB
5910}
5911
5912
5913/* Return align of the data block in bytes in OMP_TASK GS. */
5914
5915static inline tree
355fe088 5916gimple_omp_task_arg_align (const gimple *gs)
726a989a 5917{
538dd0b7 5918 const gomp_task *omp_task_stmt = as_a <const gomp_task *> (gs);
daa6e488 5919 return omp_task_stmt->arg_align;
726a989a
RB
5920}
5921
5922
5923/* Return a pointer to the data block align for OMP_TASK GS. */
5924
5925static inline tree *
355fe088 5926gimple_omp_task_arg_align_ptr (gimple *gs)
726a989a 5927{
538dd0b7 5928 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5929 return &omp_task_stmt->arg_align;
726a989a
RB
5930}
5931
5932
5933/* Set ARG_SIZE to be the data block align for OMP_TASK GS. */
5934
5935static inline void
355fe088 5936gimple_omp_task_set_arg_align (gimple *gs, tree arg_align)
726a989a 5937{
538dd0b7 5938 gomp_task *omp_task_stmt = as_a <gomp_task *> (gs);
daa6e488 5939 omp_task_stmt->arg_align = arg_align;
726a989a
RB
5940}
5941
5942
5943/* Return the clauses associated with OMP_SINGLE GS. */
5944
5945static inline tree
355fe088 5946gimple_omp_single_clauses (const gimple *gs)
726a989a 5947{
538dd0b7 5948 const gomp_single *omp_single_stmt = as_a <const gomp_single *> (gs);
daa6e488 5949 return omp_single_stmt->clauses;
726a989a
RB
5950}
5951
5952
5953/* Return a pointer to the clauses associated with OMP_SINGLE GS. */
5954
5955static inline tree *
355fe088 5956gimple_omp_single_clauses_ptr (gimple *gs)
726a989a 5957{
538dd0b7 5958 gomp_single *omp_single_stmt = as_a <gomp_single *> (gs);
daa6e488 5959 return &omp_single_stmt->clauses;
726a989a
RB
5960}
5961
5962
538dd0b7 5963/* Set CLAUSES to be the clauses associated with OMP_SINGLE_STMT. */
726a989a
RB
5964
5965static inline void
538dd0b7 5966gimple_omp_single_set_clauses (gomp_single *omp_single_stmt, tree clauses)
726a989a 5967{
daa6e488 5968 omp_single_stmt->clauses = clauses;
726a989a
RB
5969}
5970
5971
acf0174b
JJ
5972/* Return the clauses associated with OMP_TARGET GS. */
5973
5974static inline tree
355fe088 5975gimple_omp_target_clauses (const gimple *gs)
acf0174b 5976{
538dd0b7 5977 const gomp_target *omp_target_stmt = as_a <const gomp_target *> (gs);
9b95612e 5978 return omp_target_stmt->clauses;
acf0174b
JJ
5979}
5980
5981
5982/* Return a pointer to the clauses associated with OMP_TARGET GS. */
5983
5984static inline tree *
355fe088 5985gimple_omp_target_clauses_ptr (gimple *gs)
acf0174b 5986{
538dd0b7 5987 gomp_target *omp_target_stmt = as_a <gomp_target *> (gs);
9b95612e 5988 return &omp_target_stmt->clauses;
acf0174b
JJ
5989}
5990
5991
538dd0b7 5992/* Set CLAUSES to be the clauses associated with OMP_TARGET_STMT. */
acf0174b
JJ
5993
5994static inline void
538dd0b7
DM
5995gimple_omp_target_set_clauses (gomp_target *omp_target_stmt,
5996 tree clauses)
acf0174b 5997{
9b95612e 5998 omp_target_stmt->clauses = clauses;
acf0174b
JJ
5999}
6000
6001
41dbbb37 6002/* Return the kind of the OMP_TARGET G. */
acf0174b
JJ
6003
6004static inline int
355fe088 6005gimple_omp_target_kind (const gimple *g)
acf0174b
JJ
6006{
6007 GIMPLE_CHECK (g, GIMPLE_OMP_TARGET);
6008 return (gimple_omp_subcode (g) & GF_OMP_TARGET_KIND_MASK);
6009}
6010
6011
41dbbb37 6012/* Set the kind of the OMP_TARGET G. */
acf0174b
JJ
6013
6014static inline void
538dd0b7 6015gimple_omp_target_set_kind (gomp_target *g, int kind)
acf0174b 6016{
daa6e488 6017 g->subcode = (g->subcode & ~GF_OMP_TARGET_KIND_MASK)
acf0174b
JJ
6018 | (kind & GF_OMP_TARGET_KIND_MASK);
6019}
6020
6021
538dd0b7 6022/* Return the child function used to hold the body of OMP_TARGET_STMT. */
acf0174b
JJ
6023
6024static inline tree
538dd0b7 6025gimple_omp_target_child_fn (const gomp_target *omp_target_stmt)
acf0174b 6026{
9b95612e 6027 return omp_target_stmt->child_fn;
acf0174b
JJ
6028}
6029
6030/* Return a pointer to the child function used to hold the body of
538dd0b7 6031 OMP_TARGET_STMT. */
acf0174b
JJ
6032
6033static inline tree *
538dd0b7 6034gimple_omp_target_child_fn_ptr (gomp_target *omp_target_stmt)
acf0174b 6035{
9b95612e 6036 return &omp_target_stmt->child_fn;
acf0174b
JJ
6037}
6038
6039
538dd0b7 6040/* Set CHILD_FN to be the child function for OMP_TARGET_STMT. */
acf0174b
JJ
6041
6042static inline void
538dd0b7
DM
6043gimple_omp_target_set_child_fn (gomp_target *omp_target_stmt,
6044 tree child_fn)
acf0174b 6045{
9b95612e 6046 omp_target_stmt->child_fn = child_fn;
acf0174b
JJ
6047}
6048
6049
6050/* Return the artificial argument used to send variables and values
538dd0b7 6051 from the parent to the children threads in OMP_TARGET_STMT. */
acf0174b
JJ
6052
6053static inline tree
538dd0b7 6054gimple_omp_target_data_arg (const gomp_target *omp_target_stmt)
acf0174b 6055{
9b95612e 6056 return omp_target_stmt->data_arg;
acf0174b
JJ
6057}
6058
6059
6060/* Return a pointer to the data argument for OMP_TARGET GS. */
6061
6062static inline tree *
538dd0b7 6063gimple_omp_target_data_arg_ptr (gomp_target *omp_target_stmt)
acf0174b 6064{
9b95612e 6065 return &omp_target_stmt->data_arg;
acf0174b
JJ
6066}
6067
6068
538dd0b7 6069/* Set DATA_ARG to be the data argument for OMP_TARGET_STMT. */
acf0174b
JJ
6070
6071static inline void
538dd0b7
DM
6072gimple_omp_target_set_data_arg (gomp_target *omp_target_stmt,
6073 tree data_arg)
acf0174b 6074{
9b95612e 6075 omp_target_stmt->data_arg = data_arg;
acf0174b
JJ
6076}
6077
6078
6079/* Return the clauses associated with OMP_TEAMS GS. */
6080
6081static inline tree
355fe088 6082gimple_omp_teams_clauses (const gimple *gs)
acf0174b 6083{
538dd0b7 6084 const gomp_teams *omp_teams_stmt = as_a <const gomp_teams *> (gs);
9b95612e 6085 return omp_teams_stmt->clauses;
acf0174b
JJ
6086}
6087
6088
6089/* Return a pointer to the clauses associated with OMP_TEAMS GS. */
6090
6091static inline tree *
355fe088 6092gimple_omp_teams_clauses_ptr (gimple *gs)
acf0174b 6093{
538dd0b7 6094 gomp_teams *omp_teams_stmt = as_a <gomp_teams *> (gs);
9b95612e 6095 return &omp_teams_stmt->clauses;
acf0174b
JJ
6096}
6097
6098
538dd0b7 6099/* Set CLAUSES to be the clauses associated with OMP_TEAMS_STMT. */
acf0174b
JJ
6100
6101static inline void
538dd0b7 6102gimple_omp_teams_set_clauses (gomp_teams *omp_teams_stmt, tree clauses)
acf0174b 6103{
9b95612e 6104 omp_teams_stmt->clauses = clauses;
acf0174b
JJ
6105}
6106
28567c40
JJ
6107/* Return the child function used to hold the body of OMP_TEAMS_STMT. */
6108
6109static inline tree
6110gimple_omp_teams_child_fn (const gomp_teams *omp_teams_stmt)
6111{
6112 return omp_teams_stmt->child_fn;
6113}
6114
6115/* Return a pointer to the child function used to hold the body of
6116 OMP_TEAMS_STMT. */
6117
6118static inline tree *
6119gimple_omp_teams_child_fn_ptr (gomp_teams *omp_teams_stmt)
6120{
6121 return &omp_teams_stmt->child_fn;
6122}
6123
6124
6125/* Set CHILD_FN to be the child function for OMP_TEAMS_STMT. */
6126
6127static inline void
6128gimple_omp_teams_set_child_fn (gomp_teams *omp_teams_stmt, tree child_fn)
6129{
6130 omp_teams_stmt->child_fn = child_fn;
6131}
6132
6133
6134/* Return the artificial argument used to send variables and values
6135 from the parent to the children threads in OMP_TEAMS_STMT. */
6136
6137static inline tree
6138gimple_omp_teams_data_arg (const gomp_teams *omp_teams_stmt)
6139{
6140 return omp_teams_stmt->data_arg;
6141}
6142
6143
6144/* Return a pointer to the data argument for OMP_TEAMS_STMT. */
6145
6146static inline tree *
6147gimple_omp_teams_data_arg_ptr (gomp_teams *omp_teams_stmt)
6148{
6149 return &omp_teams_stmt->data_arg;
6150}
6151
6152
6153/* Set DATA_ARG to be the data argument for OMP_TEAMS_STMT. */
6154
6155static inline void
6156gimple_omp_teams_set_data_arg (gomp_teams *omp_teams_stmt, tree data_arg)
6157{
6158 omp_teams_stmt->data_arg = data_arg;
6159}
6160
b2b40051
MJ
6161/* Return the kernel_phony flag of an OMP_TEAMS_STMT. */
6162
6163static inline bool
6164gimple_omp_teams_grid_phony (const gomp_teams *omp_teams_stmt)
6165{
6166 return (gimple_omp_subcode (omp_teams_stmt) & GF_OMP_TEAMS_GRID_PHONY) != 0;
6167}
6168
6169/* Set kernel_phony flag of an OMP_TEAMS_STMT to VALUE. */
6170
6171static inline void
6172gimple_omp_teams_set_grid_phony (gomp_teams *omp_teams_stmt, bool value)
6173{
6174 if (value)
6175 omp_teams_stmt->subcode |= GF_OMP_TEAMS_GRID_PHONY;
6176 else
6177 omp_teams_stmt->subcode &= ~GF_OMP_TEAMS_GRID_PHONY;
6178}
acf0174b 6179
28567c40
JJ
6180/* Return the host flag of an OMP_TEAMS_STMT. */
6181
6182static inline bool
6183gimple_omp_teams_host (const gomp_teams *omp_teams_stmt)
6184{
6185 return (gimple_omp_subcode (omp_teams_stmt) & GF_OMP_TEAMS_HOST) != 0;
6186}
6187
6188/* Set host flag of an OMP_TEAMS_STMT to VALUE. */
6189
6190static inline void
6191gimple_omp_teams_set_host (gomp_teams *omp_teams_stmt, bool value)
6192{
6193 if (value)
6194 omp_teams_stmt->subcode |= GF_OMP_TEAMS_HOST;
6195 else
6196 omp_teams_stmt->subcode &= ~GF_OMP_TEAMS_HOST;
6197}
6198
726a989a
RB
6199/* Return the clauses associated with OMP_SECTIONS GS. */
6200
6201static inline tree
355fe088 6202gimple_omp_sections_clauses (const gimple *gs)
726a989a 6203{
538dd0b7 6204 const gomp_sections *omp_sections_stmt = as_a <const gomp_sections *> (gs);
daa6e488 6205 return omp_sections_stmt->clauses;
726a989a
RB
6206}
6207
6208
6209/* Return a pointer to the clauses associated with OMP_SECTIONS GS. */
6210
6211static inline tree *
355fe088 6212gimple_omp_sections_clauses_ptr (gimple *gs)
726a989a 6213{
538dd0b7 6214 gomp_sections *omp_sections_stmt = as_a <gomp_sections *> (gs);
daa6e488 6215 return &omp_sections_stmt->clauses;
726a989a
RB
6216}
6217
6218
6219/* Set CLAUSES to be the set of clauses associated with OMP_SECTIONS
6220 GS. */
6221
6222static inline void
355fe088 6223gimple_omp_sections_set_clauses (gimple *gs, tree clauses)
726a989a 6224{
538dd0b7 6225 gomp_sections *omp_sections_stmt = as_a <gomp_sections *> (gs);
daa6e488 6226 omp_sections_stmt->clauses = clauses;
726a989a
RB
6227}
6228
6229
6230/* Return the control variable associated with the GIMPLE_OMP_SECTIONS
6231 in GS. */
6232
6233static inline tree
355fe088 6234gimple_omp_sections_control (const gimple *gs)
726a989a 6235{
538dd0b7 6236 const gomp_sections *omp_sections_stmt = as_a <const gomp_sections *> (gs);
daa6e488 6237 return omp_sections_stmt->control;
726a989a
RB
6238}
6239
6240
6241/* Return a pointer to the clauses associated with the GIMPLE_OMP_SECTIONS
6242 GS. */
6243
6244static inline tree *
355fe088 6245gimple_omp_sections_control_ptr (gimple *gs)
726a989a 6246{
538dd0b7 6247 gomp_sections *omp_sections_stmt = as_a <gomp_sections *> (gs);
daa6e488 6248 return &omp_sections_stmt->control;
726a989a
RB
6249}
6250
6251
6252/* Set CONTROL to be the set of clauses associated with the
6253 GIMPLE_OMP_SECTIONS in GS. */
6254
6255static inline void
355fe088 6256gimple_omp_sections_set_control (gimple *gs, tree control)
726a989a 6257{
538dd0b7 6258 gomp_sections *omp_sections_stmt = as_a <gomp_sections *> (gs);
daa6e488 6259 omp_sections_stmt->control = control;
726a989a
RB
6260}
6261
6262
726a989a
RB
6263/* Set the value being stored in an atomic store. */
6264
6265static inline void
538dd0b7 6266gimple_omp_atomic_store_set_val (gomp_atomic_store *store_stmt, tree val)
726a989a 6267{
538dd0b7 6268 store_stmt->val = val;
726a989a
RB
6269}
6270
6271
6272/* Return the value being stored in an atomic store. */
6273
6274static inline tree
538dd0b7 6275gimple_omp_atomic_store_val (const gomp_atomic_store *store_stmt)
726a989a 6276{
538dd0b7 6277 return store_stmt->val;
726a989a
RB
6278}
6279
6280
6281/* Return a pointer to the value being stored in an atomic store. */
6282
6283static inline tree *
538dd0b7 6284gimple_omp_atomic_store_val_ptr (gomp_atomic_store *store_stmt)
726a989a 6285{
538dd0b7 6286 return &store_stmt->val;
726a989a
RB
6287}
6288
6289
6290/* Set the LHS of an atomic load. */
6291
6292static inline void
538dd0b7 6293gimple_omp_atomic_load_set_lhs (gomp_atomic_load *load_stmt, tree lhs)
726a989a 6294{
538dd0b7 6295 load_stmt->lhs = lhs;
726a989a
RB
6296}
6297
6298
6299/* Get the LHS of an atomic load. */
6300
6301static inline tree
538dd0b7 6302gimple_omp_atomic_load_lhs (const gomp_atomic_load *load_stmt)
726a989a 6303{
538dd0b7 6304 return load_stmt->lhs;
726a989a
RB
6305}
6306
6307
6308/* Return a pointer to the LHS of an atomic load. */
6309
6310static inline tree *
538dd0b7 6311gimple_omp_atomic_load_lhs_ptr (gomp_atomic_load *load_stmt)
726a989a 6312{
538dd0b7 6313 return &load_stmt->lhs;
726a989a
RB
6314}
6315
6316
6317/* Set the RHS of an atomic load. */
6318
6319static inline void
538dd0b7 6320gimple_omp_atomic_load_set_rhs (gomp_atomic_load *load_stmt, tree rhs)
726a989a 6321{
538dd0b7 6322 load_stmt->rhs = rhs;
726a989a
RB
6323}
6324
6325
6326/* Get the RHS of an atomic load. */
6327
6328static inline tree
538dd0b7 6329gimple_omp_atomic_load_rhs (const gomp_atomic_load *load_stmt)
726a989a 6330{
538dd0b7 6331 return load_stmt->rhs;
726a989a
RB
6332}
6333
6334
6335/* Return a pointer to the RHS of an atomic load. */
6336
6337static inline tree *
538dd0b7 6338gimple_omp_atomic_load_rhs_ptr (gomp_atomic_load *load_stmt)
726a989a 6339{
538dd0b7 6340 return &load_stmt->rhs;
726a989a
RB
6341}
6342
6343
6344/* Get the definition of the control variable in a GIMPLE_OMP_CONTINUE. */
6345
6346static inline tree
538dd0b7 6347gimple_omp_continue_control_def (const gomp_continue *cont_stmt)
726a989a 6348{
538dd0b7 6349 return cont_stmt->control_def;
726a989a
RB
6350}
6351
6352/* The same as above, but return the address. */
6353
6354static inline tree *
538dd0b7 6355gimple_omp_continue_control_def_ptr (gomp_continue *cont_stmt)
726a989a 6356{
538dd0b7 6357 return &cont_stmt->control_def;
726a989a
RB
6358}
6359
6360/* Set the definition of the control variable in a GIMPLE_OMP_CONTINUE. */
6361
6362static inline void
538dd0b7 6363gimple_omp_continue_set_control_def (gomp_continue *cont_stmt, tree def)
726a989a 6364{
538dd0b7 6365 cont_stmt->control_def = def;
726a989a
RB
6366}
6367
6368
6369/* Get the use of the control variable in a GIMPLE_OMP_CONTINUE. */
6370
6371static inline tree
538dd0b7 6372gimple_omp_continue_control_use (const gomp_continue *cont_stmt)
726a989a 6373{
538dd0b7 6374 return cont_stmt->control_use;
726a989a
RB
6375}
6376
6377
6378/* The same as above, but return the address. */
6379
6380static inline tree *
538dd0b7 6381gimple_omp_continue_control_use_ptr (gomp_continue *cont_stmt)
726a989a 6382{
538dd0b7 6383 return &cont_stmt->control_use;
726a989a
RB
6384}
6385
6386
6387/* Set the use of the control variable in a GIMPLE_OMP_CONTINUE. */
6388
6389static inline void
538dd0b7 6390gimple_omp_continue_set_control_use (gomp_continue *cont_stmt, tree use)
726a989a 6391{
538dd0b7 6392 cont_stmt->control_use = use;
726a989a
RB
6393}
6394
538dd0b7
DM
6395/* Return a pointer to the body for the GIMPLE_TRANSACTION statement
6396 TRANSACTION_STMT. */
355a7673
MM
6397
6398static inline gimple_seq *
538dd0b7 6399gimple_transaction_body_ptr (gtransaction *transaction_stmt)
355a7673 6400{
daa6e488 6401 return &transaction_stmt->body;
355a7673
MM
6402}
6403
538dd0b7 6404/* Return the body for the GIMPLE_TRANSACTION statement TRANSACTION_STMT. */
0a35513e
AH
6405
6406static inline gimple_seq
0e7b6a51 6407gimple_transaction_body (const gtransaction *transaction_stmt)
0a35513e 6408{
7c11b0fe 6409 return transaction_stmt->body;
0a35513e
AH
6410}
6411
6412/* Return the label associated with a GIMPLE_TRANSACTION. */
6413
6414static inline tree
7c11b0fe 6415gimple_transaction_label_norm (const gtransaction *transaction_stmt)
0a35513e 6416{
7c11b0fe 6417 return transaction_stmt->label_norm;
0a35513e
AH
6418}
6419
6420static inline tree *
7c11b0fe 6421gimple_transaction_label_norm_ptr (gtransaction *transaction_stmt)
0a35513e 6422{
7c11b0fe
RH
6423 return &transaction_stmt->label_norm;
6424}
6425
6426static inline tree
6427gimple_transaction_label_uninst (const gtransaction *transaction_stmt)
6428{
6429 return transaction_stmt->label_uninst;
6430}
6431
6432static inline tree *
6433gimple_transaction_label_uninst_ptr (gtransaction *transaction_stmt)
6434{
6435 return &transaction_stmt->label_uninst;
6436}
6437
6438static inline tree
6439gimple_transaction_label_over (const gtransaction *transaction_stmt)
6440{
6441 return transaction_stmt->label_over;
6442}
6443
6444static inline tree *
6445gimple_transaction_label_over_ptr (gtransaction *transaction_stmt)
6446{
6447 return &transaction_stmt->label_over;
0a35513e
AH
6448}
6449
6450/* Return the subcode associated with a GIMPLE_TRANSACTION. */
6451
6452static inline unsigned int
538dd0b7 6453gimple_transaction_subcode (const gtransaction *transaction_stmt)
0a35513e 6454{
538dd0b7 6455 return transaction_stmt->subcode;
0a35513e
AH
6456}
6457
538dd0b7
DM
6458/* Set BODY to be the body for the GIMPLE_TRANSACTION statement
6459 TRANSACTION_STMT. */
0a35513e
AH
6460
6461static inline void
538dd0b7
DM
6462gimple_transaction_set_body (gtransaction *transaction_stmt,
6463 gimple_seq body)
0a35513e 6464{
daa6e488 6465 transaction_stmt->body = body;
0a35513e
AH
6466}
6467
6468/* Set the label associated with a GIMPLE_TRANSACTION. */
6469
6470static inline void
7c11b0fe
RH
6471gimple_transaction_set_label_norm (gtransaction *transaction_stmt, tree label)
6472{
6473 transaction_stmt->label_norm = label;
6474}
6475
6476static inline void
6477gimple_transaction_set_label_uninst (gtransaction *transaction_stmt, tree label)
6478{
6479 transaction_stmt->label_uninst = label;
6480}
6481
6482static inline void
6483gimple_transaction_set_label_over (gtransaction *transaction_stmt, tree label)
0a35513e 6484{
7c11b0fe 6485 transaction_stmt->label_over = label;
0a35513e
AH
6486}
6487
6488/* Set the subcode associated with a GIMPLE_TRANSACTION. */
6489
6490static inline void
538dd0b7
DM
6491gimple_transaction_set_subcode (gtransaction *transaction_stmt,
6492 unsigned int subcode)
0a35513e 6493{
538dd0b7 6494 transaction_stmt->subcode = subcode;
0a35513e
AH
6495}
6496
726a989a
RB
6497/* Return a pointer to the return value for GIMPLE_RETURN GS. */
6498
6499static inline tree *
1d10676d 6500gimple_return_retval_ptr (greturn *gs)
726a989a 6501{
1d10676d 6502 return &gs->op[0];
726a989a
RB
6503}
6504
6505/* Return the return value for GIMPLE_RETURN GS. */
6506
6507static inline tree
538dd0b7 6508gimple_return_retval (const greturn *gs)
726a989a 6509{
a3fe41f5 6510 return gs->op[0];
726a989a
RB
6511}
6512
6513
6514/* Set RETVAL to be the return value for GIMPLE_RETURN GS. */
6515
6516static inline void
538dd0b7 6517gimple_return_set_retval (greturn *gs, tree retval)
726a989a 6518{
a3fe41f5 6519 gs->op[0] = retval;
726a989a
RB
6520}
6521
6522
41dbbb37 6523/* Returns true when the gimple statement STMT is any of the OMP types. */
726a989a 6524
8b9db065
RH
6525#define CASE_GIMPLE_OMP \
6526 case GIMPLE_OMP_PARALLEL: \
6527 case GIMPLE_OMP_TASK: \
6528 case GIMPLE_OMP_FOR: \
6529 case GIMPLE_OMP_SECTIONS: \
6530 case GIMPLE_OMP_SECTIONS_SWITCH: \
6531 case GIMPLE_OMP_SINGLE: \
acf0174b
JJ
6532 case GIMPLE_OMP_TARGET: \
6533 case GIMPLE_OMP_TEAMS: \
8b9db065
RH
6534 case GIMPLE_OMP_SECTION: \
6535 case GIMPLE_OMP_MASTER: \
acf0174b 6536 case GIMPLE_OMP_TASKGROUP: \
8b9db065
RH
6537 case GIMPLE_OMP_ORDERED: \
6538 case GIMPLE_OMP_CRITICAL: \
bf38f7e9 6539 case GIMPLE_OMP_SCAN: \
8b9db065
RH
6540 case GIMPLE_OMP_RETURN: \
6541 case GIMPLE_OMP_ATOMIC_LOAD: \
6542 case GIMPLE_OMP_ATOMIC_STORE: \
b2b40051
MJ
6543 case GIMPLE_OMP_CONTINUE: \
6544 case GIMPLE_OMP_GRID_BODY
8b9db065 6545
726a989a 6546static inline bool
355fe088 6547is_gimple_omp (const gimple *stmt)
726a989a 6548{
8b9db065
RH
6549 switch (gimple_code (stmt))
6550 {
6551 CASE_GIMPLE_OMP:
6552 return true;
6553 default:
6554 return false;
6555 }
726a989a
RB
6556}
6557
41dbbb37
TS
6558/* Return true if the OMP gimple statement STMT is any of the OpenACC types
6559 specifically. */
6560
6561static inline bool
355fe088 6562is_gimple_omp_oacc (const gimple *stmt)
41dbbb37
TS
6563{
6564 gcc_assert (is_gimple_omp (stmt));
6565 switch (gimple_code (stmt))
6566 {
6567 case GIMPLE_OMP_FOR:
6568 switch (gimple_omp_for_kind (stmt))
6569 {
6570 case GF_OMP_FOR_KIND_OACC_LOOP:
6571 return true;
6572 default:
6573 return false;
6574 }
6575 case GIMPLE_OMP_TARGET:
6576 switch (gimple_omp_target_kind (stmt))
6577 {
6578 case GF_OMP_TARGET_KIND_OACC_PARALLEL:
6579 case GF_OMP_TARGET_KIND_OACC_KERNELS:
62aee289 6580 case GF_OMP_TARGET_KIND_OACC_SERIAL:
41dbbb37
TS
6581 case GF_OMP_TARGET_KIND_OACC_DATA:
6582 case GF_OMP_TARGET_KIND_OACC_UPDATE:
6583 case GF_OMP_TARGET_KIND_OACC_ENTER_EXIT_DATA:
6e232ba4 6584 case GF_OMP_TARGET_KIND_OACC_DECLARE:
37d5ad46 6585 case GF_OMP_TARGET_KIND_OACC_HOST_DATA:
41dbbb37
TS
6586 return true;
6587 default:
6588 return false;
6589 }
6590 default:
6591 return false;
6592 }
6593}
6594
6595
6596/* Return true if the OMP gimple statement STMT is offloaded. */
6597
6598static inline bool
355fe088 6599is_gimple_omp_offloaded (const gimple *stmt)
41dbbb37
TS
6600{
6601 gcc_assert (is_gimple_omp (stmt));
6602 switch (gimple_code (stmt))
6603 {
6604 case GIMPLE_OMP_TARGET:
6605 switch (gimple_omp_target_kind (stmt))
6606 {
6607 case GF_OMP_TARGET_KIND_REGION:
6608 case GF_OMP_TARGET_KIND_OACC_PARALLEL:
6609 case GF_OMP_TARGET_KIND_OACC_KERNELS:
62aee289 6610 case GF_OMP_TARGET_KIND_OACC_SERIAL:
41dbbb37
TS
6611 return true;
6612 default:
6613 return false;
6614 }
6615 default:
6616 return false;
6617 }
6618}
6619
726a989a
RB
6620
6621/* Returns TRUE if statement G is a GIMPLE_NOP. */
6622
6623static inline bool
355fe088 6624gimple_nop_p (const gimple *g)
726a989a
RB
6625{
6626 return gimple_code (g) == GIMPLE_NOP;
6627}
6628
6629
1d65f45c
RH
6630/* Return true if GS is a GIMPLE_RESX. */
6631
6632static inline bool
355fe088 6633is_gimple_resx (const gimple *gs)
1d65f45c
RH
6634{
6635 return gimple_code (gs) == GIMPLE_RESX;
6636}
6637
828552ed
RG
6638/* Return the type of the main expression computed by STMT. Return
6639 void_type_node if the statement computes nothing. */
6640
6641static inline tree
355fe088 6642gimple_expr_type (const gimple *stmt)
828552ed
RG
6643{
6644 enum gimple_code code = gimple_code (stmt);
9dbe0d83
AK
6645 /* In general we want to pass out a type that can be substituted
6646 for both the RHS and the LHS types if there is a possibly
6647 useless conversion involved. That means returning the
6648 original RHS type as far as we can reconstruct it. */
6649 if (code == GIMPLE_CALL)
828552ed 6650 {
9dbe0d83 6651 const gcall *call_stmt = as_a <const gcall *> (stmt);
f307441a
RS
6652 if (gimple_call_internal_p (call_stmt))
6653 switch (gimple_call_internal_fn (call_stmt))
6654 {
6655 case IFN_MASK_STORE:
6656 case IFN_SCATTER_STORE:
6657 return TREE_TYPE (gimple_call_arg (call_stmt, 3));
6658 case IFN_MASK_SCATTER_STORE:
6659 return TREE_TYPE (gimple_call_arg (call_stmt, 4));
6660 default:
6661 break;
6662 }
6663 return gimple_call_return_type (call_stmt);
9dbe0d83
AK
6664 }
6665 else if (code == GIMPLE_ASSIGN)
6666 {
6667 if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR)
6668 return TREE_TYPE (gimple_assign_rhs1 (stmt));
828552ed 6669 else
9dbe0d83
AK
6670 /* As fallback use the type of the LHS. */
6671 return TREE_TYPE (gimple_get_lhs (stmt));
828552ed
RG
6672 }
6673 else if (code == GIMPLE_COND)
6674 return boolean_type_node;
6675 else
6676 return void_type_node;
6677}
6678
726a989a
RB
6679/* Enum and arrays used for allocation stats. Keep in sync with
6680 gimple.c:gimple_alloc_kind_names. */
6681enum gimple_alloc_kind
6682{
6683 gimple_alloc_kind_assign, /* Assignments. */
6684 gimple_alloc_kind_phi, /* PHI nodes. */
6685 gimple_alloc_kind_cond, /* Conditionals. */
726a989a
RB
6686 gimple_alloc_kind_rest, /* Everything else. */
6687 gimple_alloc_kind_all
6688};
6689
33b366c3
ML
6690extern uint64_t gimple_alloc_counts[];
6691extern uint64_t gimple_alloc_sizes[];
726a989a
RB
6692
6693/* Return the allocation kind for a given stmt CODE. */
6694static inline enum gimple_alloc_kind
6695gimple_alloc_kind (enum gimple_code code)
6696{
6697 switch (code)
6698 {
6699 case GIMPLE_ASSIGN:
6700 return gimple_alloc_kind_assign;
6701 case GIMPLE_PHI:
6702 return gimple_alloc_kind_phi;
6703 case GIMPLE_COND:
6704 return gimple_alloc_kind_cond;
6705 default:
6706 return gimple_alloc_kind_rest;
6707 }
6708}
726a989a 6709
45b0be94
AM
6710/* Return true if a location should not be emitted for this statement
6711 by annotate_all_with_location. */
6712
6713static inline bool
355fe088 6714gimple_do_not_emit_location_p (gimple *g)
45b0be94
AM
6715{
6716 return gimple_plf (g, GF_PLF_1);
6717}
6718
6719/* Mark statement G so a location will not be emitted by
6720 annotate_one_with_location. */
6721
6722static inline void
355fe088 6723gimple_set_do_not_emit_location (gimple *g)
45b0be94
AM
6724{
6725 /* The PLF flags are initialized to 0 when a new tuple is created,
6726 so no need to initialize it anywhere. */
6727 gimple_set_plf (g, GF_PLF_1, true);
6728}
6729
726a989a 6730#endif /* GCC_GIMPLE_H */