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