PR fortran/40539 Document LOGICAL representation
[official-gcc.git] / gcc / gimple.h
blobb09e8561f10f9c0de297c91c05f70792d15a7ecd
1 /* Gimple IR definitions.
3 Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4 Contributed by Aldy Hernandez <aldyh@redhat.com>
6 This file is part of GCC.
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.
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.
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/>. */
22 #ifndef GCC_GIMPLE_H
23 #define GCC_GIMPLE_H
25 #include "pointer-set.h"
26 #include "vec.h"
27 #include "ggc.h"
28 #include "tm.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
31 #include "tree-ssa-operands.h"
33 DEF_VEC_P(gimple);
34 DEF_VEC_ALLOC_P(gimple,heap);
35 DEF_VEC_ALLOC_P(gimple,gc);
37 typedef gimple *gimple_p;
38 DEF_VEC_P(gimple_p);
39 DEF_VEC_ALLOC_P(gimple_p,heap);
41 DEF_VEC_P(gimple_seq);
42 DEF_VEC_ALLOC_P(gimple_seq,gc);
43 DEF_VEC_ALLOC_P(gimple_seq,heap);
45 /* For each block, the PHI nodes that need to be rewritten are stored into
46 these vectors. */
47 typedef VEC(gimple, heap) *gimple_vec;
48 DEF_VEC_P (gimple_vec);
49 DEF_VEC_ALLOC_P (gimple_vec, heap);
51 enum gimple_code {
52 #define DEFGSCODE(SYM, STRING, STRUCT) SYM,
53 #include "gimple.def"
54 #undef DEFGSCODE
55 LAST_AND_UNUSED_GIMPLE_CODE
58 extern const char *const gimple_code_name[];
59 extern const unsigned char gimple_rhs_class_table[];
61 /* Error out if a gimple tuple is addressed incorrectly. */
62 #if defined ENABLE_GIMPLE_CHECKING
63 extern void gimple_check_failed (const_gimple, const char *, int, \
64 const char *, enum gimple_code, \
65 enum tree_code) ATTRIBUTE_NORETURN;
67 #define GIMPLE_CHECK(GS, CODE) \
68 do { \
69 const_gimple __gs = (GS); \
70 if (gimple_code (__gs) != (CODE)) \
71 gimple_check_failed (__gs, __FILE__, __LINE__, __FUNCTION__, \
72 (CODE), ERROR_MARK); \
73 } while (0)
74 #else /* not ENABLE_GIMPLE_CHECKING */
75 #define GIMPLE_CHECK(GS, CODE) (void)0
76 #endif
78 /* Class of GIMPLE expressions suitable for the RHS of assignments. See
79 get_gimple_rhs_class. */
80 enum gimple_rhs_class
82 GIMPLE_INVALID_RHS, /* The expression cannot be used on the RHS. */
83 GIMPLE_BINARY_RHS, /* The expression is a binary operation. */
84 GIMPLE_UNARY_RHS, /* The expression is a unary operation. */
85 GIMPLE_SINGLE_RHS /* The expression is a single object (an SSA
86 name, a _DECL, a _REF, etc. */
89 /* Specific flags for individual GIMPLE statements. These flags are
90 always stored in gimple_statement_base.subcode and they may only be
91 defined for statement codes that do not use sub-codes.
93 Values for the masks can overlap as long as the overlapping values
94 are never used in the same statement class.
96 The maximum mask value that can be defined is 1 << 15 (i.e., each
97 statement code can hold up to 16 bitflags).
99 Keep this list sorted. */
100 enum gf_mask {
101 GF_ASM_INPUT = 1 << 0,
102 GF_ASM_VOLATILE = 1 << 1,
103 GF_CALL_CANNOT_INLINE = 1 << 0,
104 GF_CALL_FROM_THUNK = 1 << 1,
105 GF_CALL_RETURN_SLOT_OPT = 1 << 2,
106 GF_CALL_TAILCALL = 1 << 3,
107 GF_CALL_VA_ARG_PACK = 1 << 4,
108 GF_OMP_PARALLEL_COMBINED = 1 << 0,
110 /* True on an GIMPLE_OMP_RETURN statement if the return does not require
111 a thread synchronization via some sort of barrier. The exact barrier
112 that would otherwise be emitted is dependent on the OMP statement with
113 which this return is associated. */
114 GF_OMP_RETURN_NOWAIT = 1 << 0,
116 GF_OMP_SECTION_LAST = 1 << 0,
117 GF_PREDICT_TAKEN = 1 << 15
120 /* Currently, there's only one type of gimple debug stmt. Others are
121 envisioned, for example, to enable the generation of is_stmt notes
122 in line number information, to mark sequence points, etc. This
123 subcode is to be used to tell them apart. */
124 enum gimple_debug_subcode {
125 GIMPLE_DEBUG_BIND = 0
128 /* Masks for selecting a pass local flag (PLF) to work on. These
129 masks are used by gimple_set_plf and gimple_plf. */
130 enum plf_mask {
131 GF_PLF_1 = 1 << 0,
132 GF_PLF_2 = 1 << 1
135 /* A node in a gimple_seq_d. */
136 struct GTY((chain_next ("%h.next"), chain_prev ("%h.prev"))) gimple_seq_node_d {
137 gimple stmt;
138 struct gimple_seq_node_d *prev;
139 struct gimple_seq_node_d *next;
142 /* A double-linked sequence of gimple statements. */
143 struct GTY ((chain_next ("%h.next_free"))) gimple_seq_d {
144 /* First and last statements in the sequence. */
145 gimple_seq_node first;
146 gimple_seq_node last;
148 /* Sequences are created/destroyed frequently. To minimize
149 allocation activity, deallocated sequences are kept in a pool of
150 available sequences. This is the pointer to the next free
151 sequence in the pool. */
152 gimple_seq next_free;
156 /* Return the first node in GIMPLE sequence S. */
158 static inline gimple_seq_node
159 gimple_seq_first (const_gimple_seq s)
161 return s ? s->first : NULL;
165 /* Return the first statement in GIMPLE sequence S. */
167 static inline gimple
168 gimple_seq_first_stmt (const_gimple_seq s)
170 gimple_seq_node n = gimple_seq_first (s);
171 return (n) ? n->stmt : NULL;
175 /* Return the last node in GIMPLE sequence S. */
177 static inline gimple_seq_node
178 gimple_seq_last (const_gimple_seq s)
180 return s ? s->last : NULL;
184 /* Return the last statement in GIMPLE sequence S. */
186 static inline gimple
187 gimple_seq_last_stmt (const_gimple_seq s)
189 gimple_seq_node n = gimple_seq_last (s);
190 return (n) ? n->stmt : NULL;
194 /* Set the last node in GIMPLE sequence S to LAST. */
196 static inline void
197 gimple_seq_set_last (gimple_seq s, gimple_seq_node last)
199 s->last = last;
203 /* Set the first node in GIMPLE sequence S to FIRST. */
205 static inline void
206 gimple_seq_set_first (gimple_seq s, gimple_seq_node first)
208 s->first = first;
212 /* Return true if GIMPLE sequence S is empty. */
214 static inline bool
215 gimple_seq_empty_p (const_gimple_seq s)
217 return s == NULL || s->first == NULL;
221 void gimple_seq_add_stmt (gimple_seq *, gimple);
223 /* Allocate a new sequence and initialize its first element with STMT. */
225 static inline gimple_seq
226 gimple_seq_alloc_with_stmt (gimple stmt)
228 gimple_seq seq = NULL;
229 gimple_seq_add_stmt (&seq, stmt);
230 return seq;
234 /* Returns the sequence of statements in BB. */
236 static inline gimple_seq
237 bb_seq (const_basic_block bb)
239 return (!(bb->flags & BB_RTL) && bb->il.gimple) ? bb->il.gimple->seq : NULL;
243 /* Sets the sequence of statements in BB to SEQ. */
245 static inline void
246 set_bb_seq (basic_block bb, gimple_seq seq)
248 gcc_assert (!(bb->flags & BB_RTL));
249 bb->il.gimple->seq = seq;
252 /* Iterator object for GIMPLE statement sequences. */
254 typedef struct
256 /* Sequence node holding the current statement. */
257 gimple_seq_node ptr;
259 /* Sequence and basic block holding the statement. These fields
260 are necessary to handle edge cases such as when statement is
261 added to an empty basic block or when the last statement of a
262 block/sequence is removed. */
263 gimple_seq seq;
264 basic_block bb;
265 } gimple_stmt_iterator;
268 /* Data structure definitions for GIMPLE tuples. NOTE: word markers
269 are for 64 bit hosts. */
271 struct GTY(()) gimple_statement_base {
272 /* [ WORD 1 ]
273 Main identifying code for a tuple. */
274 ENUM_BITFIELD(gimple_code) code : 8;
276 /* Nonzero if a warning should not be emitted on this tuple. */
277 unsigned int no_warning : 1;
279 /* Nonzero if this tuple has been visited. Passes are responsible
280 for clearing this bit before using it. */
281 unsigned int visited : 1;
283 /* Nonzero if this tuple represents a non-temporal move. */
284 unsigned int nontemporal_move : 1;
286 /* Pass local flags. These flags are free for any pass to use as
287 they see fit. Passes should not assume that these flags contain
288 any useful value when the pass starts. Any initial state that
289 the pass requires should be set on entry to the pass. See
290 gimple_set_plf and gimple_plf for usage. */
291 unsigned int plf : 2;
293 /* Nonzero if this statement has been modified and needs to have its
294 operands rescanned. */
295 unsigned modified : 1;
297 /* Nonzero if this statement contains volatile operands. */
298 unsigned has_volatile_ops : 1;
300 /* Padding to get subcode to 16 bit alignment. */
301 unsigned pad : 1;
303 /* The SUBCODE field can be used for tuple-specific flags for tuples
304 that do not require subcodes. Note that SUBCODE should be at
305 least as wide as tree codes, as several tuples store tree codes
306 in there. */
307 unsigned int subcode : 16;
309 /* UID of this statement. This is used by passes that want to
310 assign IDs to statements. It must be assigned and used by each
311 pass. By default it should be assumed to contain garbage. */
312 unsigned uid;
314 /* [ WORD 2 ]
315 Locus information for debug info. */
316 location_t location;
318 /* Number of operands in this tuple. */
319 unsigned num_ops;
321 /* [ WORD 3 ]
322 Basic block holding this statement. */
323 struct basic_block_def *bb;
325 /* [ WORD 4 ]
326 Lexical block holding this statement. */
327 tree block;
331 /* Base structure for tuples with operands. */
333 struct GTY(()) gimple_statement_with_ops_base
335 /* [ WORD 1-4 ] */
336 struct gimple_statement_base gsbase;
338 /* [ WORD 5-6 ]
339 SSA operand vectors. NOTE: It should be possible to
340 amalgamate these vectors with the operand vector OP. However,
341 the SSA operand vectors are organized differently and contain
342 more information (like immediate use chaining). */
343 struct def_optype_d GTY((skip (""))) *def_ops;
344 struct use_optype_d GTY((skip (""))) *use_ops;
348 /* Statements that take register operands. */
350 struct GTY(()) gimple_statement_with_ops
352 /* [ WORD 1-6 ] */
353 struct gimple_statement_with_ops_base opbase;
355 /* [ WORD 7 ]
356 Operand vector. NOTE! This must always be the last field
357 of this structure. In particular, this means that this
358 structure cannot be embedded inside another one. */
359 tree GTY((length ("%h.opbase.gsbase.num_ops"))) op[1];
363 /* Base for statements that take both memory and register operands. */
365 struct GTY(()) gimple_statement_with_memory_ops_base
367 /* [ WORD 1-6 ] */
368 struct gimple_statement_with_ops_base opbase;
370 /* [ WORD 7-8 ]
371 Virtual operands for this statement. The GC will pick them
372 up via the ssa_names array. */
373 tree GTY((skip (""))) vdef;
374 tree GTY((skip (""))) vuse;
378 /* Statements that take both memory and register operands. */
380 struct GTY(()) gimple_statement_with_memory_ops
382 /* [ WORD 1-8 ] */
383 struct gimple_statement_with_memory_ops_base membase;
385 /* [ WORD 9 ]
386 Operand vector. NOTE! This must always be the last field
387 of this structure. In particular, this means that this
388 structure cannot be embedded inside another one. */
389 tree GTY((length ("%h.membase.opbase.gsbase.num_ops"))) op[1];
393 /* OpenMP statements (#pragma omp). */
395 struct GTY(()) gimple_statement_omp {
396 /* [ WORD 1-4 ] */
397 struct gimple_statement_base gsbase;
399 /* [ WORD 5 ] */
400 gimple_seq body;
404 /* GIMPLE_BIND */
406 struct GTY(()) gimple_statement_bind {
407 /* [ WORD 1-4 ] */
408 struct gimple_statement_base gsbase;
410 /* [ WORD 5 ]
411 Variables declared in this scope. */
412 tree vars;
414 /* [ WORD 6 ]
415 This is different than the BLOCK field in gimple_statement_base,
416 which is analogous to TREE_BLOCK (i.e., the lexical block holding
417 this statement). This field is the equivalent of BIND_EXPR_BLOCK
418 in tree land (i.e., the lexical scope defined by this bind). See
419 gimple-low.c. */
420 tree block;
422 /* [ WORD 7 ] */
423 gimple_seq body;
427 /* GIMPLE_CATCH */
429 struct GTY(()) gimple_statement_catch {
430 /* [ WORD 1-4 ] */
431 struct gimple_statement_base gsbase;
433 /* [ WORD 5 ] */
434 tree types;
436 /* [ WORD 6 ] */
437 gimple_seq handler;
441 /* GIMPLE_EH_FILTER */
443 struct GTY(()) gimple_statement_eh_filter {
444 /* [ WORD 1-4 ] */
445 struct gimple_statement_base gsbase;
447 /* [ WORD 5 ]
448 Filter types. */
449 tree types;
451 /* [ WORD 6 ]
452 Failure actions. */
453 gimple_seq failure;
457 /* GIMPLE_EH_MUST_NOT_THROW */
459 struct GTY(()) gimple_statement_eh_mnt {
460 /* [ WORD 1-4 ] */
461 struct gimple_statement_base gsbase;
463 /* [ WORD 5 ] Abort function decl. */
464 tree fndecl;
467 /* GIMPLE_PHI */
469 struct GTY(()) gimple_statement_phi {
470 /* [ WORD 1-4 ] */
471 struct gimple_statement_base gsbase;
473 /* [ WORD 5 ] */
474 unsigned capacity;
475 unsigned nargs;
477 /* [ WORD 6 ] */
478 tree result;
480 /* [ WORD 7 ] */
481 struct phi_arg_d GTY ((length ("%h.nargs"))) args[1];
485 /* GIMPLE_RESX, GIMPLE_EH_DISPATCH */
487 struct GTY(()) gimple_statement_eh_ctrl
489 /* [ WORD 1-4 ] */
490 struct gimple_statement_base gsbase;
492 /* [ WORD 5 ]
493 Exception region number. */
494 int region;
498 /* GIMPLE_TRY */
500 struct GTY(()) gimple_statement_try {
501 /* [ WORD 1-4 ] */
502 struct gimple_statement_base gsbase;
504 /* [ WORD 5 ]
505 Expression to evaluate. */
506 gimple_seq eval;
508 /* [ WORD 6 ]
509 Cleanup expression. */
510 gimple_seq cleanup;
513 /* Kind of GIMPLE_TRY statements. */
514 enum gimple_try_flags
516 /* A try/catch. */
517 GIMPLE_TRY_CATCH = 1 << 0,
519 /* A try/finally. */
520 GIMPLE_TRY_FINALLY = 1 << 1,
521 GIMPLE_TRY_KIND = GIMPLE_TRY_CATCH | GIMPLE_TRY_FINALLY,
523 /* Analogous to TRY_CATCH_IS_CLEANUP. */
524 GIMPLE_TRY_CATCH_IS_CLEANUP = 1 << 2
527 /* GIMPLE_WITH_CLEANUP_EXPR */
529 struct GTY(()) gimple_statement_wce {
530 /* [ WORD 1-4 ] */
531 struct gimple_statement_base gsbase;
533 /* Subcode: CLEANUP_EH_ONLY. True if the cleanup should only be
534 executed if an exception is thrown, not on normal exit of its
535 scope. This flag is analogous to the CLEANUP_EH_ONLY flag
536 in TARGET_EXPRs. */
538 /* [ WORD 5 ]
539 Cleanup expression. */
540 gimple_seq cleanup;
544 /* GIMPLE_ASM */
546 struct GTY(()) gimple_statement_asm
548 /* [ WORD 1-8 ] */
549 struct gimple_statement_with_memory_ops_base membase;
551 /* [ WORD 9 ]
552 __asm__ statement. */
553 const char *string;
555 /* [ WORD 10 ]
556 Number of inputs, outputs, clobbers, labels. */
557 unsigned char ni;
558 unsigned char no;
559 unsigned char nc;
560 unsigned char nl;
562 /* [ WORD 11 ]
563 Operand vector. NOTE! This must always be the last field
564 of this structure. In particular, this means that this
565 structure cannot be embedded inside another one. */
566 tree GTY((length ("%h.membase.opbase.gsbase.num_ops"))) op[1];
569 /* GIMPLE_OMP_CRITICAL */
571 struct GTY(()) gimple_statement_omp_critical {
572 /* [ WORD 1-5 ] */
573 struct gimple_statement_omp omp;
575 /* [ WORD 6 ]
576 Critical section name. */
577 tree name;
581 struct GTY(()) gimple_omp_for_iter {
582 /* Condition code. */
583 enum tree_code cond;
585 /* Index variable. */
586 tree index;
588 /* Initial value. */
589 tree initial;
591 /* Final value. */
592 tree final;
594 /* Increment. */
595 tree incr;
598 /* GIMPLE_OMP_FOR */
600 struct GTY(()) gimple_statement_omp_for {
601 /* [ WORD 1-5 ] */
602 struct gimple_statement_omp omp;
604 /* [ WORD 6 ] */
605 tree clauses;
607 /* [ WORD 7 ]
608 Number of elements in iter array. */
609 size_t collapse;
611 /* [ WORD 8 ] */
612 struct gimple_omp_for_iter * GTY((length ("%h.collapse"))) iter;
614 /* [ WORD 9 ]
615 Pre-body evaluated before the loop body begins. */
616 gimple_seq pre_body;
620 /* GIMPLE_OMP_PARALLEL */
622 struct GTY(()) gimple_statement_omp_parallel {
623 /* [ WORD 1-5 ] */
624 struct gimple_statement_omp omp;
626 /* [ WORD 6 ]
627 Clauses. */
628 tree clauses;
630 /* [ WORD 7 ]
631 Child function holding the body of the parallel region. */
632 tree child_fn;
634 /* [ WORD 8 ]
635 Shared data argument. */
636 tree data_arg;
640 /* GIMPLE_OMP_TASK */
642 struct GTY(()) gimple_statement_omp_task {
643 /* [ WORD 1-8 ] */
644 struct gimple_statement_omp_parallel par;
646 /* [ WORD 9 ]
647 Child function holding firstprivate initialization if needed. */
648 tree copy_fn;
650 /* [ WORD 10-11 ]
651 Size and alignment in bytes of the argument data block. */
652 tree arg_size;
653 tree arg_align;
657 /* GIMPLE_OMP_SECTION */
658 /* Uses struct gimple_statement_omp. */
661 /* GIMPLE_OMP_SECTIONS */
663 struct GTY(()) gimple_statement_omp_sections {
664 /* [ WORD 1-5 ] */
665 struct gimple_statement_omp omp;
667 /* [ WORD 6 ] */
668 tree clauses;
670 /* [ WORD 7 ]
671 The control variable used for deciding which of the sections to
672 execute. */
673 tree control;
676 /* GIMPLE_OMP_CONTINUE.
678 Note: This does not inherit from gimple_statement_omp, because we
679 do not need the body field. */
681 struct GTY(()) gimple_statement_omp_continue {
682 /* [ WORD 1-4 ] */
683 struct gimple_statement_base gsbase;
685 /* [ WORD 5 ] */
686 tree control_def;
688 /* [ WORD 6 ] */
689 tree control_use;
692 /* GIMPLE_OMP_SINGLE */
694 struct GTY(()) gimple_statement_omp_single {
695 /* [ WORD 1-5 ] */
696 struct gimple_statement_omp omp;
698 /* [ WORD 6 ] */
699 tree clauses;
703 /* GIMPLE_OMP_ATOMIC_LOAD.
704 Note: This is based on gimple_statement_base, not g_s_omp, because g_s_omp
705 contains a sequence, which we don't need here. */
707 struct GTY(()) gimple_statement_omp_atomic_load {
708 /* [ WORD 1-4 ] */
709 struct gimple_statement_base gsbase;
711 /* [ WORD 5-6 ] */
712 tree rhs, lhs;
715 /* GIMPLE_OMP_ATOMIC_STORE.
716 See note on GIMPLE_OMP_ATOMIC_LOAD. */
718 struct GTY(()) gimple_statement_omp_atomic_store {
719 /* [ WORD 1-4 ] */
720 struct gimple_statement_base gsbase;
722 /* [ WORD 5 ] */
723 tree val;
726 #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) SYM,
727 enum gimple_statement_structure_enum {
728 #include "gsstruct.def"
729 LAST_GSS_ENUM
731 #undef DEFGSSTRUCT
734 /* Define the overall contents of a gimple tuple. It may be any of the
735 structures declared above for various types of tuples. */
737 union GTY ((desc ("gimple_statement_structure (&%h)"))) gimple_statement_d {
738 struct gimple_statement_base GTY ((tag ("GSS_BASE"))) gsbase;
739 struct gimple_statement_with_ops GTY ((tag ("GSS_WITH_OPS"))) gsops;
740 struct gimple_statement_with_memory_ops_base GTY ((tag ("GSS_WITH_MEM_OPS_BASE"))) gsmembase;
741 struct gimple_statement_with_memory_ops GTY ((tag ("GSS_WITH_MEM_OPS"))) gsmem;
742 struct gimple_statement_omp GTY ((tag ("GSS_OMP"))) omp;
743 struct gimple_statement_bind GTY ((tag ("GSS_BIND"))) gimple_bind;
744 struct gimple_statement_catch GTY ((tag ("GSS_CATCH"))) gimple_catch;
745 struct gimple_statement_eh_filter GTY ((tag ("GSS_EH_FILTER"))) gimple_eh_filter;
746 struct gimple_statement_eh_mnt GTY ((tag ("GSS_EH_MNT"))) gimple_eh_mnt;
747 struct gimple_statement_phi GTY ((tag ("GSS_PHI"))) gimple_phi;
748 struct gimple_statement_eh_ctrl GTY ((tag ("GSS_EH_CTRL"))) gimple_eh_ctrl;
749 struct gimple_statement_try GTY ((tag ("GSS_TRY"))) gimple_try;
750 struct gimple_statement_wce GTY ((tag ("GSS_WCE"))) gimple_wce;
751 struct gimple_statement_asm GTY ((tag ("GSS_ASM"))) gimple_asm;
752 struct gimple_statement_omp_critical GTY ((tag ("GSS_OMP_CRITICAL"))) gimple_omp_critical;
753 struct gimple_statement_omp_for GTY ((tag ("GSS_OMP_FOR"))) gimple_omp_for;
754 struct gimple_statement_omp_parallel GTY ((tag ("GSS_OMP_PARALLEL"))) gimple_omp_parallel;
755 struct gimple_statement_omp_task GTY ((tag ("GSS_OMP_TASK"))) gimple_omp_task;
756 struct gimple_statement_omp_sections GTY ((tag ("GSS_OMP_SECTIONS"))) gimple_omp_sections;
757 struct gimple_statement_omp_single GTY ((tag ("GSS_OMP_SINGLE"))) gimple_omp_single;
758 struct gimple_statement_omp_continue GTY ((tag ("GSS_OMP_CONTINUE"))) gimple_omp_continue;
759 struct gimple_statement_omp_atomic_load GTY ((tag ("GSS_OMP_ATOMIC_LOAD"))) gimple_omp_atomic_load;
760 struct gimple_statement_omp_atomic_store GTY ((tag ("GSS_OMP_ATOMIC_STORE"))) gimple_omp_atomic_store;
763 /* In gimple.c. */
765 /* Offset in bytes to the location of the operand vector.
766 Zero if there is no operand vector for this tuple structure. */
767 extern size_t const gimple_ops_offset_[];
769 /* Map GIMPLE codes to GSS codes. */
770 extern enum gimple_statement_structure_enum const gss_for_code_[];
772 /* This variable holds the currently expanded gimple statement for purposes
773 of comminucating the profile info to the builtin expanders. */
774 extern gimple currently_expanding_gimple_stmt;
776 gimple gimple_build_return (tree);
778 gimple gimple_build_assign_stat (tree, tree MEM_STAT_DECL);
779 #define gimple_build_assign(l,r) gimple_build_assign_stat (l, r MEM_STAT_INFO)
781 void extract_ops_from_tree (tree, enum tree_code *, tree *, tree *);
783 gimple gimple_build_assign_with_ops_stat (enum tree_code, tree, tree,
784 tree MEM_STAT_DECL);
785 #define gimple_build_assign_with_ops(c,o1,o2,o3) \
786 gimple_build_assign_with_ops_stat (c, o1, o2, o3 MEM_STAT_INFO)
788 gimple gimple_build_debug_bind_stat (tree, tree, gimple MEM_STAT_DECL);
789 #define gimple_build_debug_bind(var,val,stmt) \
790 gimple_build_debug_bind_stat ((var), (val), (stmt) MEM_STAT_INFO)
792 gimple gimple_build_call_vec (tree, VEC(tree, heap) *);
793 gimple gimple_build_call (tree, unsigned, ...);
794 gimple gimple_build_call_from_tree (tree);
795 gimple gimplify_assign (tree, tree, gimple_seq *);
796 gimple gimple_build_cond (enum tree_code, tree, tree, tree, tree);
797 gimple gimple_build_label (tree label);
798 gimple gimple_build_goto (tree dest);
799 gimple gimple_build_nop (void);
800 gimple gimple_build_bind (tree, gimple_seq, tree);
801 gimple gimple_build_asm_vec (const char *, VEC(tree,gc) *, VEC(tree,gc) *,
802 VEC(tree,gc) *, VEC(tree,gc) *);
803 gimple gimple_build_catch (tree, gimple_seq);
804 gimple gimple_build_eh_filter (tree, gimple_seq);
805 gimple gimple_build_eh_must_not_throw (tree);
806 gimple gimple_build_try (gimple_seq, gimple_seq, enum gimple_try_flags);
807 gimple gimple_build_wce (gimple_seq);
808 gimple gimple_build_resx (int);
809 gimple gimple_build_eh_dispatch (int);
810 gimple gimple_build_switch_nlabels (unsigned, tree, tree);
811 gimple gimple_build_switch (unsigned, tree, tree, ...);
812 gimple gimple_build_switch_vec (tree, tree, VEC(tree,heap) *);
813 gimple gimple_build_omp_parallel (gimple_seq, tree, tree, tree);
814 gimple gimple_build_omp_task (gimple_seq, tree, tree, tree, tree, tree, tree);
815 gimple gimple_build_omp_for (gimple_seq, tree, size_t, gimple_seq);
816 gimple gimple_build_omp_critical (gimple_seq, tree);
817 gimple gimple_build_omp_section (gimple_seq);
818 gimple gimple_build_omp_continue (tree, tree);
819 gimple gimple_build_omp_master (gimple_seq);
820 gimple gimple_build_omp_return (bool);
821 gimple gimple_build_omp_ordered (gimple_seq);
822 gimple gimple_build_omp_sections (gimple_seq, tree);
823 gimple gimple_build_omp_sections_switch (void);
824 gimple gimple_build_omp_single (gimple_seq, tree);
825 gimple gimple_build_cdt (tree, tree);
826 gimple gimple_build_omp_atomic_load (tree, tree);
827 gimple gimple_build_omp_atomic_store (tree);
828 gimple gimple_build_predict (enum br_predictor, enum prediction);
829 enum gimple_statement_structure_enum gss_for_assign (enum tree_code);
830 void sort_case_labels (VEC(tree,heap) *);
831 void gimple_set_body (tree, gimple_seq);
832 gimple_seq gimple_body (tree);
833 bool gimple_has_body_p (tree);
834 gimple_seq gimple_seq_alloc (void);
835 void gimple_seq_free (gimple_seq);
836 void gimple_seq_add_seq (gimple_seq *, gimple_seq);
837 gimple_seq gimple_seq_copy (gimple_seq);
838 int gimple_call_flags (const_gimple);
839 bool gimple_assign_copy_p (gimple);
840 bool gimple_assign_ssa_name_copy_p (gimple);
841 bool gimple_assign_single_p (gimple);
842 bool gimple_assign_unary_nop_p (gimple);
843 void gimple_set_bb (gimple, struct basic_block_def *);
844 void gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *, tree);
845 void gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *, enum tree_code,
846 tree, tree);
847 tree gimple_get_lhs (const_gimple);
848 void gimple_set_lhs (gimple, tree);
849 void gimple_replace_lhs (gimple, tree);
850 gimple gimple_copy (gimple);
851 bool is_gimple_operand (const_tree);
852 void gimple_set_modified (gimple, bool);
853 void gimple_cond_get_ops_from_tree (tree, enum tree_code *, tree *, tree *);
854 gimple gimple_build_cond_from_tree (tree, tree, tree);
855 void gimple_cond_set_condition_from_tree (gimple, tree);
856 bool gimple_has_side_effects (const_gimple);
857 bool gimple_rhs_has_side_effects (const_gimple);
858 bool gimple_could_trap_p (gimple);
859 bool gimple_assign_rhs_could_trap_p (gimple);
860 void gimple_regimplify_operands (gimple, gimple_stmt_iterator *);
861 bool empty_body_p (gimple_seq);
862 unsigned get_gimple_rhs_num_ops (enum tree_code);
863 #define gimple_alloc(c, n) gimple_alloc_stat (c, n MEM_STAT_INFO)
864 gimple gimple_alloc_stat (enum gimple_code, unsigned MEM_STAT_DECL);
865 const char *gimple_decl_printable_name (tree, int);
866 tree gimple_fold_obj_type_ref (tree, tree);
868 /* Returns true iff T is a valid GIMPLE statement. */
869 extern bool is_gimple_stmt (tree);
871 /* Returns true iff TYPE is a valid type for a scalar register variable. */
872 extern bool is_gimple_reg_type (tree);
873 /* Returns true iff T is a scalar register variable. */
874 extern bool is_gimple_reg (tree);
875 /* Returns true iff T is any sort of variable. */
876 extern bool is_gimple_variable (tree);
877 /* Returns true iff T is any sort of symbol. */
878 extern bool is_gimple_id (tree);
879 /* Returns true iff T is a variable or an INDIRECT_REF (of a variable). */
880 extern bool is_gimple_min_lval (tree);
881 /* Returns true iff T is something whose address can be taken. */
882 extern bool is_gimple_addressable (tree);
883 /* Returns true iff T is any valid GIMPLE lvalue. */
884 extern bool is_gimple_lvalue (tree);
886 /* Returns true iff T is a GIMPLE address. */
887 bool is_gimple_address (const_tree);
888 /* Returns true iff T is a GIMPLE invariant address. */
889 bool is_gimple_invariant_address (const_tree);
890 /* Returns true iff T is a GIMPLE invariant address at interprocedural
891 level. */
892 bool is_gimple_ip_invariant_address (const_tree);
893 /* Returns true iff T is a valid GIMPLE constant. */
894 bool is_gimple_constant (const_tree);
895 /* Returns true iff T is a GIMPLE restricted function invariant. */
896 extern bool is_gimple_min_invariant (const_tree);
897 /* Returns true iff T is a GIMPLE restricted interprecodural invariant. */
898 extern bool is_gimple_ip_invariant (const_tree);
899 /* Returns true iff T is a GIMPLE rvalue. */
900 extern bool is_gimple_val (tree);
901 /* Returns true iff T is a GIMPLE asm statement input. */
902 extern bool is_gimple_asm_val (tree);
903 /* Returns true iff T is a valid rhs for a MODIFY_EXPR where the LHS is a
904 GIMPLE temporary, a renamed user variable, or something else,
905 respectively. */
906 extern bool is_gimple_reg_rhs (tree);
907 extern bool is_gimple_mem_rhs (tree);
909 /* Returns true iff T is a valid if-statement condition. */
910 extern bool is_gimple_condexpr (tree);
912 /* Returns true iff T is a type conversion. */
913 extern bool is_gimple_cast (tree);
914 /* Returns true iff T is a variable that does not need to live in memory. */
915 extern bool is_gimple_non_addressable (tree t);
917 /* Returns true iff T is a valid call address expression. */
918 extern bool is_gimple_call_addr (tree);
919 /* If T makes a function call, returns the CALL_EXPR operand. */
920 extern tree get_call_expr_in (tree t);
922 extern void recalculate_side_effects (tree);
923 extern bool compare_field_offset (tree, tree);
924 extern tree gimple_register_type (tree);
925 extern void print_gimple_types_stats (void);
926 extern void free_gimple_type_tables (void);
927 extern tree gimple_unsigned_type (tree);
928 extern tree gimple_signed_type (tree);
929 extern alias_set_type gimple_get_alias_set (tree);
930 extern void count_uses_and_derefs (tree, gimple, unsigned *, unsigned *,
931 unsigned *);
932 extern bool walk_stmt_load_store_addr_ops (gimple, void *,
933 bool (*)(gimple, tree, void *),
934 bool (*)(gimple, tree, void *),
935 bool (*)(gimple, tree, void *));
936 extern bool walk_stmt_load_store_ops (gimple, void *,
937 bool (*)(gimple, tree, void *),
938 bool (*)(gimple, tree, void *));
939 extern bool gimple_ior_addresses_taken (bitmap, gimple);
941 /* In gimplify.c */
942 extern tree create_tmp_var_raw (tree, const char *);
943 extern tree create_tmp_var_name (const char *);
944 extern tree create_tmp_var (tree, const char *);
945 extern tree get_initialized_tmp_var (tree, gimple_seq *, gimple_seq *);
946 extern tree get_formal_tmp_var (tree, gimple_seq *);
947 extern void declare_vars (tree, gimple, bool);
948 extern void annotate_all_with_location (gimple_seq, location_t);
950 /* Validation of GIMPLE expressions. Note that these predicates only check
951 the basic form of the expression, they don't recurse to make sure that
952 underlying nodes are also of the right form. */
953 typedef bool (*gimple_predicate)(tree);
956 /* FIXME we should deduce this from the predicate. */
957 enum fallback {
958 fb_none = 0, /* Do not generate a temporary. */
960 fb_rvalue = 1, /* Generate an rvalue to hold the result of a
961 gimplified expression. */
963 fb_lvalue = 2, /* Generate an lvalue to hold the result of a
964 gimplified expression. */
966 fb_mayfail = 4, /* Gimplification may fail. Error issued
967 afterwards. */
968 fb_either= fb_rvalue | fb_lvalue
971 typedef int fallback_t;
973 enum gimplify_status {
974 GS_ERROR = -2, /* Something Bad Seen. */
975 GS_UNHANDLED = -1, /* A langhook result for "I dunno". */
976 GS_OK = 0, /* We did something, maybe more to do. */
977 GS_ALL_DONE = 1 /* The expression is fully gimplified. */
980 struct gimplify_ctx
982 struct gimplify_ctx *prev_context;
984 VEC(gimple,heap) *bind_expr_stack;
985 tree temps;
986 gimple_seq conditional_cleanups;
987 tree exit_label;
988 tree return_temp;
990 VEC(tree,heap) *case_labels;
991 /* The formal temporary table. Should this be persistent? */
992 htab_t temp_htab;
994 int conditions;
995 bool save_stack;
996 bool into_ssa;
997 bool allow_rhs_cond_expr;
1000 extern enum gimplify_status gimplify_expr (tree *, gimple_seq *, gimple_seq *,
1001 bool (*) (tree), fallback_t);
1002 extern void gimplify_type_sizes (tree, gimple_seq *);
1003 extern void gimplify_one_sizepos (tree *, gimple_seq *);
1004 extern bool gimplify_stmt (tree *, gimple_seq *);
1005 extern gimple gimplify_body (tree *, tree, bool);
1006 extern void push_gimplify_context (struct gimplify_ctx *);
1007 extern void pop_gimplify_context (gimple);
1008 extern void gimplify_and_add (tree, gimple_seq *);
1010 /* Miscellaneous helpers. */
1011 extern void gimple_add_tmp_var (tree);
1012 extern gimple gimple_current_bind_expr (void);
1013 extern VEC(gimple, heap) *gimple_bind_expr_stack (void);
1014 extern tree voidify_wrapper_expr (tree, tree);
1015 extern tree build_and_jump (tree *);
1016 extern tree alloc_stmt_list (void);
1017 extern void free_stmt_list (tree);
1018 extern tree force_labels_r (tree *, int *, void *);
1019 extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *,
1020 gimple_seq *);
1021 struct gimplify_omp_ctx;
1022 extern void omp_firstprivatize_variable (struct gimplify_omp_ctx *, tree);
1023 extern tree gimple_boolify (tree);
1024 extern gimple_predicate rhs_predicate_for (tree);
1025 extern tree canonicalize_cond_expr_cond (tree);
1027 /* In omp-low.c. */
1028 extern tree omp_reduction_init (tree, tree);
1030 /* In tree-nested.c. */
1031 extern void lower_nested_functions (tree);
1032 extern void insert_field_into_struct (tree, tree);
1034 /* In gimplify.c. */
1035 extern void gimplify_function_tree (tree);
1037 /* In cfgexpand.c. */
1038 extern tree gimple_assign_rhs_to_tree (gimple);
1040 /* In builtins.c */
1041 extern bool validate_gimple_arglist (const_gimple, ...);
1043 /* In tree-ssa.c */
1044 extern bool tree_ssa_useless_type_conversion (tree);
1045 extern tree tree_ssa_strip_useless_type_conversions (tree);
1046 extern bool useless_type_conversion_p (tree, tree);
1047 extern bool types_compatible_p (tree, tree);
1049 /* Return the code for GIMPLE statement G. */
1051 static inline enum gimple_code
1052 gimple_code (const_gimple g)
1054 return g->gsbase.code;
1058 /* Return the GSS code used by a GIMPLE code. */
1060 static inline enum gimple_statement_structure_enum
1061 gss_for_code (enum gimple_code code)
1063 #ifdef ENABLE_CHECKING
1064 gcc_assert ((unsigned int)code < LAST_AND_UNUSED_GIMPLE_CODE);
1065 #endif
1066 return gss_for_code_[code];
1070 /* Return which GSS code is used by GS. */
1072 static inline enum gimple_statement_structure_enum
1073 gimple_statement_structure (gimple gs)
1075 return gss_for_code (gimple_code (gs));
1079 /* Return true if statement G has sub-statements. This is only true for
1080 High GIMPLE statements. */
1082 static inline bool
1083 gimple_has_substatements (gimple g)
1085 switch (gimple_code (g))
1087 case GIMPLE_BIND:
1088 case GIMPLE_CATCH:
1089 case GIMPLE_EH_FILTER:
1090 case GIMPLE_TRY:
1091 case GIMPLE_OMP_FOR:
1092 case GIMPLE_OMP_MASTER:
1093 case GIMPLE_OMP_ORDERED:
1094 case GIMPLE_OMP_SECTION:
1095 case GIMPLE_OMP_PARALLEL:
1096 case GIMPLE_OMP_TASK:
1097 case GIMPLE_OMP_SECTIONS:
1098 case GIMPLE_OMP_SINGLE:
1099 case GIMPLE_OMP_CRITICAL:
1100 case GIMPLE_WITH_CLEANUP_EXPR:
1101 return true;
1103 default:
1104 return false;
1109 /* Return the basic block holding statement G. */
1111 static inline struct basic_block_def *
1112 gimple_bb (const_gimple g)
1114 return g->gsbase.bb;
1118 /* Return the lexical scope block holding statement G. */
1120 static inline tree
1121 gimple_block (const_gimple g)
1123 return g->gsbase.block;
1127 /* Set BLOCK to be the lexical scope block holding statement G. */
1129 static inline void
1130 gimple_set_block (gimple g, tree block)
1132 g->gsbase.block = block;
1136 /* Return location information for statement G. */
1138 static inline location_t
1139 gimple_location (const_gimple g)
1141 return g->gsbase.location;
1144 /* Return pointer to location information for statement G. */
1146 static inline const location_t *
1147 gimple_location_ptr (const_gimple g)
1149 return &g->gsbase.location;
1153 /* Set location information for statement G. */
1155 static inline void
1156 gimple_set_location (gimple g, location_t location)
1158 g->gsbase.location = location;
1162 /* Return true if G contains location information. */
1164 static inline bool
1165 gimple_has_location (const_gimple g)
1167 return gimple_location (g) != UNKNOWN_LOCATION;
1171 /* Return the file name of the location of STMT. */
1173 static inline const char *
1174 gimple_filename (const_gimple stmt)
1176 return LOCATION_FILE (gimple_location (stmt));
1180 /* Return the line number of the location of STMT. */
1182 static inline int
1183 gimple_lineno (const_gimple stmt)
1185 return LOCATION_LINE (gimple_location (stmt));
1189 /* Determine whether SEQ is a singleton. */
1191 static inline bool
1192 gimple_seq_singleton_p (gimple_seq seq)
1194 return ((gimple_seq_first (seq) != NULL)
1195 && (gimple_seq_first (seq) == gimple_seq_last (seq)));
1198 /* Return true if no warnings should be emitted for statement STMT. */
1200 static inline bool
1201 gimple_no_warning_p (const_gimple stmt)
1203 return stmt->gsbase.no_warning;
1206 /* Set the no_warning flag of STMT to NO_WARNING. */
1208 static inline void
1209 gimple_set_no_warning (gimple stmt, bool no_warning)
1211 stmt->gsbase.no_warning = (unsigned) no_warning;
1214 /* Set the visited status on statement STMT to VISITED_P. */
1216 static inline void
1217 gimple_set_visited (gimple stmt, bool visited_p)
1219 stmt->gsbase.visited = (unsigned) visited_p;
1223 /* Return the visited status for statement STMT. */
1225 static inline bool
1226 gimple_visited_p (gimple stmt)
1228 return stmt->gsbase.visited;
1232 /* Set pass local flag PLF on statement STMT to VAL_P. */
1234 static inline void
1235 gimple_set_plf (gimple stmt, enum plf_mask plf, bool val_p)
1237 if (val_p)
1238 stmt->gsbase.plf |= (unsigned int) plf;
1239 else
1240 stmt->gsbase.plf &= ~((unsigned int) plf);
1244 /* Return the value of pass local flag PLF on statement STMT. */
1246 static inline unsigned int
1247 gimple_plf (gimple stmt, enum plf_mask plf)
1249 return stmt->gsbase.plf & ((unsigned int) plf);
1253 /* Set the UID of statement. */
1255 static inline void
1256 gimple_set_uid (gimple g, unsigned uid)
1258 g->gsbase.uid = uid;
1262 /* Return the UID of statement. */
1264 static inline unsigned
1265 gimple_uid (const_gimple g)
1267 return g->gsbase.uid;
1271 /* Return true if GIMPLE statement G has register or memory operands. */
1273 static inline bool
1274 gimple_has_ops (const_gimple g)
1276 return gimple_code (g) >= GIMPLE_COND && gimple_code (g) <= GIMPLE_RETURN;
1280 /* Return true if GIMPLE statement G has memory operands. */
1282 static inline bool
1283 gimple_has_mem_ops (const_gimple g)
1285 return gimple_code (g) >= GIMPLE_ASSIGN && gimple_code (g) <= GIMPLE_RETURN;
1289 /* Return the set of DEF operands for statement G. */
1291 static inline struct def_optype_d *
1292 gimple_def_ops (const_gimple g)
1294 if (!gimple_has_ops (g))
1295 return NULL;
1296 return g->gsops.opbase.def_ops;
1300 /* Set DEF to be the set of DEF operands for statement G. */
1302 static inline void
1303 gimple_set_def_ops (gimple g, struct def_optype_d *def)
1305 gcc_assert (gimple_has_ops (g));
1306 g->gsops.opbase.def_ops = def;
1310 /* Return the set of USE operands for statement G. */
1312 static inline struct use_optype_d *
1313 gimple_use_ops (const_gimple g)
1315 if (!gimple_has_ops (g))
1316 return NULL;
1317 return g->gsops.opbase.use_ops;
1321 /* Set USE to be the set of USE operands for statement G. */
1323 static inline void
1324 gimple_set_use_ops (gimple g, struct use_optype_d *use)
1326 gcc_assert (gimple_has_ops (g));
1327 g->gsops.opbase.use_ops = use;
1331 /* Return the set of VUSE operand for statement G. */
1333 static inline use_operand_p
1334 gimple_vuse_op (const_gimple g)
1336 struct use_optype_d *ops;
1337 if (!gimple_has_mem_ops (g))
1338 return NULL_USE_OPERAND_P;
1339 ops = g->gsops.opbase.use_ops;
1340 if (ops
1341 && USE_OP_PTR (ops)->use == &g->gsmembase.vuse)
1342 return USE_OP_PTR (ops);
1343 return NULL_USE_OPERAND_P;
1346 /* Return the set of VDEF operand for statement G. */
1348 static inline def_operand_p
1349 gimple_vdef_op (const_gimple g)
1351 struct def_optype_d *ops;
1352 if (!gimple_has_mem_ops (g))
1353 return NULL_DEF_OPERAND_P;
1354 ops = g->gsops.opbase.def_ops;
1355 if (ops
1356 && DEF_OP_PTR (ops) == &g->gsmembase.vdef)
1357 return DEF_OP_PTR (ops);
1358 return NULL_DEF_OPERAND_P;
1362 /* Return the single VUSE operand of the statement G. */
1364 static inline tree
1365 gimple_vuse (const_gimple g)
1367 if (!gimple_has_mem_ops (g))
1368 return NULL_TREE;
1369 return g->gsmembase.vuse;
1372 /* Return the single VDEF operand of the statement G. */
1374 static inline tree
1375 gimple_vdef (const_gimple g)
1377 if (!gimple_has_mem_ops (g))
1378 return NULL_TREE;
1379 return g->gsmembase.vdef;
1382 /* Return the single VUSE operand of the statement G. */
1384 static inline tree *
1385 gimple_vuse_ptr (gimple g)
1387 if (!gimple_has_mem_ops (g))
1388 return NULL;
1389 return &g->gsmembase.vuse;
1392 /* Return the single VDEF operand of the statement G. */
1394 static inline tree *
1395 gimple_vdef_ptr (gimple g)
1397 if (!gimple_has_mem_ops (g))
1398 return NULL;
1399 return &g->gsmembase.vdef;
1402 /* Set the single VUSE operand of the statement G. */
1404 static inline void
1405 gimple_set_vuse (gimple g, tree vuse)
1407 gcc_assert (gimple_has_mem_ops (g));
1408 g->gsmembase.vuse = vuse;
1411 /* Set the single VDEF operand of the statement G. */
1413 static inline void
1414 gimple_set_vdef (gimple g, tree vdef)
1416 gcc_assert (gimple_has_mem_ops (g));
1417 g->gsmembase.vdef = vdef;
1421 /* Return true if statement G has operands and the modified field has
1422 been set. */
1424 static inline bool
1425 gimple_modified_p (const_gimple g)
1427 return (gimple_has_ops (g)) ? (bool) g->gsbase.modified : false;
1431 /* Return the tree code for the expression computed by STMT. This is
1432 only valid for GIMPLE_COND, GIMPLE_CALL and GIMPLE_ASSIGN. For
1433 GIMPLE_CALL, return CALL_EXPR as the expression code for
1434 consistency. This is useful when the caller needs to deal with the
1435 three kinds of computation that GIMPLE supports. */
1437 static inline enum tree_code
1438 gimple_expr_code (const_gimple stmt)
1440 enum gimple_code code = gimple_code (stmt);
1441 if (code == GIMPLE_ASSIGN || code == GIMPLE_COND)
1442 return (enum tree_code) stmt->gsbase.subcode;
1443 else if (code == GIMPLE_CALL)
1444 return CALL_EXPR;
1445 else
1446 gcc_unreachable ();
1450 /* Mark statement S as modified, and update it. */
1452 static inline void
1453 update_stmt (gimple s)
1455 if (gimple_has_ops (s))
1457 gimple_set_modified (s, true);
1458 update_stmt_operands (s);
1462 /* Update statement S if it has been optimized. */
1464 static inline void
1465 update_stmt_if_modified (gimple s)
1467 if (gimple_modified_p (s))
1468 update_stmt_operands (s);
1471 /* Return true if statement STMT contains volatile operands. */
1473 static inline bool
1474 gimple_has_volatile_ops (const_gimple stmt)
1476 if (gimple_has_mem_ops (stmt))
1477 return stmt->gsbase.has_volatile_ops;
1478 else
1479 return false;
1483 /* Set the HAS_VOLATILE_OPS flag to VOLATILEP. */
1485 static inline void
1486 gimple_set_has_volatile_ops (gimple stmt, bool volatilep)
1488 if (gimple_has_mem_ops (stmt))
1489 stmt->gsbase.has_volatile_ops = (unsigned) volatilep;
1493 /* Return true if statement STMT may access memory. */
1495 static inline bool
1496 gimple_references_memory_p (gimple stmt)
1498 return gimple_has_mem_ops (stmt) && gimple_vuse (stmt);
1502 /* Return the subcode for OMP statement S. */
1504 static inline unsigned
1505 gimple_omp_subcode (const_gimple s)
1507 gcc_assert (gimple_code (s) >= GIMPLE_OMP_ATOMIC_LOAD
1508 && gimple_code (s) <= GIMPLE_OMP_SINGLE);
1509 return s->gsbase.subcode;
1512 /* Set the subcode for OMP statement S to SUBCODE. */
1514 static inline void
1515 gimple_omp_set_subcode (gimple s, unsigned int subcode)
1517 /* We only have 16 bits for the subcode. Assert that we are not
1518 overflowing it. */
1519 gcc_assert (subcode < (1 << 16));
1520 s->gsbase.subcode = subcode;
1523 /* Set the nowait flag on OMP_RETURN statement S. */
1525 static inline void
1526 gimple_omp_return_set_nowait (gimple s)
1528 GIMPLE_CHECK (s, GIMPLE_OMP_RETURN);
1529 s->gsbase.subcode |= GF_OMP_RETURN_NOWAIT;
1533 /* Return true if OMP return statement G has the GF_OMP_RETURN_NOWAIT
1534 flag set. */
1536 static inline bool
1537 gimple_omp_return_nowait_p (const_gimple g)
1539 GIMPLE_CHECK (g, GIMPLE_OMP_RETURN);
1540 return (gimple_omp_subcode (g) & GF_OMP_RETURN_NOWAIT) != 0;
1544 /* Return true if OMP section statement G has the GF_OMP_SECTION_LAST
1545 flag set. */
1547 static inline bool
1548 gimple_omp_section_last_p (const_gimple g)
1550 GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
1551 return (gimple_omp_subcode (g) & GF_OMP_SECTION_LAST) != 0;
1555 /* Set the GF_OMP_SECTION_LAST flag on G. */
1557 static inline void
1558 gimple_omp_section_set_last (gimple g)
1560 GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
1561 g->gsbase.subcode |= GF_OMP_SECTION_LAST;
1565 /* Return true if OMP parallel statement G has the
1566 GF_OMP_PARALLEL_COMBINED flag set. */
1568 static inline bool
1569 gimple_omp_parallel_combined_p (const_gimple g)
1571 GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
1572 return (gimple_omp_subcode (g) & GF_OMP_PARALLEL_COMBINED) != 0;
1576 /* Set the GF_OMP_PARALLEL_COMBINED field in G depending on the boolean
1577 value of COMBINED_P. */
1579 static inline void
1580 gimple_omp_parallel_set_combined_p (gimple g, bool combined_p)
1582 GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
1583 if (combined_p)
1584 g->gsbase.subcode |= GF_OMP_PARALLEL_COMBINED;
1585 else
1586 g->gsbase.subcode &= ~GF_OMP_PARALLEL_COMBINED;
1590 /* Return the number of operands for statement GS. */
1592 static inline unsigned
1593 gimple_num_ops (const_gimple gs)
1595 return gs->gsbase.num_ops;
1599 /* Set the number of operands for statement GS. */
1601 static inline void
1602 gimple_set_num_ops (gimple gs, unsigned num_ops)
1604 gs->gsbase.num_ops = num_ops;
1608 /* Return the array of operands for statement GS. */
1610 static inline tree *
1611 gimple_ops (gimple gs)
1613 size_t off;
1615 /* All the tuples have their operand vector at the very bottom
1616 of the structure. Note that those structures that do not
1617 have an operand vector have a zero offset. */
1618 off = gimple_ops_offset_[gimple_statement_structure (gs)];
1619 gcc_assert (off != 0);
1621 return (tree *) ((char *) gs + off);
1625 /* Return operand I for statement GS. */
1627 static inline tree
1628 gimple_op (const_gimple gs, unsigned i)
1630 if (gimple_has_ops (gs))
1632 #ifdef ENABLE_CHECKING
1633 gcc_assert (i < gimple_num_ops (gs));
1634 #endif
1635 return gimple_ops (CONST_CAST_GIMPLE (gs))[i];
1637 else
1638 return NULL_TREE;
1641 /* Return a pointer to operand I for statement GS. */
1643 static inline tree *
1644 gimple_op_ptr (const_gimple gs, unsigned i)
1646 if (gimple_has_ops (gs))
1648 #ifdef ENABLE_CHECKING
1649 gcc_assert (i < gimple_num_ops (gs));
1650 #endif
1651 return gimple_ops (CONST_CAST_GIMPLE (gs)) + i;
1653 else
1654 return NULL;
1657 /* Set operand I of statement GS to OP. */
1659 static inline void
1660 gimple_set_op (gimple gs, unsigned i, tree op)
1662 gcc_assert (gimple_has_ops (gs) && i < gimple_num_ops (gs));
1664 /* Note. It may be tempting to assert that OP matches
1665 is_gimple_operand, but that would be wrong. Different tuples
1666 accept slightly different sets of tree operands. Each caller
1667 should perform its own validation. */
1668 gimple_ops (gs)[i] = op;
1671 /* Return true if GS is a GIMPLE_ASSIGN. */
1673 static inline bool
1674 is_gimple_assign (const_gimple gs)
1676 return gimple_code (gs) == GIMPLE_ASSIGN;
1679 /* Determine if expression CODE is one of the valid expressions that can
1680 be used on the RHS of GIMPLE assignments. */
1682 static inline enum gimple_rhs_class
1683 get_gimple_rhs_class (enum tree_code code)
1685 return (enum gimple_rhs_class) gimple_rhs_class_table[(int) code];
1688 /* Return the LHS of assignment statement GS. */
1690 static inline tree
1691 gimple_assign_lhs (const_gimple gs)
1693 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1694 return gimple_op (gs, 0);
1698 /* Return a pointer to the LHS of assignment statement GS. */
1700 static inline tree *
1701 gimple_assign_lhs_ptr (const_gimple gs)
1703 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1704 return gimple_op_ptr (gs, 0);
1708 /* Set LHS to be the LHS operand of assignment statement GS. */
1710 static inline void
1711 gimple_assign_set_lhs (gimple gs, tree lhs)
1713 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1714 gimple_set_op (gs, 0, lhs);
1716 if (lhs && TREE_CODE (lhs) == SSA_NAME)
1717 SSA_NAME_DEF_STMT (lhs) = gs;
1721 /* Return the first operand on the RHS of assignment statement GS. */
1723 static inline tree
1724 gimple_assign_rhs1 (const_gimple gs)
1726 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1727 return gimple_op (gs, 1);
1731 /* Return a pointer to the first operand on the RHS of assignment
1732 statement GS. */
1734 static inline tree *
1735 gimple_assign_rhs1_ptr (const_gimple gs)
1737 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1738 return gimple_op_ptr (gs, 1);
1741 /* Set RHS to be the first operand on the RHS of assignment statement GS. */
1743 static inline void
1744 gimple_assign_set_rhs1 (gimple gs, tree rhs)
1746 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1748 gimple_set_op (gs, 1, rhs);
1752 /* Return the second operand on the RHS of assignment statement GS.
1753 If GS does not have two operands, NULL is returned instead. */
1755 static inline tree
1756 gimple_assign_rhs2 (const_gimple gs)
1758 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1760 if (gimple_num_ops (gs) >= 3)
1761 return gimple_op (gs, 2);
1762 else
1763 return NULL_TREE;
1767 /* Return a pointer to the second operand on the RHS of assignment
1768 statement GS. */
1770 static inline tree *
1771 gimple_assign_rhs2_ptr (const_gimple gs)
1773 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1774 return gimple_op_ptr (gs, 2);
1778 /* Set RHS to be the second operand on the RHS of assignment statement GS. */
1780 static inline void
1781 gimple_assign_set_rhs2 (gimple gs, tree rhs)
1783 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1785 gimple_set_op (gs, 2, rhs);
1788 /* Returns true if GS is a nontemporal move. */
1790 static inline bool
1791 gimple_assign_nontemporal_move_p (const_gimple gs)
1793 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1794 return gs->gsbase.nontemporal_move;
1797 /* Sets nontemporal move flag of GS to NONTEMPORAL. */
1799 static inline void
1800 gimple_assign_set_nontemporal_move (gimple gs, bool nontemporal)
1802 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1803 gs->gsbase.nontemporal_move = nontemporal;
1807 /* Return the code of the expression computed on the rhs of assignment
1808 statement GS. In case that the RHS is a single object, returns the
1809 tree code of the object. */
1811 static inline enum tree_code
1812 gimple_assign_rhs_code (const_gimple gs)
1814 enum tree_code code;
1815 GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1817 code = gimple_expr_code (gs);
1818 if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
1819 code = TREE_CODE (gimple_assign_rhs1 (gs));
1821 return code;
1825 /* Set CODE to be the code for the expression computed on the RHS of
1826 assignment S. */
1828 static inline void
1829 gimple_assign_set_rhs_code (gimple s, enum tree_code code)
1831 GIMPLE_CHECK (s, GIMPLE_ASSIGN);
1832 s->gsbase.subcode = code;
1836 /* Return the gimple rhs class of the code of the expression computed on
1837 the rhs of assignment statement GS.
1838 This will never return GIMPLE_INVALID_RHS. */
1840 static inline enum gimple_rhs_class
1841 gimple_assign_rhs_class (const_gimple gs)
1843 return get_gimple_rhs_class (gimple_assign_rhs_code (gs));
1847 /* Return true if S is a type-cast assignment. */
1849 static inline bool
1850 gimple_assign_cast_p (gimple s)
1852 if (is_gimple_assign (s))
1854 enum tree_code sc = gimple_assign_rhs_code (s);
1855 return CONVERT_EXPR_CODE_P (sc)
1856 || sc == VIEW_CONVERT_EXPR
1857 || sc == FIX_TRUNC_EXPR;
1860 return false;
1864 /* Return true if GS is a GIMPLE_CALL. */
1866 static inline bool
1867 is_gimple_call (const_gimple gs)
1869 return gimple_code (gs) == GIMPLE_CALL;
1872 /* Return the LHS of call statement GS. */
1874 static inline tree
1875 gimple_call_lhs (const_gimple gs)
1877 GIMPLE_CHECK (gs, GIMPLE_CALL);
1878 return gimple_op (gs, 0);
1882 /* Return a pointer to the LHS of call statement GS. */
1884 static inline tree *
1885 gimple_call_lhs_ptr (const_gimple gs)
1887 GIMPLE_CHECK (gs, GIMPLE_CALL);
1888 return gimple_op_ptr (gs, 0);
1892 /* Set LHS to be the LHS operand of call statement GS. */
1894 static inline void
1895 gimple_call_set_lhs (gimple gs, tree lhs)
1897 GIMPLE_CHECK (gs, GIMPLE_CALL);
1898 gimple_set_op (gs, 0, lhs);
1899 if (lhs && TREE_CODE (lhs) == SSA_NAME)
1900 SSA_NAME_DEF_STMT (lhs) = gs;
1904 /* Return the tree node representing the function called by call
1905 statement GS. */
1907 static inline tree
1908 gimple_call_fn (const_gimple gs)
1910 GIMPLE_CHECK (gs, GIMPLE_CALL);
1911 return gimple_op (gs, 1);
1915 /* Return a pointer to the tree node representing the function called by call
1916 statement GS. */
1918 static inline tree *
1919 gimple_call_fn_ptr (const_gimple gs)
1921 GIMPLE_CHECK (gs, GIMPLE_CALL);
1922 return gimple_op_ptr (gs, 1);
1926 /* Set FN to be the function called by call statement GS. */
1928 static inline void
1929 gimple_call_set_fn (gimple gs, tree fn)
1931 GIMPLE_CHECK (gs, GIMPLE_CALL);
1932 gimple_set_op (gs, 1, fn);
1936 /* Set FNDECL to be the function called by call statement GS. */
1938 static inline void
1939 gimple_call_set_fndecl (gimple gs, tree decl)
1941 GIMPLE_CHECK (gs, GIMPLE_CALL);
1942 gimple_set_op (gs, 1, build_fold_addr_expr_loc (gimple_location (gs), decl));
1946 /* If a given GIMPLE_CALL's callee is a FUNCTION_DECL, return it.
1947 Otherwise return NULL. This function is analogous to
1948 get_callee_fndecl in tree land. */
1950 static inline tree
1951 gimple_call_fndecl (const_gimple gs)
1953 tree addr = gimple_call_fn (gs);
1954 if (TREE_CODE (addr) == ADDR_EXPR)
1955 return TREE_OPERAND (addr, 0);
1956 return NULL_TREE;
1960 /* Return the type returned by call statement GS. */
1962 static inline tree
1963 gimple_call_return_type (const_gimple gs)
1965 tree fn = gimple_call_fn (gs);
1966 tree type = TREE_TYPE (fn);
1968 /* See through the pointer. */
1969 type = TREE_TYPE (type);
1971 /* The type returned by a FUNCTION_DECL is the type of its
1972 function type. */
1973 return TREE_TYPE (type);
1977 /* Return the static chain for call statement GS. */
1979 static inline tree
1980 gimple_call_chain (const_gimple gs)
1982 GIMPLE_CHECK (gs, GIMPLE_CALL);
1983 return gimple_op (gs, 2);
1987 /* Return a pointer to the static chain for call statement GS. */
1989 static inline tree *
1990 gimple_call_chain_ptr (const_gimple gs)
1992 GIMPLE_CHECK (gs, GIMPLE_CALL);
1993 return gimple_op_ptr (gs, 2);
1996 /* Set CHAIN to be the static chain for call statement GS. */
1998 static inline void
1999 gimple_call_set_chain (gimple gs, tree chain)
2001 GIMPLE_CHECK (gs, GIMPLE_CALL);
2003 gimple_set_op (gs, 2, chain);
2007 /* Return the number of arguments used by call statement GS. */
2009 static inline unsigned
2010 gimple_call_num_args (const_gimple gs)
2012 unsigned num_ops;
2013 GIMPLE_CHECK (gs, GIMPLE_CALL);
2014 num_ops = gimple_num_ops (gs);
2015 return num_ops - 3;
2019 /* Return the argument at position INDEX for call statement GS. */
2021 static inline tree
2022 gimple_call_arg (const_gimple gs, unsigned index)
2024 GIMPLE_CHECK (gs, GIMPLE_CALL);
2025 return gimple_op (gs, index + 3);
2029 /* Return a pointer to the argument at position INDEX for call
2030 statement GS. */
2032 static inline tree *
2033 gimple_call_arg_ptr (const_gimple gs, unsigned index)
2035 GIMPLE_CHECK (gs, GIMPLE_CALL);
2036 return gimple_op_ptr (gs, index + 3);
2040 /* Set ARG to be the argument at position INDEX for call statement GS. */
2042 static inline void
2043 gimple_call_set_arg (gimple gs, unsigned index, tree arg)
2045 GIMPLE_CHECK (gs, GIMPLE_CALL);
2046 gimple_set_op (gs, index + 3, arg);
2050 /* If TAIL_P is true, mark call statement S as being a tail call
2051 (i.e., a call just before the exit of a function). These calls are
2052 candidate for tail call optimization. */
2054 static inline void
2055 gimple_call_set_tail (gimple s, bool tail_p)
2057 GIMPLE_CHECK (s, GIMPLE_CALL);
2058 if (tail_p)
2059 s->gsbase.subcode |= GF_CALL_TAILCALL;
2060 else
2061 s->gsbase.subcode &= ~GF_CALL_TAILCALL;
2065 /* Return true if GIMPLE_CALL S is marked as a tail call. */
2067 static inline bool
2068 gimple_call_tail_p (gimple s)
2070 GIMPLE_CHECK (s, GIMPLE_CALL);
2071 return (s->gsbase.subcode & GF_CALL_TAILCALL) != 0;
2075 /* Set the inlinable status of GIMPLE_CALL S to INLINABLE_P. */
2077 static inline void
2078 gimple_call_set_cannot_inline (gimple s, bool inlinable_p)
2080 GIMPLE_CHECK (s, GIMPLE_CALL);
2081 if (inlinable_p)
2082 s->gsbase.subcode |= GF_CALL_CANNOT_INLINE;
2083 else
2084 s->gsbase.subcode &= ~GF_CALL_CANNOT_INLINE;
2088 /* Return true if GIMPLE_CALL S cannot be inlined. */
2090 static inline bool
2091 gimple_call_cannot_inline_p (gimple s)
2093 GIMPLE_CHECK (s, GIMPLE_CALL);
2094 return (s->gsbase.subcode & GF_CALL_CANNOT_INLINE) != 0;
2098 /* If RETURN_SLOT_OPT_P is true mark GIMPLE_CALL S as valid for return
2099 slot optimization. This transformation uses the target of the call
2100 expansion as the return slot for calls that return in memory. */
2102 static inline void
2103 gimple_call_set_return_slot_opt (gimple s, bool return_slot_opt_p)
2105 GIMPLE_CHECK (s, GIMPLE_CALL);
2106 if (return_slot_opt_p)
2107 s->gsbase.subcode |= GF_CALL_RETURN_SLOT_OPT;
2108 else
2109 s->gsbase.subcode &= ~GF_CALL_RETURN_SLOT_OPT;
2113 /* Return true if S is marked for return slot optimization. */
2115 static inline bool
2116 gimple_call_return_slot_opt_p (gimple s)
2118 GIMPLE_CHECK (s, GIMPLE_CALL);
2119 return (s->gsbase.subcode & GF_CALL_RETURN_SLOT_OPT) != 0;
2123 /* If FROM_THUNK_P is true, mark GIMPLE_CALL S as being the jump from a
2124 thunk to the thunked-to function. */
2126 static inline void
2127 gimple_call_set_from_thunk (gimple s, bool from_thunk_p)
2129 GIMPLE_CHECK (s, GIMPLE_CALL);
2130 if (from_thunk_p)
2131 s->gsbase.subcode |= GF_CALL_FROM_THUNK;
2132 else
2133 s->gsbase.subcode &= ~GF_CALL_FROM_THUNK;
2137 /* Return true if GIMPLE_CALL S is a jump from a thunk. */
2139 static inline bool
2140 gimple_call_from_thunk_p (gimple s)
2142 GIMPLE_CHECK (s, GIMPLE_CALL);
2143 return (s->gsbase.subcode & GF_CALL_FROM_THUNK) != 0;
2147 /* If PASS_ARG_PACK_P is true, GIMPLE_CALL S is a stdarg call that needs the
2148 argument pack in its argument list. */
2150 static inline void
2151 gimple_call_set_va_arg_pack (gimple s, bool pass_arg_pack_p)
2153 GIMPLE_CHECK (s, GIMPLE_CALL);
2154 if (pass_arg_pack_p)
2155 s->gsbase.subcode |= GF_CALL_VA_ARG_PACK;
2156 else
2157 s->gsbase.subcode &= ~GF_CALL_VA_ARG_PACK;
2161 /* Return true if GIMPLE_CALL S is a stdarg call that needs the
2162 argument pack in its argument list. */
2164 static inline bool
2165 gimple_call_va_arg_pack_p (gimple s)
2167 GIMPLE_CHECK (s, GIMPLE_CALL);
2168 return (s->gsbase.subcode & GF_CALL_VA_ARG_PACK) != 0;
2172 /* Return true if S is a noreturn call. */
2174 static inline bool
2175 gimple_call_noreturn_p (gimple s)
2177 GIMPLE_CHECK (s, GIMPLE_CALL);
2178 return (gimple_call_flags (s) & ECF_NORETURN) != 0;
2182 /* Return true if S is a nothrow call. */
2184 static inline bool
2185 gimple_call_nothrow_p (gimple s)
2187 GIMPLE_CHECK (s, GIMPLE_CALL);
2188 return (gimple_call_flags (s) & ECF_NOTHROW) != 0;
2192 /* Copy all the GF_CALL_* flags from ORIG_CALL to DEST_CALL. */
2194 static inline void
2195 gimple_call_copy_flags (gimple dest_call, gimple orig_call)
2197 GIMPLE_CHECK (dest_call, GIMPLE_CALL);
2198 GIMPLE_CHECK (orig_call, GIMPLE_CALL);
2199 dest_call->gsbase.subcode = orig_call->gsbase.subcode;
2203 /* Returns true if this is a GIMPLE_ASSIGN or a GIMPLE_CALL with a
2204 non-NULL lhs. */
2206 static inline bool
2207 gimple_has_lhs (gimple stmt)
2209 return (is_gimple_assign (stmt)
2210 || (is_gimple_call (stmt)
2211 && gimple_call_lhs (stmt) != NULL_TREE));
2215 /* Return the code of the predicate computed by conditional statement GS. */
2217 static inline enum tree_code
2218 gimple_cond_code (const_gimple gs)
2220 GIMPLE_CHECK (gs, GIMPLE_COND);
2221 return (enum tree_code) gs->gsbase.subcode;
2225 /* Set CODE to be the predicate code for the conditional statement GS. */
2227 static inline void
2228 gimple_cond_set_code (gimple gs, enum tree_code code)
2230 GIMPLE_CHECK (gs, GIMPLE_COND);
2231 gs->gsbase.subcode = code;
2235 /* Return the LHS of the predicate computed by conditional statement GS. */
2237 static inline tree
2238 gimple_cond_lhs (const_gimple gs)
2240 GIMPLE_CHECK (gs, GIMPLE_COND);
2241 return gimple_op (gs, 0);
2244 /* Return the pointer to the LHS of the predicate computed by conditional
2245 statement GS. */
2247 static inline tree *
2248 gimple_cond_lhs_ptr (const_gimple gs)
2250 GIMPLE_CHECK (gs, GIMPLE_COND);
2251 return gimple_op_ptr (gs, 0);
2254 /* Set LHS to be the LHS operand of the predicate computed by
2255 conditional statement GS. */
2257 static inline void
2258 gimple_cond_set_lhs (gimple gs, tree lhs)
2260 GIMPLE_CHECK (gs, GIMPLE_COND);
2261 gimple_set_op (gs, 0, lhs);
2265 /* Return the RHS operand of the predicate computed by conditional GS. */
2267 static inline tree
2268 gimple_cond_rhs (const_gimple gs)
2270 GIMPLE_CHECK (gs, GIMPLE_COND);
2271 return gimple_op (gs, 1);
2274 /* Return the pointer to the RHS operand of the predicate computed by
2275 conditional GS. */
2277 static inline tree *
2278 gimple_cond_rhs_ptr (const_gimple gs)
2280 GIMPLE_CHECK (gs, GIMPLE_COND);
2281 return gimple_op_ptr (gs, 1);
2285 /* Set RHS to be the RHS operand of the predicate computed by
2286 conditional statement GS. */
2288 static inline void
2289 gimple_cond_set_rhs (gimple gs, tree rhs)
2291 GIMPLE_CHECK (gs, GIMPLE_COND);
2292 gimple_set_op (gs, 1, rhs);
2296 /* Return the label used by conditional statement GS when its
2297 predicate evaluates to true. */
2299 static inline tree
2300 gimple_cond_true_label (const_gimple gs)
2302 GIMPLE_CHECK (gs, GIMPLE_COND);
2303 return gimple_op (gs, 2);
2307 /* Set LABEL to be the label used by conditional statement GS when its
2308 predicate evaluates to true. */
2310 static inline void
2311 gimple_cond_set_true_label (gimple gs, tree label)
2313 GIMPLE_CHECK (gs, GIMPLE_COND);
2314 gimple_set_op (gs, 2, label);
2318 /* Set LABEL to be the label used by conditional statement GS when its
2319 predicate evaluates to false. */
2321 static inline void
2322 gimple_cond_set_false_label (gimple gs, tree label)
2324 GIMPLE_CHECK (gs, GIMPLE_COND);
2325 gimple_set_op (gs, 3, label);
2329 /* Return the label used by conditional statement GS when its
2330 predicate evaluates to false. */
2332 static inline tree
2333 gimple_cond_false_label (const_gimple gs)
2335 GIMPLE_CHECK (gs, GIMPLE_COND);
2336 return gimple_op (gs, 3);
2340 /* Set the conditional COND_STMT to be of the form 'if (1 == 0)'. */
2342 static inline void
2343 gimple_cond_make_false (gimple gs)
2345 gimple_cond_set_lhs (gs, boolean_true_node);
2346 gimple_cond_set_rhs (gs, boolean_false_node);
2347 gs->gsbase.subcode = EQ_EXPR;
2351 /* Set the conditional COND_STMT to be of the form 'if (1 == 1)'. */
2353 static inline void
2354 gimple_cond_make_true (gimple gs)
2356 gimple_cond_set_lhs (gs, boolean_true_node);
2357 gimple_cond_set_rhs (gs, boolean_true_node);
2358 gs->gsbase.subcode = EQ_EXPR;
2361 /* Check if conditional statemente GS is of the form 'if (1 == 1)',
2362 'if (0 == 0)', 'if (1 != 0)' or 'if (0 != 1)' */
2364 static inline bool
2365 gimple_cond_true_p (const_gimple gs)
2367 tree lhs = gimple_cond_lhs (gs);
2368 tree rhs = gimple_cond_rhs (gs);
2369 enum tree_code code = gimple_cond_code (gs);
2371 if (lhs != boolean_true_node && lhs != boolean_false_node)
2372 return false;
2374 if (rhs != boolean_true_node && rhs != boolean_false_node)
2375 return false;
2377 if (code == NE_EXPR && lhs != rhs)
2378 return true;
2380 if (code == EQ_EXPR && lhs == rhs)
2381 return true;
2383 return false;
2386 /* Check if conditional statement GS is of the form 'if (1 != 1)',
2387 'if (0 != 0)', 'if (1 == 0)' or 'if (0 == 1)' */
2389 static inline bool
2390 gimple_cond_false_p (const_gimple gs)
2392 tree lhs = gimple_cond_lhs (gs);
2393 tree rhs = gimple_cond_rhs (gs);
2394 enum tree_code code = gimple_cond_code (gs);
2396 if (lhs != boolean_true_node && lhs != boolean_false_node)
2397 return false;
2399 if (rhs != boolean_true_node && rhs != boolean_false_node)
2400 return false;
2402 if (code == NE_EXPR && lhs == rhs)
2403 return true;
2405 if (code == EQ_EXPR && lhs != rhs)
2406 return true;
2408 return false;
2411 /* Check if conditional statement GS is of the form 'if (var != 0)' or
2412 'if (var == 1)' */
2414 static inline bool
2415 gimple_cond_single_var_p (gimple gs)
2417 if (gimple_cond_code (gs) == NE_EXPR
2418 && gimple_cond_rhs (gs) == boolean_false_node)
2419 return true;
2421 if (gimple_cond_code (gs) == EQ_EXPR
2422 && gimple_cond_rhs (gs) == boolean_true_node)
2423 return true;
2425 return false;
2428 /* Set the code, LHS and RHS of GIMPLE_COND STMT from CODE, LHS and RHS. */
2430 static inline void
2431 gimple_cond_set_condition (gimple stmt, enum tree_code code, tree lhs, tree rhs)
2433 gimple_cond_set_code (stmt, code);
2434 gimple_cond_set_lhs (stmt, lhs);
2435 gimple_cond_set_rhs (stmt, rhs);
2438 /* Return the LABEL_DECL node used by GIMPLE_LABEL statement GS. */
2440 static inline tree
2441 gimple_label_label (const_gimple gs)
2443 GIMPLE_CHECK (gs, GIMPLE_LABEL);
2444 return gimple_op (gs, 0);
2448 /* Set LABEL to be the LABEL_DECL node used by GIMPLE_LABEL statement
2449 GS. */
2451 static inline void
2452 gimple_label_set_label (gimple gs, tree label)
2454 GIMPLE_CHECK (gs, GIMPLE_LABEL);
2455 gimple_set_op (gs, 0, label);
2459 /* Return the destination of the unconditional jump GS. */
2461 static inline tree
2462 gimple_goto_dest (const_gimple gs)
2464 GIMPLE_CHECK (gs, GIMPLE_GOTO);
2465 return gimple_op (gs, 0);
2469 /* Set DEST to be the destination of the unconditonal jump GS. */
2471 static inline void
2472 gimple_goto_set_dest (gimple gs, tree dest)
2474 GIMPLE_CHECK (gs, GIMPLE_GOTO);
2475 gimple_set_op (gs, 0, dest);
2479 /* Return the variables declared in the GIMPLE_BIND statement GS. */
2481 static inline tree
2482 gimple_bind_vars (const_gimple gs)
2484 GIMPLE_CHECK (gs, GIMPLE_BIND);
2485 return gs->gimple_bind.vars;
2489 /* Set VARS to be the set of variables declared in the GIMPLE_BIND
2490 statement GS. */
2492 static inline void
2493 gimple_bind_set_vars (gimple gs, tree vars)
2495 GIMPLE_CHECK (gs, GIMPLE_BIND);
2496 gs->gimple_bind.vars = vars;
2500 /* Append VARS to the set of variables declared in the GIMPLE_BIND
2501 statement GS. */
2503 static inline void
2504 gimple_bind_append_vars (gimple gs, tree vars)
2506 GIMPLE_CHECK (gs, GIMPLE_BIND);
2507 gs->gimple_bind.vars = chainon (gs->gimple_bind.vars, vars);
2511 /* Return the GIMPLE sequence contained in the GIMPLE_BIND statement GS. */
2513 static inline gimple_seq
2514 gimple_bind_body (gimple gs)
2516 GIMPLE_CHECK (gs, GIMPLE_BIND);
2517 return gs->gimple_bind.body;
2521 /* Set SEQ to be the GIMPLE sequence contained in the GIMPLE_BIND
2522 statement GS. */
2524 static inline void
2525 gimple_bind_set_body (gimple gs, gimple_seq seq)
2527 GIMPLE_CHECK (gs, GIMPLE_BIND);
2528 gs->gimple_bind.body = seq;
2532 /* Append a statement to the end of a GIMPLE_BIND's body. */
2534 static inline void
2535 gimple_bind_add_stmt (gimple gs, gimple stmt)
2537 GIMPLE_CHECK (gs, GIMPLE_BIND);
2538 gimple_seq_add_stmt (&gs->gimple_bind.body, stmt);
2542 /* Append a sequence of statements to the end of a GIMPLE_BIND's body. */
2544 static inline void
2545 gimple_bind_add_seq (gimple gs, gimple_seq seq)
2547 GIMPLE_CHECK (gs, GIMPLE_BIND);
2548 gimple_seq_add_seq (&gs->gimple_bind.body, seq);
2552 /* Return the TREE_BLOCK node associated with GIMPLE_BIND statement
2553 GS. This is analogous to the BIND_EXPR_BLOCK field in trees. */
2555 static inline tree
2556 gimple_bind_block (const_gimple gs)
2558 GIMPLE_CHECK (gs, GIMPLE_BIND);
2559 return gs->gimple_bind.block;
2563 /* Set BLOCK to be the TREE_BLOCK node associated with GIMPLE_BIND
2564 statement GS. */
2566 static inline void
2567 gimple_bind_set_block (gimple gs, tree block)
2569 GIMPLE_CHECK (gs, GIMPLE_BIND);
2570 gcc_assert (block == NULL_TREE || TREE_CODE (block) == BLOCK);
2571 gs->gimple_bind.block = block;
2575 /* Return the number of input operands for GIMPLE_ASM GS. */
2577 static inline unsigned
2578 gimple_asm_ninputs (const_gimple gs)
2580 GIMPLE_CHECK (gs, GIMPLE_ASM);
2581 return gs->gimple_asm.ni;
2585 /* Return the number of output operands for GIMPLE_ASM GS. */
2587 static inline unsigned
2588 gimple_asm_noutputs (const_gimple gs)
2590 GIMPLE_CHECK (gs, GIMPLE_ASM);
2591 return gs->gimple_asm.no;
2595 /* Return the number of clobber operands for GIMPLE_ASM GS. */
2597 static inline unsigned
2598 gimple_asm_nclobbers (const_gimple gs)
2600 GIMPLE_CHECK (gs, GIMPLE_ASM);
2601 return gs->gimple_asm.nc;
2604 /* Return the number of label operands for GIMPLE_ASM GS. */
2606 static inline unsigned
2607 gimple_asm_nlabels (const_gimple gs)
2609 GIMPLE_CHECK (gs, GIMPLE_ASM);
2610 return gs->gimple_asm.nl;
2613 /* Return input operand INDEX of GIMPLE_ASM GS. */
2615 static inline tree
2616 gimple_asm_input_op (const_gimple gs, unsigned index)
2618 GIMPLE_CHECK (gs, GIMPLE_ASM);
2619 gcc_assert (index <= gs->gimple_asm.ni);
2620 return gimple_op (gs, index);
2623 /* Return a pointer to input operand INDEX of GIMPLE_ASM GS. */
2625 static inline tree *
2626 gimple_asm_input_op_ptr (const_gimple gs, unsigned index)
2628 GIMPLE_CHECK (gs, GIMPLE_ASM);
2629 gcc_assert (index <= gs->gimple_asm.ni);
2630 return gimple_op_ptr (gs, index);
2634 /* Set IN_OP to be input operand INDEX in GIMPLE_ASM GS. */
2636 static inline void
2637 gimple_asm_set_input_op (gimple gs, unsigned index, tree in_op)
2639 GIMPLE_CHECK (gs, GIMPLE_ASM);
2640 gcc_assert (index <= gs->gimple_asm.ni);
2641 gcc_assert (TREE_CODE (in_op) == TREE_LIST);
2642 gimple_set_op (gs, index, in_op);
2646 /* Return output operand INDEX of GIMPLE_ASM GS. */
2648 static inline tree
2649 gimple_asm_output_op (const_gimple gs, unsigned index)
2651 GIMPLE_CHECK (gs, GIMPLE_ASM);
2652 gcc_assert (index <= gs->gimple_asm.no);
2653 return gimple_op (gs, index + gs->gimple_asm.ni);
2656 /* Return a pointer to output operand INDEX of GIMPLE_ASM GS. */
2658 static inline tree *
2659 gimple_asm_output_op_ptr (const_gimple gs, unsigned index)
2661 GIMPLE_CHECK (gs, GIMPLE_ASM);
2662 gcc_assert (index <= gs->gimple_asm.no);
2663 return gimple_op_ptr (gs, index + gs->gimple_asm.ni);
2667 /* Set OUT_OP to be output operand INDEX in GIMPLE_ASM GS. */
2669 static inline void
2670 gimple_asm_set_output_op (gimple gs, unsigned index, tree out_op)
2672 GIMPLE_CHECK (gs, GIMPLE_ASM);
2673 gcc_assert (index <= gs->gimple_asm.no);
2674 gcc_assert (TREE_CODE (out_op) == TREE_LIST);
2675 gimple_set_op (gs, index + gs->gimple_asm.ni, out_op);
2679 /* Return clobber operand INDEX of GIMPLE_ASM GS. */
2681 static inline tree
2682 gimple_asm_clobber_op (const_gimple gs, unsigned index)
2684 GIMPLE_CHECK (gs, GIMPLE_ASM);
2685 gcc_assert (index <= gs->gimple_asm.nc);
2686 return gimple_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.no);
2690 /* Set CLOBBER_OP to be clobber operand INDEX in GIMPLE_ASM GS. */
2692 static inline void
2693 gimple_asm_set_clobber_op (gimple gs, unsigned index, tree clobber_op)
2695 GIMPLE_CHECK (gs, GIMPLE_ASM);
2696 gcc_assert (index <= gs->gimple_asm.nc);
2697 gcc_assert (TREE_CODE (clobber_op) == TREE_LIST);
2698 gimple_set_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.no, clobber_op);
2701 /* Return label operand INDEX of GIMPLE_ASM GS. */
2703 static inline tree
2704 gimple_asm_label_op (const_gimple gs, unsigned index)
2706 GIMPLE_CHECK (gs, GIMPLE_ASM);
2707 gcc_assert (index <= gs->gimple_asm.nl);
2708 return gimple_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.nc);
2711 /* Set LABEL_OP to be label operand INDEX in GIMPLE_ASM GS. */
2713 static inline void
2714 gimple_asm_set_label_op (gimple gs, unsigned index, tree label_op)
2716 GIMPLE_CHECK (gs, GIMPLE_ASM);
2717 gcc_assert (index <= gs->gimple_asm.nl);
2718 gcc_assert (TREE_CODE (label_op) == TREE_LIST);
2719 gimple_set_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.nc, label_op);
2722 /* Return the string representing the assembly instruction in
2723 GIMPLE_ASM GS. */
2725 static inline const char *
2726 gimple_asm_string (const_gimple gs)
2728 GIMPLE_CHECK (gs, GIMPLE_ASM);
2729 return gs->gimple_asm.string;
2733 /* Return true if GS is an asm statement marked volatile. */
2735 static inline bool
2736 gimple_asm_volatile_p (const_gimple gs)
2738 GIMPLE_CHECK (gs, GIMPLE_ASM);
2739 return (gs->gsbase.subcode & GF_ASM_VOLATILE) != 0;
2743 /* If VOLATLE_P is true, mark asm statement GS as volatile. */
2745 static inline void
2746 gimple_asm_set_volatile (gimple gs, bool volatile_p)
2748 GIMPLE_CHECK (gs, GIMPLE_ASM);
2749 if (volatile_p)
2750 gs->gsbase.subcode |= GF_ASM_VOLATILE;
2751 else
2752 gs->gsbase.subcode &= ~GF_ASM_VOLATILE;
2756 /* If INPUT_P is true, mark asm GS as an ASM_INPUT. */
2758 static inline void
2759 gimple_asm_set_input (gimple gs, bool input_p)
2761 GIMPLE_CHECK (gs, GIMPLE_ASM);
2762 if (input_p)
2763 gs->gsbase.subcode |= GF_ASM_INPUT;
2764 else
2765 gs->gsbase.subcode &= ~GF_ASM_INPUT;
2769 /* Return true if asm GS is an ASM_INPUT. */
2771 static inline bool
2772 gimple_asm_input_p (const_gimple gs)
2774 GIMPLE_CHECK (gs, GIMPLE_ASM);
2775 return (gs->gsbase.subcode & GF_ASM_INPUT) != 0;
2779 /* Return the types handled by GIMPLE_CATCH statement GS. */
2781 static inline tree
2782 gimple_catch_types (const_gimple gs)
2784 GIMPLE_CHECK (gs, GIMPLE_CATCH);
2785 return gs->gimple_catch.types;
2789 /* Return a pointer to the types handled by GIMPLE_CATCH statement GS. */
2791 static inline tree *
2792 gimple_catch_types_ptr (gimple gs)
2794 GIMPLE_CHECK (gs, GIMPLE_CATCH);
2795 return &gs->gimple_catch.types;
2799 /* Return the GIMPLE sequence representing the body of the handler of
2800 GIMPLE_CATCH statement GS. */
2802 static inline gimple_seq
2803 gimple_catch_handler (gimple gs)
2805 GIMPLE_CHECK (gs, GIMPLE_CATCH);
2806 return gs->gimple_catch.handler;
2810 /* Return a pointer to the GIMPLE sequence representing the body of
2811 the handler of GIMPLE_CATCH statement GS. */
2813 static inline gimple_seq *
2814 gimple_catch_handler_ptr (gimple gs)
2816 GIMPLE_CHECK (gs, GIMPLE_CATCH);
2817 return &gs->gimple_catch.handler;
2821 /* Set T to be the set of types handled by GIMPLE_CATCH GS. */
2823 static inline void
2824 gimple_catch_set_types (gimple gs, tree t)
2826 GIMPLE_CHECK (gs, GIMPLE_CATCH);
2827 gs->gimple_catch.types = t;
2831 /* Set HANDLER to be the body of GIMPLE_CATCH GS. */
2833 static inline void
2834 gimple_catch_set_handler (gimple gs, gimple_seq handler)
2836 GIMPLE_CHECK (gs, GIMPLE_CATCH);
2837 gs->gimple_catch.handler = handler;
2841 /* Return the types handled by GIMPLE_EH_FILTER statement GS. */
2843 static inline tree
2844 gimple_eh_filter_types (const_gimple gs)
2846 GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
2847 return gs->gimple_eh_filter.types;
2851 /* Return a pointer to the types handled by GIMPLE_EH_FILTER statement
2852 GS. */
2854 static inline tree *
2855 gimple_eh_filter_types_ptr (gimple gs)
2857 GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
2858 return &gs->gimple_eh_filter.types;
2862 /* Return the sequence of statement to execute when GIMPLE_EH_FILTER
2863 statement fails. */
2865 static inline gimple_seq
2866 gimple_eh_filter_failure (gimple gs)
2868 GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
2869 return gs->gimple_eh_filter.failure;
2873 /* Set TYPES to be the set of types handled by GIMPLE_EH_FILTER GS. */
2875 static inline void
2876 gimple_eh_filter_set_types (gimple gs, tree types)
2878 GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
2879 gs->gimple_eh_filter.types = types;
2883 /* Set FAILURE to be the sequence of statements to execute on failure
2884 for GIMPLE_EH_FILTER GS. */
2886 static inline void
2887 gimple_eh_filter_set_failure (gimple gs, gimple_seq failure)
2889 GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
2890 gs->gimple_eh_filter.failure = failure;
2893 /* Get the function decl to be called by the MUST_NOT_THROW region. */
2895 static inline tree
2896 gimple_eh_must_not_throw_fndecl (gimple gs)
2898 GIMPLE_CHECK (gs, GIMPLE_EH_MUST_NOT_THROW);
2899 return gs->gimple_eh_mnt.fndecl;
2902 /* Set the function decl to be called by GS to DECL. */
2904 static inline void
2905 gimple_eh_must_not_throw_set_fndecl (gimple gs, tree decl)
2907 GIMPLE_CHECK (gs, GIMPLE_EH_MUST_NOT_THROW);
2908 gs->gimple_eh_mnt.fndecl = decl;
2912 /* GIMPLE_TRY accessors. */
2914 /* Return the kind of try block represented by GIMPLE_TRY GS. This is
2915 either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY. */
2917 static inline enum gimple_try_flags
2918 gimple_try_kind (const_gimple gs)
2920 GIMPLE_CHECK (gs, GIMPLE_TRY);
2921 return (enum gimple_try_flags) (gs->gsbase.subcode & GIMPLE_TRY_KIND);
2925 /* Set the kind of try block represented by GIMPLE_TRY GS. */
2927 static inline void
2928 gimple_try_set_kind (gimple gs, enum gimple_try_flags kind)
2930 GIMPLE_CHECK (gs, GIMPLE_TRY);
2931 gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY);
2932 if (gimple_try_kind (gs) != kind)
2933 gs->gsbase.subcode = (unsigned int) kind;
2937 /* Return the GIMPLE_TRY_CATCH_IS_CLEANUP flag. */
2939 static inline bool
2940 gimple_try_catch_is_cleanup (const_gimple gs)
2942 gcc_assert (gimple_try_kind (gs) == GIMPLE_TRY_CATCH);
2943 return (gs->gsbase.subcode & GIMPLE_TRY_CATCH_IS_CLEANUP) != 0;
2947 /* Return the sequence of statements used as the body for GIMPLE_TRY GS. */
2949 static inline gimple_seq
2950 gimple_try_eval (gimple gs)
2952 GIMPLE_CHECK (gs, GIMPLE_TRY);
2953 return gs->gimple_try.eval;
2957 /* Return the sequence of statements used as the cleanup body for
2958 GIMPLE_TRY GS. */
2960 static inline gimple_seq
2961 gimple_try_cleanup (gimple gs)
2963 GIMPLE_CHECK (gs, GIMPLE_TRY);
2964 return gs->gimple_try.cleanup;
2968 /* Set the GIMPLE_TRY_CATCH_IS_CLEANUP flag. */
2970 static inline void
2971 gimple_try_set_catch_is_cleanup (gimple g, bool catch_is_cleanup)
2973 gcc_assert (gimple_try_kind (g) == GIMPLE_TRY_CATCH);
2974 if (catch_is_cleanup)
2975 g->gsbase.subcode |= GIMPLE_TRY_CATCH_IS_CLEANUP;
2976 else
2977 g->gsbase.subcode &= ~GIMPLE_TRY_CATCH_IS_CLEANUP;
2981 /* Set EVAL to be the sequence of statements to use as the body for
2982 GIMPLE_TRY GS. */
2984 static inline void
2985 gimple_try_set_eval (gimple gs, gimple_seq eval)
2987 GIMPLE_CHECK (gs, GIMPLE_TRY);
2988 gs->gimple_try.eval = eval;
2992 /* Set CLEANUP to be the sequence of statements to use as the cleanup
2993 body for GIMPLE_TRY GS. */
2995 static inline void
2996 gimple_try_set_cleanup (gimple gs, gimple_seq cleanup)
2998 GIMPLE_CHECK (gs, GIMPLE_TRY);
2999 gs->gimple_try.cleanup = cleanup;
3003 /* Return the cleanup sequence for cleanup statement GS. */
3005 static inline gimple_seq
3006 gimple_wce_cleanup (gimple gs)
3008 GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
3009 return gs->gimple_wce.cleanup;
3013 /* Set CLEANUP to be the cleanup sequence for GS. */
3015 static inline void
3016 gimple_wce_set_cleanup (gimple gs, gimple_seq cleanup)
3018 GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
3019 gs->gimple_wce.cleanup = cleanup;
3023 /* Return the CLEANUP_EH_ONLY flag for a WCE tuple. */
3025 static inline bool
3026 gimple_wce_cleanup_eh_only (const_gimple gs)
3028 GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
3029 return gs->gsbase.subcode != 0;
3033 /* Set the CLEANUP_EH_ONLY flag for a WCE tuple. */
3035 static inline void
3036 gimple_wce_set_cleanup_eh_only (gimple gs, bool eh_only_p)
3038 GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
3039 gs->gsbase.subcode = (unsigned int) eh_only_p;
3043 /* Return the maximum number of arguments supported by GIMPLE_PHI GS. */
3045 static inline unsigned
3046 gimple_phi_capacity (const_gimple gs)
3048 GIMPLE_CHECK (gs, GIMPLE_PHI);
3049 return gs->gimple_phi.capacity;
3053 /* Return the number of arguments in GIMPLE_PHI GS. This must always
3054 be exactly the number of incoming edges for the basic block holding
3055 GS. */
3057 static inline unsigned
3058 gimple_phi_num_args (const_gimple gs)
3060 GIMPLE_CHECK (gs, GIMPLE_PHI);
3061 return gs->gimple_phi.nargs;
3065 /* Return the SSA name created by GIMPLE_PHI GS. */
3067 static inline tree
3068 gimple_phi_result (const_gimple gs)
3070 GIMPLE_CHECK (gs, GIMPLE_PHI);
3071 return gs->gimple_phi.result;
3074 /* Return a pointer to the SSA name created by GIMPLE_PHI GS. */
3076 static inline tree *
3077 gimple_phi_result_ptr (gimple gs)
3079 GIMPLE_CHECK (gs, GIMPLE_PHI);
3080 return &gs->gimple_phi.result;
3083 /* Set RESULT to be the SSA name created by GIMPLE_PHI GS. */
3085 static inline void
3086 gimple_phi_set_result (gimple gs, tree result)
3088 GIMPLE_CHECK (gs, GIMPLE_PHI);
3089 gs->gimple_phi.result = result;
3093 /* Return the PHI argument corresponding to incoming edge INDEX for
3094 GIMPLE_PHI GS. */
3096 static inline struct phi_arg_d *
3097 gimple_phi_arg (gimple gs, unsigned index)
3099 GIMPLE_CHECK (gs, GIMPLE_PHI);
3100 gcc_assert (index <= gs->gimple_phi.capacity);
3101 return &(gs->gimple_phi.args[index]);
3104 /* Set PHIARG to be the argument corresponding to incoming edge INDEX
3105 for GIMPLE_PHI GS. */
3107 static inline void
3108 gimple_phi_set_arg (gimple gs, unsigned index, struct phi_arg_d * phiarg)
3110 GIMPLE_CHECK (gs, GIMPLE_PHI);
3111 gcc_assert (index <= gs->gimple_phi.nargs);
3112 memcpy (gs->gimple_phi.args + index, phiarg, sizeof (struct phi_arg_d));
3115 /* Return the region number for GIMPLE_RESX GS. */
3117 static inline int
3118 gimple_resx_region (const_gimple gs)
3120 GIMPLE_CHECK (gs, GIMPLE_RESX);
3121 return gs->gimple_eh_ctrl.region;
3124 /* Set REGION to be the region number for GIMPLE_RESX GS. */
3126 static inline void
3127 gimple_resx_set_region (gimple gs, int region)
3129 GIMPLE_CHECK (gs, GIMPLE_RESX);
3130 gs->gimple_eh_ctrl.region = region;
3133 /* Return the region number for GIMPLE_EH_DISPATCH GS. */
3135 static inline int
3136 gimple_eh_dispatch_region (const_gimple gs)
3138 GIMPLE_CHECK (gs, GIMPLE_EH_DISPATCH);
3139 return gs->gimple_eh_ctrl.region;
3142 /* Set REGION to be the region number for GIMPLE_EH_DISPATCH GS. */
3144 static inline void
3145 gimple_eh_dispatch_set_region (gimple gs, int region)
3147 GIMPLE_CHECK (gs, GIMPLE_EH_DISPATCH);
3148 gs->gimple_eh_ctrl.region = region;
3151 /* Return the number of labels associated with the switch statement GS. */
3153 static inline unsigned
3154 gimple_switch_num_labels (const_gimple gs)
3156 unsigned num_ops;
3157 GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3158 num_ops = gimple_num_ops (gs);
3159 gcc_assert (num_ops > 1);
3160 return num_ops - 1;
3164 /* Set NLABELS to be the number of labels for the switch statement GS. */
3166 static inline void
3167 gimple_switch_set_num_labels (gimple g, unsigned nlabels)
3169 GIMPLE_CHECK (g, GIMPLE_SWITCH);
3170 gimple_set_num_ops (g, nlabels + 1);
3174 /* Return the index variable used by the switch statement GS. */
3176 static inline tree
3177 gimple_switch_index (const_gimple gs)
3179 GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3180 return gimple_op (gs, 0);
3184 /* Return a pointer to the index variable for the switch statement GS. */
3186 static inline tree *
3187 gimple_switch_index_ptr (const_gimple gs)
3189 GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3190 return gimple_op_ptr (gs, 0);
3194 /* Set INDEX to be the index variable for switch statement GS. */
3196 static inline void
3197 gimple_switch_set_index (gimple gs, tree index)
3199 GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3200 gcc_assert (SSA_VAR_P (index) || CONSTANT_CLASS_P (index));
3201 gimple_set_op (gs, 0, index);
3205 /* Return the label numbered INDEX. The default label is 0, followed by any
3206 labels in a switch statement. */
3208 static inline tree
3209 gimple_switch_label (const_gimple gs, unsigned index)
3211 GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3212 gcc_assert (gimple_num_ops (gs) > index + 1);
3213 return gimple_op (gs, index + 1);
3216 /* Set the label number INDEX to LABEL. 0 is always the default label. */
3218 static inline void
3219 gimple_switch_set_label (gimple gs, unsigned index, tree label)
3221 GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3222 gcc_assert (gimple_num_ops (gs) > index + 1);
3223 gcc_assert (label == NULL_TREE || TREE_CODE (label) == CASE_LABEL_EXPR);
3224 gimple_set_op (gs, index + 1, label);
3227 /* Return the default label for a switch statement. */
3229 static inline tree
3230 gimple_switch_default_label (const_gimple gs)
3232 return gimple_switch_label (gs, 0);
3235 /* Set the default label for a switch statement. */
3237 static inline void
3238 gimple_switch_set_default_label (gimple gs, tree label)
3240 gimple_switch_set_label (gs, 0, label);
3243 /* Return true if GS is a GIMPLE_DEBUG statement. */
3245 static inline bool
3246 is_gimple_debug (const_gimple gs)
3248 return gimple_code (gs) == GIMPLE_DEBUG;
3251 /* Return true if S is a GIMPLE_DEBUG BIND statement. */
3253 static inline bool
3254 gimple_debug_bind_p (const_gimple s)
3256 if (is_gimple_debug (s))
3257 return s->gsbase.subcode == GIMPLE_DEBUG_BIND;
3259 return false;
3262 /* Return the variable bound in a GIMPLE_DEBUG bind statement. */
3264 static inline tree
3265 gimple_debug_bind_get_var (gimple dbg)
3267 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3268 #ifdef ENABLE_CHECKING
3269 gcc_assert (gimple_debug_bind_p (dbg));
3270 #endif
3271 return gimple_op (dbg, 0);
3274 /* Return the value bound to the variable in a GIMPLE_DEBUG bind
3275 statement. */
3277 static inline tree
3278 gimple_debug_bind_get_value (gimple dbg)
3280 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3281 #ifdef ENABLE_CHECKING
3282 gcc_assert (gimple_debug_bind_p (dbg));
3283 #endif
3284 return gimple_op (dbg, 1);
3287 /* Return a pointer to the value bound to the variable in a
3288 GIMPLE_DEBUG bind statement. */
3290 static inline tree *
3291 gimple_debug_bind_get_value_ptr (gimple dbg)
3293 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3294 #ifdef ENABLE_CHECKING
3295 gcc_assert (gimple_debug_bind_p (dbg));
3296 #endif
3297 return gimple_op_ptr (dbg, 1);
3300 /* Set the variable bound in a GIMPLE_DEBUG bind statement. */
3302 static inline void
3303 gimple_debug_bind_set_var (gimple dbg, tree var)
3305 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3306 #ifdef ENABLE_CHECKING
3307 gcc_assert (gimple_debug_bind_p (dbg));
3308 #endif
3309 gimple_set_op (dbg, 0, var);
3312 /* Set the value bound to the variable in a GIMPLE_DEBUG bind
3313 statement. */
3315 static inline void
3316 gimple_debug_bind_set_value (gimple dbg, tree value)
3318 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3319 #ifdef ENABLE_CHECKING
3320 gcc_assert (gimple_debug_bind_p (dbg));
3321 #endif
3322 gimple_set_op (dbg, 1, value);
3325 /* The second operand of a GIMPLE_DEBUG_BIND, when the value was
3326 optimized away. */
3327 #define GIMPLE_DEBUG_BIND_NOVALUE NULL_TREE /* error_mark_node */
3329 /* Remove the value bound to the variable in a GIMPLE_DEBUG bind
3330 statement. */
3332 static inline void
3333 gimple_debug_bind_reset_value (gimple dbg)
3335 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3336 #ifdef ENABLE_CHECKING
3337 gcc_assert (gimple_debug_bind_p (dbg));
3338 #endif
3339 gimple_set_op (dbg, 1, GIMPLE_DEBUG_BIND_NOVALUE);
3342 /* Return true if the GIMPLE_DEBUG bind statement is bound to a
3343 value. */
3345 static inline bool
3346 gimple_debug_bind_has_value_p (gimple dbg)
3348 GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3349 #ifdef ENABLE_CHECKING
3350 gcc_assert (gimple_debug_bind_p (dbg));
3351 #endif
3352 return gimple_op (dbg, 1) != GIMPLE_DEBUG_BIND_NOVALUE;
3355 #undef GIMPLE_DEBUG_BIND_NOVALUE
3357 /* Return the body for the OMP statement GS. */
3359 static inline gimple_seq
3360 gimple_omp_body (gimple gs)
3362 return gs->omp.body;
3365 /* Set BODY to be the body for the OMP statement GS. */
3367 static inline void
3368 gimple_omp_set_body (gimple gs, gimple_seq body)
3370 gs->omp.body = body;
3374 /* Return the name associated with OMP_CRITICAL statement GS. */
3376 static inline tree
3377 gimple_omp_critical_name (const_gimple gs)
3379 GIMPLE_CHECK (gs, GIMPLE_OMP_CRITICAL);
3380 return gs->gimple_omp_critical.name;
3384 /* Return a pointer to the name associated with OMP critical statement GS. */
3386 static inline tree *
3387 gimple_omp_critical_name_ptr (gimple gs)
3389 GIMPLE_CHECK (gs, GIMPLE_OMP_CRITICAL);
3390 return &gs->gimple_omp_critical.name;
3394 /* Set NAME to be the name associated with OMP critical statement GS. */
3396 static inline void
3397 gimple_omp_critical_set_name (gimple gs, tree name)
3399 GIMPLE_CHECK (gs, GIMPLE_OMP_CRITICAL);
3400 gs->gimple_omp_critical.name = name;
3404 /* Return the clauses associated with OMP_FOR GS. */
3406 static inline tree
3407 gimple_omp_for_clauses (const_gimple gs)
3409 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3410 return gs->gimple_omp_for.clauses;
3414 /* Return a pointer to the OMP_FOR GS. */
3416 static inline tree *
3417 gimple_omp_for_clauses_ptr (gimple gs)
3419 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3420 return &gs->gimple_omp_for.clauses;
3424 /* Set CLAUSES to be the list of clauses associated with OMP_FOR GS. */
3426 static inline void
3427 gimple_omp_for_set_clauses (gimple gs, tree clauses)
3429 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3430 gs->gimple_omp_for.clauses = clauses;
3434 /* Get the collapse count of OMP_FOR GS. */
3436 static inline size_t
3437 gimple_omp_for_collapse (gimple gs)
3439 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3440 return gs->gimple_omp_for.collapse;
3444 /* Return the index variable for OMP_FOR GS. */
3446 static inline tree
3447 gimple_omp_for_index (const_gimple gs, size_t i)
3449 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3450 gcc_assert (i < gs->gimple_omp_for.collapse);
3451 return gs->gimple_omp_for.iter[i].index;
3455 /* Return a pointer to the index variable for OMP_FOR GS. */
3457 static inline tree *
3458 gimple_omp_for_index_ptr (gimple gs, size_t i)
3460 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3461 gcc_assert (i < gs->gimple_omp_for.collapse);
3462 return &gs->gimple_omp_for.iter[i].index;
3466 /* Set INDEX to be the index variable for OMP_FOR GS. */
3468 static inline void
3469 gimple_omp_for_set_index (gimple gs, size_t i, tree index)
3471 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3472 gcc_assert (i < gs->gimple_omp_for.collapse);
3473 gs->gimple_omp_for.iter[i].index = index;
3477 /* Return the initial value for OMP_FOR GS. */
3479 static inline tree
3480 gimple_omp_for_initial (const_gimple gs, size_t i)
3482 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3483 gcc_assert (i < gs->gimple_omp_for.collapse);
3484 return gs->gimple_omp_for.iter[i].initial;
3488 /* Return a pointer to the initial value for OMP_FOR GS. */
3490 static inline tree *
3491 gimple_omp_for_initial_ptr (gimple gs, size_t i)
3493 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3494 gcc_assert (i < gs->gimple_omp_for.collapse);
3495 return &gs->gimple_omp_for.iter[i].initial;
3499 /* Set INITIAL to be the initial value for OMP_FOR GS. */
3501 static inline void
3502 gimple_omp_for_set_initial (gimple gs, size_t i, tree initial)
3504 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3505 gcc_assert (i < gs->gimple_omp_for.collapse);
3506 gs->gimple_omp_for.iter[i].initial = initial;
3510 /* Return the final value for OMP_FOR GS. */
3512 static inline tree
3513 gimple_omp_for_final (const_gimple gs, size_t i)
3515 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3516 gcc_assert (i < gs->gimple_omp_for.collapse);
3517 return gs->gimple_omp_for.iter[i].final;
3521 /* Return a pointer to the final value for OMP_FOR GS. */
3523 static inline tree *
3524 gimple_omp_for_final_ptr (gimple gs, size_t i)
3526 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3527 gcc_assert (i < gs->gimple_omp_for.collapse);
3528 return &gs->gimple_omp_for.iter[i].final;
3532 /* Set FINAL to be the final value for OMP_FOR GS. */
3534 static inline void
3535 gimple_omp_for_set_final (gimple gs, size_t i, tree final)
3537 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3538 gcc_assert (i < gs->gimple_omp_for.collapse);
3539 gs->gimple_omp_for.iter[i].final = final;
3543 /* Return the increment value for OMP_FOR GS. */
3545 static inline tree
3546 gimple_omp_for_incr (const_gimple gs, size_t i)
3548 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3549 gcc_assert (i < gs->gimple_omp_for.collapse);
3550 return gs->gimple_omp_for.iter[i].incr;
3554 /* Return a pointer to the increment value for OMP_FOR GS. */
3556 static inline tree *
3557 gimple_omp_for_incr_ptr (gimple gs, size_t i)
3559 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3560 gcc_assert (i < gs->gimple_omp_for.collapse);
3561 return &gs->gimple_omp_for.iter[i].incr;
3565 /* Set INCR to be the increment value for OMP_FOR GS. */
3567 static inline void
3568 gimple_omp_for_set_incr (gimple gs, size_t i, tree incr)
3570 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3571 gcc_assert (i < gs->gimple_omp_for.collapse);
3572 gs->gimple_omp_for.iter[i].incr = incr;
3576 /* Return the sequence of statements to execute before the OMP_FOR
3577 statement GS starts. */
3579 static inline gimple_seq
3580 gimple_omp_for_pre_body (gimple gs)
3582 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3583 return gs->gimple_omp_for.pre_body;
3587 /* Set PRE_BODY to be the sequence of statements to execute before the
3588 OMP_FOR statement GS starts. */
3590 static inline void
3591 gimple_omp_for_set_pre_body (gimple gs, gimple_seq pre_body)
3593 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3594 gs->gimple_omp_for.pre_body = pre_body;
3598 /* Return the clauses associated with OMP_PARALLEL GS. */
3600 static inline tree
3601 gimple_omp_parallel_clauses (const_gimple gs)
3603 GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
3604 return gs->gimple_omp_parallel.clauses;
3608 /* Return a pointer to the clauses associated with OMP_PARALLEL GS. */
3610 static inline tree *
3611 gimple_omp_parallel_clauses_ptr (gimple gs)
3613 GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
3614 return &gs->gimple_omp_parallel.clauses;
3618 /* Set CLAUSES to be the list of clauses associated with OMP_PARALLEL
3619 GS. */
3621 static inline void
3622 gimple_omp_parallel_set_clauses (gimple gs, tree clauses)
3624 GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
3625 gs->gimple_omp_parallel.clauses = clauses;
3629 /* Return the child function used to hold the body of OMP_PARALLEL GS. */
3631 static inline tree
3632 gimple_omp_parallel_child_fn (const_gimple gs)
3634 GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
3635 return gs->gimple_omp_parallel.child_fn;
3638 /* Return a pointer to the child function used to hold the body of
3639 OMP_PARALLEL GS. */
3641 static inline tree *
3642 gimple_omp_parallel_child_fn_ptr (gimple gs)
3644 GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
3645 return &gs->gimple_omp_parallel.child_fn;
3649 /* Set CHILD_FN to be the child function for OMP_PARALLEL GS. */
3651 static inline void
3652 gimple_omp_parallel_set_child_fn (gimple gs, tree child_fn)
3654 GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
3655 gs->gimple_omp_parallel.child_fn = child_fn;
3659 /* Return the artificial argument used to send variables and values
3660 from the parent to the children threads in OMP_PARALLEL GS. */
3662 static inline tree
3663 gimple_omp_parallel_data_arg (const_gimple gs)
3665 GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
3666 return gs->gimple_omp_parallel.data_arg;
3670 /* Return a pointer to the data argument for OMP_PARALLEL GS. */
3672 static inline tree *
3673 gimple_omp_parallel_data_arg_ptr (gimple gs)
3675 GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
3676 return &gs->gimple_omp_parallel.data_arg;
3680 /* Set DATA_ARG to be the data argument for OMP_PARALLEL GS. */
3682 static inline void
3683 gimple_omp_parallel_set_data_arg (gimple gs, tree data_arg)
3685 GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
3686 gs->gimple_omp_parallel.data_arg = data_arg;
3690 /* Return the clauses associated with OMP_TASK GS. */
3692 static inline tree
3693 gimple_omp_task_clauses (const_gimple gs)
3695 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3696 return gs->gimple_omp_parallel.clauses;
3700 /* Return a pointer to the clauses associated with OMP_TASK GS. */
3702 static inline tree *
3703 gimple_omp_task_clauses_ptr (gimple gs)
3705 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3706 return &gs->gimple_omp_parallel.clauses;
3710 /* Set CLAUSES to be the list of clauses associated with OMP_TASK
3711 GS. */
3713 static inline void
3714 gimple_omp_task_set_clauses (gimple gs, tree clauses)
3716 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3717 gs->gimple_omp_parallel.clauses = clauses;
3721 /* Return the child function used to hold the body of OMP_TASK GS. */
3723 static inline tree
3724 gimple_omp_task_child_fn (const_gimple gs)
3726 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3727 return gs->gimple_omp_parallel.child_fn;
3730 /* Return a pointer to the child function used to hold the body of
3731 OMP_TASK GS. */
3733 static inline tree *
3734 gimple_omp_task_child_fn_ptr (gimple gs)
3736 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3737 return &gs->gimple_omp_parallel.child_fn;
3741 /* Set CHILD_FN to be the child function for OMP_TASK GS. */
3743 static inline void
3744 gimple_omp_task_set_child_fn (gimple gs, tree child_fn)
3746 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3747 gs->gimple_omp_parallel.child_fn = child_fn;
3751 /* Return the artificial argument used to send variables and values
3752 from the parent to the children threads in OMP_TASK GS. */
3754 static inline tree
3755 gimple_omp_task_data_arg (const_gimple gs)
3757 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3758 return gs->gimple_omp_parallel.data_arg;
3762 /* Return a pointer to the data argument for OMP_TASK GS. */
3764 static inline tree *
3765 gimple_omp_task_data_arg_ptr (gimple gs)
3767 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3768 return &gs->gimple_omp_parallel.data_arg;
3772 /* Set DATA_ARG to be the data argument for OMP_TASK GS. */
3774 static inline void
3775 gimple_omp_task_set_data_arg (gimple gs, tree data_arg)
3777 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3778 gs->gimple_omp_parallel.data_arg = data_arg;
3782 /* Return the clauses associated with OMP_TASK GS. */
3784 static inline tree
3785 gimple_omp_taskreg_clauses (const_gimple gs)
3787 if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
3788 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3789 return gs->gimple_omp_parallel.clauses;
3793 /* Return a pointer to the clauses associated with OMP_TASK GS. */
3795 static inline tree *
3796 gimple_omp_taskreg_clauses_ptr (gimple gs)
3798 if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
3799 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3800 return &gs->gimple_omp_parallel.clauses;
3804 /* Set CLAUSES to be the list of clauses associated with OMP_TASK
3805 GS. */
3807 static inline void
3808 gimple_omp_taskreg_set_clauses (gimple gs, tree clauses)
3810 if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
3811 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3812 gs->gimple_omp_parallel.clauses = clauses;
3816 /* Return the child function used to hold the body of OMP_TASK GS. */
3818 static inline tree
3819 gimple_omp_taskreg_child_fn (const_gimple gs)
3821 if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
3822 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3823 return gs->gimple_omp_parallel.child_fn;
3826 /* Return a pointer to the child function used to hold the body of
3827 OMP_TASK GS. */
3829 static inline tree *
3830 gimple_omp_taskreg_child_fn_ptr (gimple gs)
3832 if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
3833 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3834 return &gs->gimple_omp_parallel.child_fn;
3838 /* Set CHILD_FN to be the child function for OMP_TASK GS. */
3840 static inline void
3841 gimple_omp_taskreg_set_child_fn (gimple gs, tree child_fn)
3843 if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
3844 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3845 gs->gimple_omp_parallel.child_fn = child_fn;
3849 /* Return the artificial argument used to send variables and values
3850 from the parent to the children threads in OMP_TASK GS. */
3852 static inline tree
3853 gimple_omp_taskreg_data_arg (const_gimple gs)
3855 if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
3856 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3857 return gs->gimple_omp_parallel.data_arg;
3861 /* Return a pointer to the data argument for OMP_TASK GS. */
3863 static inline tree *
3864 gimple_omp_taskreg_data_arg_ptr (gimple gs)
3866 if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
3867 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3868 return &gs->gimple_omp_parallel.data_arg;
3872 /* Set DATA_ARG to be the data argument for OMP_TASK GS. */
3874 static inline void
3875 gimple_omp_taskreg_set_data_arg (gimple gs, tree data_arg)
3877 if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
3878 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3879 gs->gimple_omp_parallel.data_arg = data_arg;
3883 /* Return the copy function used to hold the body of OMP_TASK GS. */
3885 static inline tree
3886 gimple_omp_task_copy_fn (const_gimple gs)
3888 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3889 return gs->gimple_omp_task.copy_fn;
3892 /* Return a pointer to the copy function used to hold the body of
3893 OMP_TASK GS. */
3895 static inline tree *
3896 gimple_omp_task_copy_fn_ptr (gimple gs)
3898 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3899 return &gs->gimple_omp_task.copy_fn;
3903 /* Set CHILD_FN to be the copy function for OMP_TASK GS. */
3905 static inline void
3906 gimple_omp_task_set_copy_fn (gimple gs, tree copy_fn)
3908 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3909 gs->gimple_omp_task.copy_fn = copy_fn;
3913 /* Return size of the data block in bytes in OMP_TASK GS. */
3915 static inline tree
3916 gimple_omp_task_arg_size (const_gimple gs)
3918 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3919 return gs->gimple_omp_task.arg_size;
3923 /* Return a pointer to the data block size for OMP_TASK GS. */
3925 static inline tree *
3926 gimple_omp_task_arg_size_ptr (gimple gs)
3928 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3929 return &gs->gimple_omp_task.arg_size;
3933 /* Set ARG_SIZE to be the data block size for OMP_TASK GS. */
3935 static inline void
3936 gimple_omp_task_set_arg_size (gimple gs, tree arg_size)
3938 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3939 gs->gimple_omp_task.arg_size = arg_size;
3943 /* Return align of the data block in bytes in OMP_TASK GS. */
3945 static inline tree
3946 gimple_omp_task_arg_align (const_gimple gs)
3948 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3949 return gs->gimple_omp_task.arg_align;
3953 /* Return a pointer to the data block align for OMP_TASK GS. */
3955 static inline tree *
3956 gimple_omp_task_arg_align_ptr (gimple gs)
3958 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3959 return &gs->gimple_omp_task.arg_align;
3963 /* Set ARG_SIZE to be the data block align for OMP_TASK GS. */
3965 static inline void
3966 gimple_omp_task_set_arg_align (gimple gs, tree arg_align)
3968 GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
3969 gs->gimple_omp_task.arg_align = arg_align;
3973 /* Return the clauses associated with OMP_SINGLE GS. */
3975 static inline tree
3976 gimple_omp_single_clauses (const_gimple gs)
3978 GIMPLE_CHECK (gs, GIMPLE_OMP_SINGLE);
3979 return gs->gimple_omp_single.clauses;
3983 /* Return a pointer to the clauses associated with OMP_SINGLE GS. */
3985 static inline tree *
3986 gimple_omp_single_clauses_ptr (gimple gs)
3988 GIMPLE_CHECK (gs, GIMPLE_OMP_SINGLE);
3989 return &gs->gimple_omp_single.clauses;
3993 /* Set CLAUSES to be the clauses associated with OMP_SINGLE GS. */
3995 static inline void
3996 gimple_omp_single_set_clauses (gimple gs, tree clauses)
3998 GIMPLE_CHECK (gs, GIMPLE_OMP_SINGLE);
3999 gs->gimple_omp_single.clauses = clauses;
4003 /* Return the clauses associated with OMP_SECTIONS GS. */
4005 static inline tree
4006 gimple_omp_sections_clauses (const_gimple gs)
4008 GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4009 return gs->gimple_omp_sections.clauses;
4013 /* Return a pointer to the clauses associated with OMP_SECTIONS GS. */
4015 static inline tree *
4016 gimple_omp_sections_clauses_ptr (gimple gs)
4018 GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4019 return &gs->gimple_omp_sections.clauses;
4023 /* Set CLAUSES to be the set of clauses associated with OMP_SECTIONS
4024 GS. */
4026 static inline void
4027 gimple_omp_sections_set_clauses (gimple gs, tree clauses)
4029 GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4030 gs->gimple_omp_sections.clauses = clauses;
4034 /* Return the control variable associated with the GIMPLE_OMP_SECTIONS
4035 in GS. */
4037 static inline tree
4038 gimple_omp_sections_control (const_gimple gs)
4040 GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4041 return gs->gimple_omp_sections.control;
4045 /* Return a pointer to the clauses associated with the GIMPLE_OMP_SECTIONS
4046 GS. */
4048 static inline tree *
4049 gimple_omp_sections_control_ptr (gimple gs)
4051 GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4052 return &gs->gimple_omp_sections.control;
4056 /* Set CONTROL to be the set of clauses associated with the
4057 GIMPLE_OMP_SECTIONS in GS. */
4059 static inline void
4060 gimple_omp_sections_set_control (gimple gs, tree control)
4062 GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4063 gs->gimple_omp_sections.control = control;
4067 /* Set COND to be the condition code for OMP_FOR GS. */
4069 static inline void
4070 gimple_omp_for_set_cond (gimple gs, size_t i, enum tree_code cond)
4072 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
4073 gcc_assert (TREE_CODE_CLASS (cond) == tcc_comparison);
4074 gcc_assert (i < gs->gimple_omp_for.collapse);
4075 gs->gimple_omp_for.iter[i].cond = cond;
4079 /* Return the condition code associated with OMP_FOR GS. */
4081 static inline enum tree_code
4082 gimple_omp_for_cond (const_gimple gs, size_t i)
4084 GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
4085 gcc_assert (i < gs->gimple_omp_for.collapse);
4086 return gs->gimple_omp_for.iter[i].cond;
4090 /* Set the value being stored in an atomic store. */
4092 static inline void
4093 gimple_omp_atomic_store_set_val (gimple g, tree val)
4095 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
4096 g->gimple_omp_atomic_store.val = val;
4100 /* Return the value being stored in an atomic store. */
4102 static inline tree
4103 gimple_omp_atomic_store_val (const_gimple g)
4105 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
4106 return g->gimple_omp_atomic_store.val;
4110 /* Return a pointer to the value being stored in an atomic store. */
4112 static inline tree *
4113 gimple_omp_atomic_store_val_ptr (gimple g)
4115 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
4116 return &g->gimple_omp_atomic_store.val;
4120 /* Set the LHS of an atomic load. */
4122 static inline void
4123 gimple_omp_atomic_load_set_lhs (gimple g, tree lhs)
4125 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4126 g->gimple_omp_atomic_load.lhs = lhs;
4130 /* Get the LHS of an atomic load. */
4132 static inline tree
4133 gimple_omp_atomic_load_lhs (const_gimple g)
4135 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4136 return g->gimple_omp_atomic_load.lhs;
4140 /* Return a pointer to the LHS of an atomic load. */
4142 static inline tree *
4143 gimple_omp_atomic_load_lhs_ptr (gimple g)
4145 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4146 return &g->gimple_omp_atomic_load.lhs;
4150 /* Set the RHS of an atomic load. */
4152 static inline void
4153 gimple_omp_atomic_load_set_rhs (gimple g, tree rhs)
4155 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4156 g->gimple_omp_atomic_load.rhs = rhs;
4160 /* Get the RHS of an atomic load. */
4162 static inline tree
4163 gimple_omp_atomic_load_rhs (const_gimple g)
4165 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4166 return g->gimple_omp_atomic_load.rhs;
4170 /* Return a pointer to the RHS of an atomic load. */
4172 static inline tree *
4173 gimple_omp_atomic_load_rhs_ptr (gimple g)
4175 GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4176 return &g->gimple_omp_atomic_load.rhs;
4180 /* Get the definition of the control variable in a GIMPLE_OMP_CONTINUE. */
4182 static inline tree
4183 gimple_omp_continue_control_def (const_gimple g)
4185 GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4186 return g->gimple_omp_continue.control_def;
4189 /* The same as above, but return the address. */
4191 static inline tree *
4192 gimple_omp_continue_control_def_ptr (gimple g)
4194 GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4195 return &g->gimple_omp_continue.control_def;
4198 /* Set the definition of the control variable in a GIMPLE_OMP_CONTINUE. */
4200 static inline void
4201 gimple_omp_continue_set_control_def (gimple g, tree def)
4203 GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4204 g->gimple_omp_continue.control_def = def;
4208 /* Get the use of the control variable in a GIMPLE_OMP_CONTINUE. */
4210 static inline tree
4211 gimple_omp_continue_control_use (const_gimple g)
4213 GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4214 return g->gimple_omp_continue.control_use;
4218 /* The same as above, but return the address. */
4220 static inline tree *
4221 gimple_omp_continue_control_use_ptr (gimple g)
4223 GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4224 return &g->gimple_omp_continue.control_use;
4228 /* Set the use of the control variable in a GIMPLE_OMP_CONTINUE. */
4230 static inline void
4231 gimple_omp_continue_set_control_use (gimple g, tree use)
4233 GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4234 g->gimple_omp_continue.control_use = use;
4238 /* Return a pointer to the return value for GIMPLE_RETURN GS. */
4240 static inline tree *
4241 gimple_return_retval_ptr (const_gimple gs)
4243 GIMPLE_CHECK (gs, GIMPLE_RETURN);
4244 return gimple_op_ptr (gs, 0);
4247 /* Return the return value for GIMPLE_RETURN GS. */
4249 static inline tree
4250 gimple_return_retval (const_gimple gs)
4252 GIMPLE_CHECK (gs, GIMPLE_RETURN);
4253 return gimple_op (gs, 0);
4257 /* Set RETVAL to be the return value for GIMPLE_RETURN GS. */
4259 static inline void
4260 gimple_return_set_retval (gimple gs, tree retval)
4262 GIMPLE_CHECK (gs, GIMPLE_RETURN);
4263 gimple_set_op (gs, 0, retval);
4267 /* Returns true when the gimple statment STMT is any of the OpenMP types. */
4269 #define CASE_GIMPLE_OMP \
4270 case GIMPLE_OMP_PARALLEL: \
4271 case GIMPLE_OMP_TASK: \
4272 case GIMPLE_OMP_FOR: \
4273 case GIMPLE_OMP_SECTIONS: \
4274 case GIMPLE_OMP_SECTIONS_SWITCH: \
4275 case GIMPLE_OMP_SINGLE: \
4276 case GIMPLE_OMP_SECTION: \
4277 case GIMPLE_OMP_MASTER: \
4278 case GIMPLE_OMP_ORDERED: \
4279 case GIMPLE_OMP_CRITICAL: \
4280 case GIMPLE_OMP_RETURN: \
4281 case GIMPLE_OMP_ATOMIC_LOAD: \
4282 case GIMPLE_OMP_ATOMIC_STORE: \
4283 case GIMPLE_OMP_CONTINUE
4285 static inline bool
4286 is_gimple_omp (const_gimple stmt)
4288 switch (gimple_code (stmt))
4290 CASE_GIMPLE_OMP:
4291 return true;
4292 default:
4293 return false;
4298 /* Returns TRUE if statement G is a GIMPLE_NOP. */
4300 static inline bool
4301 gimple_nop_p (const_gimple g)
4303 return gimple_code (g) == GIMPLE_NOP;
4307 /* Return true if GS is a GIMPLE_RESX. */
4309 static inline bool
4310 is_gimple_resx (const_gimple gs)
4312 return gimple_code (gs) == GIMPLE_RESX;
4315 /* Return the predictor of GIMPLE_PREDICT statement GS. */
4317 static inline enum br_predictor
4318 gimple_predict_predictor (gimple gs)
4320 GIMPLE_CHECK (gs, GIMPLE_PREDICT);
4321 return (enum br_predictor) (gs->gsbase.subcode & ~GF_PREDICT_TAKEN);
4325 /* Set the predictor of GIMPLE_PREDICT statement GS to PREDICT. */
4327 static inline void
4328 gimple_predict_set_predictor (gimple gs, enum br_predictor predictor)
4330 GIMPLE_CHECK (gs, GIMPLE_PREDICT);
4331 gs->gsbase.subcode = (gs->gsbase.subcode & GF_PREDICT_TAKEN)
4332 | (unsigned) predictor;
4336 /* Return the outcome of GIMPLE_PREDICT statement GS. */
4338 static inline enum prediction
4339 gimple_predict_outcome (gimple gs)
4341 GIMPLE_CHECK (gs, GIMPLE_PREDICT);
4342 return (gs->gsbase.subcode & GF_PREDICT_TAKEN) ? TAKEN : NOT_TAKEN;
4346 /* Set the outcome of GIMPLE_PREDICT statement GS to OUTCOME. */
4348 static inline void
4349 gimple_predict_set_outcome (gimple gs, enum prediction outcome)
4351 GIMPLE_CHECK (gs, GIMPLE_PREDICT);
4352 if (outcome == TAKEN)
4353 gs->gsbase.subcode |= GF_PREDICT_TAKEN;
4354 else
4355 gs->gsbase.subcode &= ~GF_PREDICT_TAKEN;
4359 /* Return the type of the main expression computed by STMT. Return
4360 void_type_node if the statement computes nothing. */
4362 static inline tree
4363 gimple_expr_type (const_gimple stmt)
4365 enum gimple_code code = gimple_code (stmt);
4367 if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
4369 tree type;
4370 /* In general we want to pass out a type that can be substituted
4371 for both the RHS and the LHS types if there is a possibly
4372 useless conversion involved. That means returning the
4373 original RHS type as far as we can reconstruct it. */
4374 if (code == GIMPLE_CALL)
4375 type = gimple_call_return_type (stmt);
4376 else
4377 switch (gimple_assign_rhs_code (stmt))
4379 case POINTER_PLUS_EXPR:
4380 type = TREE_TYPE (gimple_assign_rhs1 (stmt));
4381 break;
4383 default:
4384 /* As fallback use the type of the LHS. */
4385 type = TREE_TYPE (gimple_get_lhs (stmt));
4386 break;
4388 return type;
4390 else if (code == GIMPLE_COND)
4391 return boolean_type_node;
4392 else
4393 return void_type_node;
4397 /* Return a new iterator pointing to GIMPLE_SEQ's first statement. */
4399 static inline gimple_stmt_iterator
4400 gsi_start (gimple_seq seq)
4402 gimple_stmt_iterator i;
4404 i.ptr = gimple_seq_first (seq);
4405 i.seq = seq;
4406 i.bb = (i.ptr && i.ptr->stmt) ? gimple_bb (i.ptr->stmt) : NULL;
4408 return i;
4412 /* Return a new iterator pointing to the first statement in basic block BB. */
4414 static inline gimple_stmt_iterator
4415 gsi_start_bb (basic_block bb)
4417 gimple_stmt_iterator i;
4418 gimple_seq seq;
4420 seq = bb_seq (bb);
4421 i.ptr = gimple_seq_first (seq);
4422 i.seq = seq;
4423 i.bb = bb;
4425 return i;
4429 /* Return a new iterator initially pointing to GIMPLE_SEQ's last statement. */
4431 static inline gimple_stmt_iterator
4432 gsi_last (gimple_seq seq)
4434 gimple_stmt_iterator i;
4436 i.ptr = gimple_seq_last (seq);
4437 i.seq = seq;
4438 i.bb = (i.ptr && i.ptr->stmt) ? gimple_bb (i.ptr->stmt) : NULL;
4440 return i;
4444 /* Return a new iterator pointing to the last statement in basic block BB. */
4446 static inline gimple_stmt_iterator
4447 gsi_last_bb (basic_block bb)
4449 gimple_stmt_iterator i;
4450 gimple_seq seq;
4452 seq = bb_seq (bb);
4453 i.ptr = gimple_seq_last (seq);
4454 i.seq = seq;
4455 i.bb = bb;
4457 return i;
4461 /* Return true if I is at the end of its sequence. */
4463 static inline bool
4464 gsi_end_p (gimple_stmt_iterator i)
4466 return i.ptr == NULL;
4470 /* Return true if I is one statement before the end of its sequence. */
4472 static inline bool
4473 gsi_one_before_end_p (gimple_stmt_iterator i)
4475 return i.ptr != NULL && i.ptr->next == NULL;
4479 /* Advance the iterator to the next gimple statement. */
4481 static inline void
4482 gsi_next (gimple_stmt_iterator *i)
4484 i->ptr = i->ptr->next;
4487 /* Advance the iterator to the previous gimple statement. */
4489 static inline void
4490 gsi_prev (gimple_stmt_iterator *i)
4492 i->ptr = i->ptr->prev;
4495 /* Return the current stmt. */
4497 static inline gimple
4498 gsi_stmt (gimple_stmt_iterator i)
4500 return i.ptr->stmt;
4503 /* Return a block statement iterator that points to the first non-label
4504 statement in block BB. */
4506 static inline gimple_stmt_iterator
4507 gsi_after_labels (basic_block bb)
4509 gimple_stmt_iterator gsi = gsi_start_bb (bb);
4511 while (!gsi_end_p (gsi) && gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL)
4512 gsi_next (&gsi);
4514 return gsi;
4517 /* Advance the iterator to the next non-debug gimple statement. */
4519 static inline void
4520 gsi_next_nondebug (gimple_stmt_iterator *i)
4524 gsi_next (i);
4526 while (!gsi_end_p (*i) && is_gimple_debug (gsi_stmt (*i)));
4529 /* Advance the iterator to the next non-debug gimple statement. */
4531 static inline void
4532 gsi_prev_nondebug (gimple_stmt_iterator *i)
4536 gsi_prev (i);
4538 while (!gsi_end_p (*i) && is_gimple_debug (gsi_stmt (*i)));
4541 /* Return a new iterator pointing to the first non-debug statement in
4542 basic block BB. */
4544 static inline gimple_stmt_iterator
4545 gsi_start_nondebug_bb (basic_block bb)
4547 gimple_stmt_iterator i = gsi_start_bb (bb);
4549 if (!gsi_end_p (i) && is_gimple_debug (gsi_stmt (i)))
4550 gsi_next_nondebug (&i);
4552 return i;
4555 /* Return a new iterator pointing to the last non-debug statement in
4556 basic block BB. */
4558 static inline gimple_stmt_iterator
4559 gsi_last_nondebug_bb (basic_block bb)
4561 gimple_stmt_iterator i = gsi_last_bb (bb);
4563 if (!gsi_end_p (i) && is_gimple_debug (gsi_stmt (i)))
4564 gsi_prev_nondebug (&i);
4566 return i;
4569 /* Return a pointer to the current stmt.
4571 NOTE: You may want to use gsi_replace on the iterator itself,
4572 as this performs additional bookkeeping that will not be done
4573 if you simply assign through a pointer returned by gsi_stmt_ptr. */
4575 static inline gimple *
4576 gsi_stmt_ptr (gimple_stmt_iterator *i)
4578 return &i->ptr->stmt;
4582 /* Return the basic block associated with this iterator. */
4584 static inline basic_block
4585 gsi_bb (gimple_stmt_iterator i)
4587 return i.bb;
4591 /* Return the sequence associated with this iterator. */
4593 static inline gimple_seq
4594 gsi_seq (gimple_stmt_iterator i)
4596 return i.seq;
4600 enum gsi_iterator_update
4602 GSI_NEW_STMT, /* Only valid when single statement is added, move
4603 iterator to it. */
4604 GSI_SAME_STMT, /* Leave the iterator at the same statement. */
4605 GSI_CONTINUE_LINKING /* Move iterator to whatever position is suitable
4606 for linking other statements in the same
4607 direction. */
4610 /* In gimple-iterator.c */
4611 gimple_stmt_iterator gsi_start_phis (basic_block);
4612 gimple_seq gsi_split_seq_after (gimple_stmt_iterator);
4613 gimple_seq gsi_split_seq_before (gimple_stmt_iterator *);
4614 void gsi_replace (gimple_stmt_iterator *, gimple, bool);
4615 void gsi_insert_before (gimple_stmt_iterator *, gimple,
4616 enum gsi_iterator_update);
4617 void gsi_insert_before_without_update (gimple_stmt_iterator *, gimple,
4618 enum gsi_iterator_update);
4619 void gsi_insert_seq_before (gimple_stmt_iterator *, gimple_seq,
4620 enum gsi_iterator_update);
4621 void gsi_insert_seq_before_without_update (gimple_stmt_iterator *, gimple_seq,
4622 enum gsi_iterator_update);
4623 void gsi_insert_after (gimple_stmt_iterator *, gimple,
4624 enum gsi_iterator_update);
4625 void gsi_insert_after_without_update (gimple_stmt_iterator *, gimple,
4626 enum gsi_iterator_update);
4627 void gsi_insert_seq_after (gimple_stmt_iterator *, gimple_seq,
4628 enum gsi_iterator_update);
4629 void gsi_insert_seq_after_without_update (gimple_stmt_iterator *, gimple_seq,
4630 enum gsi_iterator_update);
4631 void gsi_remove (gimple_stmt_iterator *, bool);
4632 gimple_stmt_iterator gsi_for_stmt (gimple);
4633 void gsi_move_after (gimple_stmt_iterator *, gimple_stmt_iterator *);
4634 void gsi_move_before (gimple_stmt_iterator *, gimple_stmt_iterator *);
4635 void gsi_move_to_bb_end (gimple_stmt_iterator *, struct basic_block_def *);
4636 void gsi_insert_on_edge (edge, gimple);
4637 void gsi_insert_seq_on_edge (edge, gimple_seq);
4638 basic_block gsi_insert_on_edge_immediate (edge, gimple);
4639 basic_block gsi_insert_seq_on_edge_immediate (edge, gimple_seq);
4640 void gsi_commit_one_edge_insert (edge, basic_block *);
4641 void gsi_commit_edge_inserts (void);
4642 gimple gimple_call_copy_skip_args (gimple, bitmap);
4645 /* Convenience routines to walk all statements of a gimple function.
4646 Note that this is useful exclusively before the code is converted
4647 into SSA form. Once the program is in SSA form, the standard
4648 operand interface should be used to analyze/modify statements. */
4649 struct walk_stmt_info
4651 /* Points to the current statement being walked. */
4652 gimple_stmt_iterator gsi;
4654 /* Additional data that the callback functions may want to carry
4655 through the recursion. */
4656 void *info;
4658 /* Pointer map used to mark visited tree nodes when calling
4659 walk_tree on each operand. If set to NULL, duplicate tree nodes
4660 will be visited more than once. */
4661 struct pointer_set_t *pset;
4663 /* Indicates whether the operand being examined may be replaced
4664 with something that matches is_gimple_val (if true) or something
4665 slightly more complicated (if false). "Something" technically
4666 means the common subset of is_gimple_lvalue and is_gimple_rhs,
4667 but we never try to form anything more complicated than that, so
4668 we don't bother checking.
4670 Also note that CALLBACK should update this flag while walking the
4671 sub-expressions of a statement. For instance, when walking the
4672 statement 'foo (&var)', the flag VAL_ONLY will initially be set
4673 to true, however, when walking &var, the operand of that
4674 ADDR_EXPR does not need to be a GIMPLE value. */
4675 bool val_only;
4677 /* True if we are currently walking the LHS of an assignment. */
4678 bool is_lhs;
4680 /* Optional. Set to true by the callback functions if they made any
4681 changes. */
4682 bool changed;
4684 /* True if we're interested in location information. */
4685 bool want_locations;
4687 /* Operand returned by the callbacks. This is set when calling
4688 walk_gimple_seq. If the walk_stmt_fn or walk_tree_fn callback
4689 returns non-NULL, this field will contain the tree returned by
4690 the last callback. */
4691 tree callback_result;
4694 /* Callback for walk_gimple_stmt. Called for every statement found
4695 during traversal. The first argument points to the statement to
4696 walk. The second argument is a flag that the callback sets to
4697 'true' if it the callback handled all the operands and
4698 sub-statements of the statement (the default value of this flag is
4699 'false'). The third argument is an anonymous pointer to data
4700 to be used by the callback. */
4701 typedef tree (*walk_stmt_fn) (gimple_stmt_iterator *, bool *,
4702 struct walk_stmt_info *);
4704 gimple walk_gimple_seq (gimple_seq, walk_stmt_fn, walk_tree_fn,
4705 struct walk_stmt_info *);
4706 tree walk_gimple_stmt (gimple_stmt_iterator *, walk_stmt_fn, walk_tree_fn,
4707 struct walk_stmt_info *);
4708 tree walk_gimple_op (gimple, walk_tree_fn, struct walk_stmt_info *);
4710 #ifdef GATHER_STATISTICS
4711 /* Enum and arrays used for allocation stats. Keep in sync with
4712 gimple.c:gimple_alloc_kind_names. */
4713 enum gimple_alloc_kind
4715 gimple_alloc_kind_assign, /* Assignments. */
4716 gimple_alloc_kind_phi, /* PHI nodes. */
4717 gimple_alloc_kind_cond, /* Conditionals. */
4718 gimple_alloc_kind_seq, /* Sequences. */
4719 gimple_alloc_kind_rest, /* Everything else. */
4720 gimple_alloc_kind_all
4723 extern int gimple_alloc_counts[];
4724 extern int gimple_alloc_sizes[];
4726 /* Return the allocation kind for a given stmt CODE. */
4727 static inline enum gimple_alloc_kind
4728 gimple_alloc_kind (enum gimple_code code)
4730 switch (code)
4732 case GIMPLE_ASSIGN:
4733 return gimple_alloc_kind_assign;
4734 case GIMPLE_PHI:
4735 return gimple_alloc_kind_phi;
4736 case GIMPLE_COND:
4737 return gimple_alloc_kind_cond;
4738 default:
4739 return gimple_alloc_kind_rest;
4742 #endif /* GATHER_STATISTICS */
4744 extern void dump_gimple_statistics (void);
4746 #endif /* GCC_GIMPLE_H */