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