OSDN Git Service

Merge from transactional-memory branch.
[pf3gnuchains/gcc-fork.git] / gcc / gimple.h
1 /* Gimple IR definitions.
2
3    Copyright 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4    Contributed by Aldy Hernandez <aldyh@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #ifndef GCC_GIMPLE_H
23 #define GCC_GIMPLE_H
24
25 #include "pointer-set.h"
26 #include "vec.h"
27 #include "vecprim.h"
28 #include "vecir.h"
29 #include "ggc.h"
30 #include "basic-block.h"
31 #include "tree-ssa-operands.h"
32 #include "tree-ssa-alias.h"
33 #include "internal-fn.h"
34
35 struct gimple_seq_node_d;
36 typedef struct gimple_seq_node_d *gimple_seq_node;
37 typedef const struct gimple_seq_node_d *const_gimple_seq_node;
38
39 /* For each block, the PHI nodes that need to be rewritten are stored into
40    these vectors.  */
41 typedef VEC(gimple, heap) *gimple_vec;
42 DEF_VEC_P (gimple_vec);
43 DEF_VEC_ALLOC_P (gimple_vec, heap);
44
45 enum gimple_code {
46 #define DEFGSCODE(SYM, STRING, STRUCT)  SYM,
47 #include "gimple.def"
48 #undef DEFGSCODE
49     LAST_AND_UNUSED_GIMPLE_CODE
50 };
51
52 extern const char *const gimple_code_name[];
53 extern const unsigned char gimple_rhs_class_table[];
54
55 /* Error out if a gimple tuple is addressed incorrectly.  */
56 #if defined ENABLE_GIMPLE_CHECKING
57 #define gcc_gimple_checking_assert(EXPR) gcc_assert (EXPR)
58 extern void gimple_check_failed (const_gimple, const char *, int,          \
59                                  const char *, enum gimple_code,           \
60                                  enum tree_code) ATTRIBUTE_NORETURN;
61
62 #define GIMPLE_CHECK(GS, CODE)                                          \
63   do {                                                                  \
64     const_gimple __gs = (GS);                                           \
65     if (gimple_code (__gs) != (CODE))                                   \
66       gimple_check_failed (__gs, __FILE__, __LINE__, __FUNCTION__,      \
67                            (CODE), ERROR_MARK);                         \
68   } while (0)
69 #else  /* not ENABLE_GIMPLE_CHECKING  */
70 #define gcc_gimple_checking_assert(EXPR) ((void)(0 && (EXPR)))
71 #define GIMPLE_CHECK(GS, CODE)                  (void)0
72 #endif
73
74 /* Class of GIMPLE expressions suitable for the RHS of assignments.  See
75    get_gimple_rhs_class.  */
76 enum gimple_rhs_class
77 {
78   GIMPLE_INVALID_RHS,   /* The expression cannot be used on the RHS.  */
79   GIMPLE_TERNARY_RHS,   /* The expression is a ternary operation.  */
80   GIMPLE_BINARY_RHS,    /* The expression is a binary operation.  */
81   GIMPLE_UNARY_RHS,     /* The expression is a unary operation.  */
82   GIMPLE_SINGLE_RHS     /* The expression is a single object (an SSA
83                            name, a _DECL, a _REF, etc.  */
84 };
85
86 /* Specific flags for individual GIMPLE statements.  These flags are
87    always stored in gimple_statement_base.subcode and they may only be
88    defined for statement codes that do not use sub-codes.
89
90    Values for the masks can overlap as long as the overlapping values
91    are never used in the same statement class.
92
93    The maximum mask value that can be defined is 1 << 15 (i.e., each
94    statement code can hold up to 16 bitflags).
95
96    Keep this list sorted.  */
97 enum gf_mask {
98     GF_ASM_INPUT                = 1 << 0,
99     GF_ASM_VOLATILE             = 1 << 1,
100     GF_CALL_CANNOT_INLINE       = 1 << 0,
101     GF_CALL_FROM_THUNK          = 1 << 1,
102     GF_CALL_RETURN_SLOT_OPT     = 1 << 2,
103     GF_CALL_TAILCALL            = 1 << 3,
104     GF_CALL_VA_ARG_PACK         = 1 << 4,
105     GF_CALL_NOTHROW             = 1 << 5,
106     GF_CALL_ALLOCA_FOR_VAR      = 1 << 6,
107     GF_CALL_INTERNAL            = 1 << 7,
108     GF_OMP_PARALLEL_COMBINED    = 1 << 0,
109
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,
115
116     GF_OMP_SECTION_LAST         = 1 << 0,
117     GF_OMP_ATOMIC_NEED_VALUE    = 1 << 0,
118     GF_PREDICT_TAKEN            = 1 << 15
119 };
120
121 /* Currently, there are only two types of gimple debug stmt.  Others are
122    envisioned, for example, to enable the generation of is_stmt notes
123    in line number information, to mark sequence points, etc.  This
124    subcode is to be used to tell them apart.  */
125 enum gimple_debug_subcode {
126   GIMPLE_DEBUG_BIND = 0,
127   GIMPLE_DEBUG_SOURCE_BIND = 1
128 };
129
130 /* Masks for selecting a pass local flag (PLF) to work on.  These
131    masks are used by gimple_set_plf and gimple_plf.  */
132 enum plf_mask {
133     GF_PLF_1    = 1 << 0,
134     GF_PLF_2    = 1 << 1
135 };
136
137 /* A node in a gimple_seq_d.  */
138 struct GTY((chain_next ("%h.next"), chain_prev ("%h.prev"))) gimple_seq_node_d {
139   gimple stmt;
140   struct gimple_seq_node_d *prev;
141   struct gimple_seq_node_d *next;
142 };
143
144 /* A double-linked sequence of gimple statements.  */
145 struct GTY ((chain_next ("%h.next_free"))) gimple_seq_d {
146   /* First and last statements in the sequence.  */
147   gimple_seq_node first;
148   gimple_seq_node last;
149
150   /* Sequences are created/destroyed frequently.  To minimize
151      allocation activity, deallocated sequences are kept in a pool of
152      available sequences.  This is the pointer to the next free
153      sequence in the pool.  */
154   gimple_seq next_free;
155 };
156
157
158 /* Return the first node in GIMPLE sequence S.  */
159
160 static inline gimple_seq_node
161 gimple_seq_first (const_gimple_seq s)
162 {
163   return s ? s->first : NULL;
164 }
165
166
167 /* Return the first statement in GIMPLE sequence S.  */
168
169 static inline gimple
170 gimple_seq_first_stmt (const_gimple_seq s)
171 {
172   gimple_seq_node n = gimple_seq_first (s);
173   return (n) ? n->stmt : NULL;
174 }
175
176
177 /* Return the last node in GIMPLE sequence S.  */
178
179 static inline gimple_seq_node
180 gimple_seq_last (const_gimple_seq s)
181 {
182   return s ? s->last : NULL;
183 }
184
185
186 /* Return the last statement in GIMPLE sequence S.  */
187
188 static inline gimple
189 gimple_seq_last_stmt (const_gimple_seq s)
190 {
191   gimple_seq_node n = gimple_seq_last (s);
192   return (n) ? n->stmt : NULL;
193 }
194
195
196 /* Set the last node in GIMPLE sequence S to LAST.  */
197
198 static inline void
199 gimple_seq_set_last (gimple_seq s, gimple_seq_node last)
200 {
201   s->last = last;
202 }
203
204
205 /* Set the first node in GIMPLE sequence S to FIRST.  */
206
207 static inline void
208 gimple_seq_set_first (gimple_seq s, gimple_seq_node first)
209 {
210   s->first = first;
211 }
212
213
214 /* Return true if GIMPLE sequence S is empty.  */
215
216 static inline bool
217 gimple_seq_empty_p (const_gimple_seq s)
218 {
219   return s == NULL || s->first == NULL;
220 }
221
222
223 void gimple_seq_add_stmt (gimple_seq *, gimple);
224
225 /* Link gimple statement GS to the end of the sequence *SEQ_P.  If
226    *SEQ_P is NULL, a new sequence is allocated.  This function is
227    similar to gimple_seq_add_stmt, but does not scan the operands.
228    During gimplification, we need to manipulate statement sequences
229    before the def/use vectors have been constructed.  */
230 void gimplify_seq_add_stmt (gimple_seq *, gimple);
231
232 /* Allocate a new sequence and initialize its first element with STMT.  */
233
234 static inline gimple_seq
235 gimple_seq_alloc_with_stmt (gimple stmt)
236 {
237   gimple_seq seq = NULL;
238   gimple_seq_add_stmt (&seq, stmt);
239   return seq;
240 }
241
242
243 /* Returns the sequence of statements in BB.  */
244
245 static inline gimple_seq
246 bb_seq (const_basic_block bb)
247 {
248   return (!(bb->flags & BB_RTL) && bb->il.gimple) ? bb->il.gimple->seq : NULL;
249 }
250
251
252 /* Sets the sequence of statements in BB to SEQ.  */
253
254 static inline void
255 set_bb_seq (basic_block bb, gimple_seq seq)
256 {
257   gcc_checking_assert (!(bb->flags & BB_RTL));
258   bb->il.gimple->seq = seq;
259 }
260
261 /* Iterator object for GIMPLE statement sequences.  */
262
263 typedef struct
264 {
265   /* Sequence node holding the current statement.  */
266   gimple_seq_node ptr;
267
268   /* Sequence and basic block holding the statement.  These fields
269      are necessary to handle edge cases such as when statement is
270      added to an empty basic block or when the last statement of a
271      block/sequence is removed.  */
272   gimple_seq seq;
273   basic_block bb;
274 } gimple_stmt_iterator;
275
276
277 /* Data structure definitions for GIMPLE tuples.  NOTE: word markers
278    are for 64 bit hosts.  */
279
280 struct GTY(()) gimple_statement_base {
281   /* [ WORD 1 ]
282      Main identifying code for a tuple.  */
283   ENUM_BITFIELD(gimple_code) code : 8;
284
285   /* Nonzero if a warning should not be emitted on this tuple.  */
286   unsigned int no_warning       : 1;
287
288   /* Nonzero if this tuple has been visited.  Passes are responsible
289      for clearing this bit before using it.  */
290   unsigned int visited          : 1;
291
292   /* Nonzero if this tuple represents a non-temporal move.  */
293   unsigned int nontemporal_move : 1;
294
295   /* Pass local flags.  These flags are free for any pass to use as
296      they see fit.  Passes should not assume that these flags contain
297      any useful value when the pass starts.  Any initial state that
298      the pass requires should be set on entry to the pass.  See
299      gimple_set_plf and gimple_plf for usage.  */
300   unsigned int plf              : 2;
301
302   /* Nonzero if this statement has been modified and needs to have its
303      operands rescanned.  */
304   unsigned modified             : 1;
305
306   /* Nonzero if this statement contains volatile operands.  */
307   unsigned has_volatile_ops     : 1;
308
309   /* Padding to get subcode to 16 bit alignment.  */
310   unsigned pad                  : 1;
311
312   /* The SUBCODE field can be used for tuple-specific flags for tuples
313      that do not require subcodes.  Note that SUBCODE should be at
314      least as wide as tree codes, as several tuples store tree codes
315      in there.  */
316   unsigned int subcode          : 16;
317
318   /* UID of this statement.  This is used by passes that want to
319      assign IDs to statements.  It must be assigned and used by each
320      pass.  By default it should be assumed to contain garbage.  */
321   unsigned uid;
322
323   /* [ WORD 2 ]
324      Locus information for debug info.  */
325   location_t location;
326
327   /* Number of operands in this tuple.  */
328   unsigned num_ops;
329
330   /* [ WORD 3 ]
331      Basic block holding this statement.  */
332   struct basic_block_def *bb;
333
334   /* [ WORD 4 ]
335      Lexical block holding this statement.  */
336   tree block;
337 };
338
339
340 /* Base structure for tuples with operands.  */
341
342 struct GTY(()) gimple_statement_with_ops_base
343 {
344   /* [ WORD 1-4 ]  */
345   struct gimple_statement_base gsbase;
346
347   /* [ WORD 5-6 ]
348      SSA operand vectors.  NOTE: It should be possible to
349      amalgamate these vectors with the operand vector OP.  However,
350      the SSA operand vectors are organized differently and contain
351      more information (like immediate use chaining).  */
352   struct def_optype_d GTY((skip (""))) *def_ops;
353   struct use_optype_d GTY((skip (""))) *use_ops;
354 };
355
356
357 /* Statements that take register operands.  */
358
359 struct GTY(()) gimple_statement_with_ops
360 {
361   /* [ WORD 1-6 ]  */
362   struct gimple_statement_with_ops_base opbase;
363
364   /* [ WORD 7 ]
365      Operand vector.  NOTE!  This must always be the last field
366      of this structure.  In particular, this means that this
367      structure cannot be embedded inside another one.  */
368   tree GTY((length ("%h.opbase.gsbase.num_ops"))) op[1];
369 };
370
371
372 /* Base for statements that take both memory and register operands.  */
373
374 struct GTY(()) gimple_statement_with_memory_ops_base
375 {
376   /* [ WORD 1-6 ]  */
377   struct gimple_statement_with_ops_base opbase;
378
379   /* [ WORD 7-8 ]
380      Virtual operands for this statement.  The GC will pick them
381      up via the ssa_names array.  */
382   tree GTY((skip (""))) vdef;
383   tree GTY((skip (""))) vuse;
384 };
385
386
387 /* Statements that take both memory and register operands.  */
388
389 struct GTY(()) gimple_statement_with_memory_ops
390 {
391   /* [ WORD 1-8 ]  */
392   struct gimple_statement_with_memory_ops_base membase;
393
394   /* [ WORD 9 ]
395      Operand vector.  NOTE!  This must always be the last field
396      of this structure.  In particular, this means that this
397      structure cannot be embedded inside another one.  */
398   tree GTY((length ("%h.membase.opbase.gsbase.num_ops"))) op[1];
399 };
400
401
402 /* Call statements that take both memory and register operands.  */
403
404 struct GTY(()) gimple_statement_call
405 {
406   /* [ WORD 1-8 ]  */
407   struct gimple_statement_with_memory_ops_base membase;
408
409   /* [ WORD 9-12 ]  */
410   struct pt_solution call_used;
411   struct pt_solution call_clobbered;
412
413   /* [ WORD 13 ]  */
414   union GTY ((desc ("%1.membase.opbase.gsbase.subcode & GF_CALL_INTERNAL"))) {
415     tree GTY ((tag ("0"))) fntype;
416     enum internal_fn GTY ((tag ("GF_CALL_INTERNAL"))) internal_fn;
417   } u;
418
419   /* [ WORD 14 ]
420      Operand vector.  NOTE!  This must always be the last field
421      of this structure.  In particular, this means that this
422      structure cannot be embedded inside another one.  */
423   tree GTY((length ("%h.membase.opbase.gsbase.num_ops"))) op[1];
424 };
425
426
427 /* OpenMP statements (#pragma omp).  */
428
429 struct GTY(()) gimple_statement_omp {
430   /* [ WORD 1-4 ]  */
431   struct gimple_statement_base gsbase;
432
433   /* [ WORD 5 ]  */
434   gimple_seq body;
435 };
436
437
438 /* GIMPLE_BIND */
439
440 struct GTY(()) gimple_statement_bind {
441   /* [ WORD 1-4 ]  */
442   struct gimple_statement_base gsbase;
443
444   /* [ WORD 5 ]
445      Variables declared in this scope.  */
446   tree vars;
447
448   /* [ WORD 6 ]
449      This is different than the BLOCK field in gimple_statement_base,
450      which is analogous to TREE_BLOCK (i.e., the lexical block holding
451      this statement).  This field is the equivalent of BIND_EXPR_BLOCK
452      in tree land (i.e., the lexical scope defined by this bind).  See
453      gimple-low.c.  */
454   tree block;
455
456   /* [ WORD 7 ]  */
457   gimple_seq body;
458 };
459
460
461 /* GIMPLE_CATCH */
462
463 struct GTY(()) gimple_statement_catch {
464   /* [ WORD 1-4 ]  */
465   struct gimple_statement_base gsbase;
466
467   /* [ WORD 5 ]  */
468   tree types;
469
470   /* [ WORD 6 ]  */
471   gimple_seq handler;
472 };
473
474
475 /* GIMPLE_EH_FILTER */
476
477 struct GTY(()) gimple_statement_eh_filter {
478   /* [ WORD 1-4 ]  */
479   struct gimple_statement_base gsbase;
480
481   /* [ WORD 5 ]
482      Filter types.  */
483   tree types;
484
485   /* [ WORD 6 ]
486      Failure actions.  */
487   gimple_seq failure;
488 };
489
490 /* GIMPLE_EH_ELSE */
491
492 struct GTY(()) gimple_statement_eh_else {
493   /* [ WORD 1-4 ]  */
494   struct gimple_statement_base gsbase;
495
496   /* [ WORD 5,6 ] */
497   gimple_seq n_body, e_body;
498 };
499
500 /* GIMPLE_EH_MUST_NOT_THROW */
501
502 struct GTY(()) gimple_statement_eh_mnt {
503   /* [ WORD 1-4 ]  */
504   struct gimple_statement_base gsbase;
505
506   /* [ WORD 5 ] Abort function decl.  */
507   tree fndecl;
508 };
509
510 /* GIMPLE_PHI */
511
512 struct GTY(()) gimple_statement_phi {
513   /* [ WORD 1-4 ]  */
514   struct gimple_statement_base gsbase;
515
516   /* [ WORD 5 ]  */
517   unsigned capacity;
518   unsigned nargs;
519
520   /* [ WORD 6 ]  */
521   tree result;
522
523   /* [ WORD 7 ]  */
524   struct phi_arg_d GTY ((length ("%h.nargs"))) args[1];
525 };
526
527
528 /* GIMPLE_RESX, GIMPLE_EH_DISPATCH */
529
530 struct GTY(()) gimple_statement_eh_ctrl
531 {
532   /* [ WORD 1-4 ]  */
533   struct gimple_statement_base gsbase;
534
535   /* [ WORD 5 ]
536      Exception region number.  */
537   int region;
538 };
539
540
541 /* GIMPLE_TRY */
542
543 struct GTY(()) gimple_statement_try {
544   /* [ WORD 1-4 ]  */
545   struct gimple_statement_base gsbase;
546
547   /* [ WORD 5 ]
548      Expression to evaluate.  */
549   gimple_seq eval;
550
551   /* [ WORD 6 ]
552      Cleanup expression.  */
553   gimple_seq cleanup;
554 };
555
556 /* Kind of GIMPLE_TRY statements.  */
557 enum gimple_try_flags
558 {
559   /* A try/catch.  */
560   GIMPLE_TRY_CATCH = 1 << 0,
561
562   /* A try/finally.  */
563   GIMPLE_TRY_FINALLY = 1 << 1,
564   GIMPLE_TRY_KIND = GIMPLE_TRY_CATCH | GIMPLE_TRY_FINALLY,
565
566   /* Analogous to TRY_CATCH_IS_CLEANUP.  */
567   GIMPLE_TRY_CATCH_IS_CLEANUP = 1 << 2
568 };
569
570 /* GIMPLE_WITH_CLEANUP_EXPR */
571
572 struct GTY(()) gimple_statement_wce {
573   /* [ WORD 1-4 ]  */
574   struct gimple_statement_base gsbase;
575
576   /* Subcode: CLEANUP_EH_ONLY.  True if the cleanup should only be
577               executed if an exception is thrown, not on normal exit of its
578               scope.  This flag is analogous to the CLEANUP_EH_ONLY flag
579               in TARGET_EXPRs.  */
580
581   /* [ WORD 5 ]
582      Cleanup expression.  */
583   gimple_seq cleanup;
584 };
585
586
587 /* GIMPLE_ASM  */
588
589 struct GTY(()) gimple_statement_asm
590 {
591   /* [ WORD 1-8 ]  */
592   struct gimple_statement_with_memory_ops_base membase;
593
594   /* [ WORD 9 ]
595      __asm__ statement.  */
596   const char *string;
597
598   /* [ WORD 10 ]
599        Number of inputs, outputs, clobbers, labels.  */
600   unsigned char ni;
601   unsigned char no;
602   unsigned char nc;
603   unsigned char nl;
604
605   /* [ WORD 11 ]
606      Operand vector.  NOTE!  This must always be the last field
607      of this structure.  In particular, this means that this
608      structure cannot be embedded inside another one.  */
609   tree GTY((length ("%h.membase.opbase.gsbase.num_ops"))) op[1];
610 };
611
612 /* GIMPLE_OMP_CRITICAL */
613
614 struct GTY(()) gimple_statement_omp_critical {
615   /* [ WORD 1-5 ]  */
616   struct gimple_statement_omp omp;
617
618   /* [ WORD 6 ]
619      Critical section name.  */
620   tree name;
621 };
622
623
624 struct GTY(()) gimple_omp_for_iter {
625   /* Condition code.  */
626   enum tree_code cond;
627
628   /* Index variable.  */
629   tree index;
630
631   /* Initial value.  */
632   tree initial;
633
634   /* Final value.  */
635   tree final;
636
637   /* Increment.  */
638   tree incr;
639 };
640
641 /* GIMPLE_OMP_FOR */
642
643 struct GTY(()) gimple_statement_omp_for {
644   /* [ WORD 1-5 ]  */
645   struct gimple_statement_omp omp;
646
647   /* [ WORD 6 ]  */
648   tree clauses;
649
650   /* [ WORD 7 ]
651      Number of elements in iter array.  */
652   size_t collapse;
653
654   /* [ WORD 8 ]  */
655   struct gimple_omp_for_iter * GTY((length ("%h.collapse"))) iter;
656
657   /* [ WORD 9 ]
658      Pre-body evaluated before the loop body begins.  */
659   gimple_seq pre_body;
660 };
661
662
663 /* GIMPLE_OMP_PARALLEL */
664
665 struct GTY(()) gimple_statement_omp_parallel {
666   /* [ WORD 1-5 ]  */
667   struct gimple_statement_omp omp;
668
669   /* [ WORD 6 ]
670      Clauses.  */
671   tree clauses;
672
673   /* [ WORD 7 ]
674      Child function holding the body of the parallel region.  */
675   tree child_fn;
676
677   /* [ WORD 8 ]
678      Shared data argument.  */
679   tree data_arg;
680 };
681
682
683 /* GIMPLE_OMP_TASK */
684
685 struct GTY(()) gimple_statement_omp_task {
686   /* [ WORD 1-8 ]  */
687   struct gimple_statement_omp_parallel par;
688
689   /* [ WORD 9 ]
690      Child function holding firstprivate initialization if needed.  */
691   tree copy_fn;
692
693   /* [ WORD 10-11 ]
694      Size and alignment in bytes of the argument data block.  */
695   tree arg_size;
696   tree arg_align;
697 };
698
699
700 /* GIMPLE_OMP_SECTION */
701 /* Uses struct gimple_statement_omp.  */
702
703
704 /* GIMPLE_OMP_SECTIONS */
705
706 struct GTY(()) gimple_statement_omp_sections {
707   /* [ WORD 1-5 ]  */
708   struct gimple_statement_omp omp;
709
710   /* [ WORD 6 ]  */
711   tree clauses;
712
713   /* [ WORD 7 ]
714      The control variable used for deciding which of the sections to
715      execute.  */
716   tree control;
717 };
718
719 /* GIMPLE_OMP_CONTINUE.
720
721    Note: This does not inherit from gimple_statement_omp, because we
722          do not need the body field.  */
723
724 struct GTY(()) gimple_statement_omp_continue {
725   /* [ WORD 1-4 ]  */
726   struct gimple_statement_base gsbase;
727
728   /* [ WORD 5 ]  */
729   tree control_def;
730
731   /* [ WORD 6 ]  */
732   tree control_use;
733 };
734
735 /* GIMPLE_OMP_SINGLE */
736
737 struct GTY(()) gimple_statement_omp_single {
738   /* [ WORD 1-5 ]  */
739   struct gimple_statement_omp omp;
740
741   /* [ WORD 6 ]  */
742   tree clauses;
743 };
744
745
746 /* GIMPLE_OMP_ATOMIC_LOAD.
747    Note: This is based on gimple_statement_base, not g_s_omp, because g_s_omp
748    contains a sequence, which we don't need here.  */
749
750 struct GTY(()) gimple_statement_omp_atomic_load {
751   /* [ WORD 1-4 ]  */
752   struct gimple_statement_base gsbase;
753
754   /* [ WORD 5-6 ]  */
755   tree rhs, lhs;
756 };
757
758 /* GIMPLE_OMP_ATOMIC_STORE.
759    See note on GIMPLE_OMP_ATOMIC_LOAD.  */
760
761 struct GTY(()) gimple_statement_omp_atomic_store {
762   /* [ WORD 1-4 ]  */
763   struct gimple_statement_base gsbase;
764
765   /* [ WORD 5 ]  */
766   tree val;
767 };
768
769 /* GIMPLE_TRANSACTION.  */
770
771 /* Bits to be stored in the GIMPLE_TRANSACTION subcode.  */
772
773 /* The __transaction_atomic was declared [[outer]] or it is
774    __transaction_relaxed.  */
775 #define GTMA_IS_OUTER                   (1u << 0)
776 #define GTMA_IS_RELAXED                 (1u << 1)
777 #define GTMA_DECLARATION_MASK           (GTMA_IS_OUTER | GTMA_IS_RELAXED)
778
779 /* The transaction is seen to not have an abort.  */
780 #define GTMA_HAVE_ABORT                 (1u << 2)
781 /* The transaction is seen to have loads or stores.  */
782 #define GTMA_HAVE_LOAD                  (1u << 3)
783 #define GTMA_HAVE_STORE                 (1u << 4)
784 /* The transaction MAY enter serial irrevocable mode in its dynamic scope.  */
785 #define GTMA_MAY_ENTER_IRREVOCABLE      (1u << 5)
786 /* The transaction WILL enter serial irrevocable mode.
787    An irrevocable block post-dominates the entire transaction, such
788    that all invocations of the transaction will go serial-irrevocable.
789    In such case, we don't bother instrumenting the transaction, and
790    tell the runtime that it should begin the transaction in
791    serial-irrevocable mode.  */
792 #define GTMA_DOES_GO_IRREVOCABLE        (1u << 6)
793
794 struct GTY(()) gimple_statement_transaction
795 {
796   /* [ WORD 1-10 ]  */
797   struct gimple_statement_with_memory_ops_base gsbase;
798
799   /* [ WORD 11 ] */
800   gimple_seq body;
801
802   /* [ WORD 12 ] */
803   tree label;
804 };
805
806 #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP)   SYM,
807 enum gimple_statement_structure_enum {
808 #include "gsstruct.def"
809     LAST_GSS_ENUM
810 };
811 #undef DEFGSSTRUCT
812
813
814 /* Define the overall contents of a gimple tuple.  It may be any of the
815    structures declared above for various types of tuples.  */
816
817 union GTY ((desc ("gimple_statement_structure (&%h)"), variable_size)) gimple_statement_d {
818   struct gimple_statement_base GTY ((tag ("GSS_BASE"))) gsbase;
819   struct gimple_statement_with_ops GTY ((tag ("GSS_WITH_OPS"))) gsops;
820   struct gimple_statement_with_memory_ops_base GTY ((tag ("GSS_WITH_MEM_OPS_BASE"))) gsmembase;
821   struct gimple_statement_with_memory_ops GTY ((tag ("GSS_WITH_MEM_OPS"))) gsmem;
822   struct gimple_statement_call GTY ((tag ("GSS_CALL"))) gimple_call;
823   struct gimple_statement_omp GTY ((tag ("GSS_OMP"))) omp;
824   struct gimple_statement_bind GTY ((tag ("GSS_BIND"))) gimple_bind;
825   struct gimple_statement_catch GTY ((tag ("GSS_CATCH"))) gimple_catch;
826   struct gimple_statement_eh_filter GTY ((tag ("GSS_EH_FILTER"))) gimple_eh_filter;
827   struct gimple_statement_eh_mnt GTY ((tag ("GSS_EH_MNT"))) gimple_eh_mnt;
828   struct gimple_statement_eh_else GTY ((tag ("GSS_EH_ELSE"))) gimple_eh_else;
829   struct gimple_statement_phi GTY ((tag ("GSS_PHI"))) gimple_phi;
830   struct gimple_statement_eh_ctrl GTY ((tag ("GSS_EH_CTRL"))) gimple_eh_ctrl;
831   struct gimple_statement_try GTY ((tag ("GSS_TRY"))) gimple_try;
832   struct gimple_statement_wce GTY ((tag ("GSS_WCE"))) gimple_wce;
833   struct gimple_statement_asm GTY ((tag ("GSS_ASM"))) gimple_asm;
834   struct gimple_statement_omp_critical GTY ((tag ("GSS_OMP_CRITICAL"))) gimple_omp_critical;
835   struct gimple_statement_omp_for GTY ((tag ("GSS_OMP_FOR"))) gimple_omp_for;
836   struct gimple_statement_omp_parallel GTY ((tag ("GSS_OMP_PARALLEL"))) gimple_omp_parallel;
837   struct gimple_statement_omp_task GTY ((tag ("GSS_OMP_TASK"))) gimple_omp_task;
838   struct gimple_statement_omp_sections GTY ((tag ("GSS_OMP_SECTIONS"))) gimple_omp_sections;
839   struct gimple_statement_omp_single GTY ((tag ("GSS_OMP_SINGLE"))) gimple_omp_single;
840   struct gimple_statement_omp_continue GTY ((tag ("GSS_OMP_CONTINUE"))) gimple_omp_continue;
841   struct gimple_statement_omp_atomic_load GTY ((tag ("GSS_OMP_ATOMIC_LOAD"))) gimple_omp_atomic_load;
842   struct gimple_statement_omp_atomic_store GTY ((tag ("GSS_OMP_ATOMIC_STORE"))) gimple_omp_atomic_store;
843   struct gimple_statement_transaction GTY((tag ("GSS_TRANSACTION"))) gimple_transaction;
844 };
845
846 /* In gimple.c.  */
847
848 /* Offset in bytes to the location of the operand vector.
849    Zero if there is no operand vector for this tuple structure.  */
850 extern size_t const gimple_ops_offset_[];
851
852 /* Map GIMPLE codes to GSS codes.  */
853 extern enum gimple_statement_structure_enum const gss_for_code_[];
854
855 /* This variable holds the currently expanded gimple statement for purposes
856    of comminucating the profile info to the builtin expanders.  */
857 extern gimple currently_expanding_gimple_stmt;
858
859 gimple gimple_build_return (tree);
860
861 gimple gimple_build_assign_stat (tree, tree MEM_STAT_DECL);
862 #define gimple_build_assign(l,r) gimple_build_assign_stat (l, r MEM_STAT_INFO)
863
864 void extract_ops_from_tree_1 (tree, enum tree_code *, tree *, tree *, tree *);
865
866 gimple gimple_build_assign_with_ops_stat (enum tree_code, tree, tree,
867                                           tree, tree MEM_STAT_DECL);
868 #define gimple_build_assign_with_ops(c,o1,o2,o3)                        \
869   gimple_build_assign_with_ops_stat (c, o1, o2, o3, NULL_TREE MEM_STAT_INFO)
870 #define gimple_build_assign_with_ops3(c,o1,o2,o3,o4)                    \
871   gimple_build_assign_with_ops_stat (c, o1, o2, o3, o4 MEM_STAT_INFO)
872
873 gimple gimple_build_debug_bind_stat (tree, tree, gimple MEM_STAT_DECL);
874 #define gimple_build_debug_bind(var,val,stmt)                   \
875   gimple_build_debug_bind_stat ((var), (val), (stmt) MEM_STAT_INFO)
876 gimple gimple_build_debug_source_bind_stat (tree, tree, gimple MEM_STAT_DECL);
877 #define gimple_build_debug_source_bind(var,val,stmt)                    \
878   gimple_build_debug_source_bind_stat ((var), (val), (stmt) MEM_STAT_INFO)
879
880 gimple gimple_build_call_vec (tree, VEC(tree, heap) *);
881 gimple gimple_build_call (tree, unsigned, ...);
882 gimple gimple_build_call_valist (tree, unsigned, va_list);
883 gimple gimple_build_call_internal (enum internal_fn, unsigned, ...);
884 gimple gimple_build_call_internal_vec (enum internal_fn, VEC(tree, heap) *);
885 gimple gimple_build_call_from_tree (tree);
886 gimple gimplify_assign (tree, tree, gimple_seq *);
887 gimple gimple_build_cond (enum tree_code, tree, tree, tree, tree);
888 gimple gimple_build_label (tree label);
889 gimple gimple_build_goto (tree dest);
890 gimple gimple_build_nop (void);
891 gimple gimple_build_bind (tree, gimple_seq, tree);
892 gimple gimple_build_asm_vec (const char *, VEC(tree,gc) *, VEC(tree,gc) *,
893                              VEC(tree,gc) *, VEC(tree,gc) *);
894 gimple gimple_build_catch (tree, gimple_seq);
895 gimple gimple_build_eh_filter (tree, gimple_seq);
896 gimple gimple_build_eh_must_not_throw (tree);
897 gimple gimple_build_eh_else (gimple_seq, gimple_seq);
898 gimple gimple_build_try (gimple_seq, gimple_seq, enum gimple_try_flags);
899 gimple gimple_build_wce (gimple_seq);
900 gimple gimple_build_resx (int);
901 gimple gimple_build_eh_dispatch (int);
902 gimple gimple_build_switch_nlabels (unsigned, tree, tree);
903 gimple gimple_build_switch (unsigned, tree, tree, ...);
904 gimple gimple_build_switch_vec (tree, tree, VEC(tree,heap) *);
905 gimple gimple_build_omp_parallel (gimple_seq, tree, tree, tree);
906 gimple gimple_build_omp_task (gimple_seq, tree, tree, tree, tree, tree, tree);
907 gimple gimple_build_omp_for (gimple_seq, tree, size_t, gimple_seq);
908 gimple gimple_build_omp_critical (gimple_seq, tree);
909 gimple gimple_build_omp_section (gimple_seq);
910 gimple gimple_build_omp_continue (tree, tree);
911 gimple gimple_build_omp_master (gimple_seq);
912 gimple gimple_build_omp_return (bool);
913 gimple gimple_build_omp_ordered (gimple_seq);
914 gimple gimple_build_omp_sections (gimple_seq, tree);
915 gimple gimple_build_omp_sections_switch (void);
916 gimple gimple_build_omp_single (gimple_seq, tree);
917 gimple gimple_build_cdt (tree, tree);
918 gimple gimple_build_omp_atomic_load (tree, tree);
919 gimple gimple_build_omp_atomic_store (tree);
920 gimple gimple_build_transaction (gimple_seq, tree);
921 gimple gimple_build_predict (enum br_predictor, enum prediction);
922 enum gimple_statement_structure_enum gss_for_assign (enum tree_code);
923 void sort_case_labels (VEC(tree,heap) *);
924 void gimple_set_body (tree, gimple_seq);
925 gimple_seq gimple_body (tree);
926 bool gimple_has_body_p (tree);
927 gimple_seq gimple_seq_alloc (void);
928 void gimple_seq_free (gimple_seq);
929 void gimple_seq_add_seq (gimple_seq *, gimple_seq);
930 gimple_seq gimple_seq_copy (gimple_seq);
931 bool gimple_call_same_target_p (const_gimple, const_gimple);
932 int gimple_call_flags (const_gimple);
933 int gimple_call_return_flags (const_gimple);
934 int gimple_call_arg_flags (const_gimple, unsigned);
935 void gimple_call_reset_alias_info (gimple);
936 bool gimple_assign_copy_p (gimple);
937 bool gimple_assign_ssa_name_copy_p (gimple);
938 bool gimple_assign_unary_nop_p (gimple);
939 void gimple_set_bb (gimple, struct basic_block_def *);
940 void gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *, tree);
941 void gimple_assign_set_rhs_with_ops_1 (gimple_stmt_iterator *, enum tree_code,
942                                        tree, tree, tree);
943 tree gimple_get_lhs (const_gimple);
944 void gimple_set_lhs (gimple, tree);
945 void gimple_replace_lhs (gimple, tree);
946 gimple gimple_copy (gimple);
947 void gimple_set_modified (gimple, bool);
948 void gimple_cond_get_ops_from_tree (tree, enum tree_code *, tree *, tree *);
949 gimple gimple_build_cond_from_tree (tree, tree, tree);
950 void gimple_cond_set_condition_from_tree (gimple, tree);
951 bool gimple_has_side_effects (const_gimple);
952 bool gimple_rhs_has_side_effects (const_gimple);
953 bool gimple_could_trap_p (gimple);
954 bool gimple_could_trap_p_1 (gimple, bool, bool);
955 bool gimple_assign_rhs_could_trap_p (gimple);
956 void gimple_regimplify_operands (gimple, gimple_stmt_iterator *);
957 bool empty_body_p (gimple_seq);
958 unsigned get_gimple_rhs_num_ops (enum tree_code);
959 #define gimple_alloc(c, n) gimple_alloc_stat (c, n MEM_STAT_INFO)
960 gimple gimple_alloc_stat (enum gimple_code, unsigned MEM_STAT_DECL);
961 const char *gimple_decl_printable_name (tree, int);
962 tree gimple_get_virt_method_for_binfo (HOST_WIDE_INT, tree);
963 void gimple_adjust_this_by_delta (gimple_stmt_iterator *, tree);
964 tree gimple_extract_devirt_binfo_from_cst (tree);
965 /* Returns true iff T is a valid GIMPLE statement.  */
966 extern bool is_gimple_stmt (tree);
967
968 /* Returns true iff TYPE is a valid type for a scalar register variable.  */
969 extern bool is_gimple_reg_type (tree);
970 /* Returns true iff T is a scalar register variable.  */
971 extern bool is_gimple_reg (tree);
972 /* Returns true iff T is any sort of variable.  */
973 extern bool is_gimple_variable (tree);
974 /* Returns true iff T is any sort of symbol.  */
975 extern bool is_gimple_id (tree);
976 /* Returns true iff T is a variable or an INDIRECT_REF (of a variable).  */
977 extern bool is_gimple_min_lval (tree);
978 /* Returns true iff T is something whose address can be taken.  */
979 extern bool is_gimple_addressable (tree);
980 /* Returns true iff T is any valid GIMPLE lvalue.  */
981 extern bool is_gimple_lvalue (tree);
982
983 /* Returns true iff T is a GIMPLE address.  */
984 bool is_gimple_address (const_tree);
985 /* Returns true iff T is a GIMPLE invariant address.  */
986 bool is_gimple_invariant_address (const_tree);
987 /* Returns true iff T is a GIMPLE invariant address at interprocedural
988    level.  */
989 bool is_gimple_ip_invariant_address (const_tree);
990 /* Returns true iff T is a valid GIMPLE constant.  */
991 bool is_gimple_constant (const_tree);
992 /* Returns true iff T is a GIMPLE restricted function invariant.  */
993 extern bool is_gimple_min_invariant (const_tree);
994 /* Returns true iff T is a GIMPLE restricted interprecodural invariant.  */
995 extern bool is_gimple_ip_invariant (const_tree);
996 /* Returns true iff T is a GIMPLE rvalue.  */
997 extern bool is_gimple_val (tree);
998 /* Returns true iff T is a GIMPLE asm statement input.  */
999 extern bool is_gimple_asm_val (tree);
1000 /* Returns true iff T is a valid address operand of a MEM_REF.  */
1001 bool is_gimple_mem_ref_addr (tree);
1002 /* Returns true iff T is a valid rhs for a MODIFY_EXPR where the LHS is a
1003    GIMPLE temporary, a renamed user variable, or something else,
1004    respectively.  */
1005 extern bool is_gimple_reg_rhs (tree);
1006 extern bool is_gimple_mem_rhs (tree);
1007
1008 /* Returns true iff T is a valid if-statement condition.  */
1009 extern bool is_gimple_condexpr (tree);
1010
1011 /* Returns true iff T is a variable that does not need to live in memory.  */
1012 extern bool is_gimple_non_addressable (tree t);
1013
1014 /* Returns true iff T is a valid call address expression.  */
1015 extern bool is_gimple_call_addr (tree);
1016
1017 extern void recalculate_side_effects (tree);
1018 extern bool gimple_compare_field_offset (tree, tree);
1019 extern tree gimple_register_type (tree);
1020 extern tree gimple_register_canonical_type (tree);
1021 extern void print_gimple_types_stats (void);
1022 extern void free_gimple_type_tables (void);
1023 extern tree gimple_unsigned_type (tree);
1024 extern tree gimple_signed_type (tree);
1025 extern alias_set_type gimple_get_alias_set (tree);
1026 extern void count_uses_and_derefs (tree, gimple, unsigned *, unsigned *,
1027                                    unsigned *);
1028 extern bool walk_stmt_load_store_addr_ops (gimple, void *,
1029                                            bool (*)(gimple, tree, void *),
1030                                            bool (*)(gimple, tree, void *),
1031                                            bool (*)(gimple, tree, void *));
1032 extern bool walk_stmt_load_store_ops (gimple, void *,
1033                                       bool (*)(gimple, tree, void *),
1034                                       bool (*)(gimple, tree, void *));
1035 extern bool gimple_ior_addresses_taken (bitmap, gimple);
1036 extern bool gimple_call_builtin_p (gimple, enum built_in_function);
1037 extern bool gimple_asm_clobbers_memory_p (const_gimple);
1038
1039 /* In gimplify.c  */
1040 extern tree create_tmp_var_raw (tree, const char *);
1041 extern tree create_tmp_var_name (const char *);
1042 extern tree create_tmp_var (tree, const char *);
1043 extern tree create_tmp_reg (tree, const char *);
1044 extern tree get_initialized_tmp_var (tree, gimple_seq *, gimple_seq *);
1045 extern tree get_formal_tmp_var (tree, gimple_seq *);
1046 extern void declare_vars (tree, gimple, bool);
1047 extern void annotate_all_with_location (gimple_seq, location_t);
1048
1049 /* Validation of GIMPLE expressions.  Note that these predicates only check
1050    the basic form of the expression, they don't recurse to make sure that
1051    underlying nodes are also of the right form.  */
1052 typedef bool (*gimple_predicate)(tree);
1053
1054
1055 /* FIXME we should deduce this from the predicate.  */
1056 enum fallback {
1057   fb_none = 0,          /* Do not generate a temporary.  */
1058
1059   fb_rvalue = 1,        /* Generate an rvalue to hold the result of a
1060                            gimplified expression.  */
1061
1062   fb_lvalue = 2,        /* Generate an lvalue to hold the result of a
1063                            gimplified expression.  */
1064
1065   fb_mayfail = 4,       /* Gimplification may fail.  Error issued
1066                            afterwards.  */
1067   fb_either= fb_rvalue | fb_lvalue
1068 };
1069
1070 typedef int fallback_t;
1071
1072 enum gimplify_status {
1073   GS_ERROR      = -2,   /* Something Bad Seen.  */
1074   GS_UNHANDLED  = -1,   /* A langhook result for "I dunno".  */
1075   GS_OK         = 0,    /* We did something, maybe more to do.  */
1076   GS_ALL_DONE   = 1     /* The expression is fully gimplified.  */
1077 };
1078
1079 struct gimplify_ctx
1080 {
1081   struct gimplify_ctx *prev_context;
1082
1083   VEC(gimple,heap) *bind_expr_stack;
1084   tree temps;
1085   gimple_seq conditional_cleanups;
1086   tree exit_label;
1087   tree return_temp;
1088
1089   VEC(tree,heap) *case_labels;
1090   /* The formal temporary table.  Should this be persistent?  */
1091   htab_t temp_htab;
1092
1093   int conditions;
1094   bool save_stack;
1095   bool into_ssa;
1096   bool allow_rhs_cond_expr;
1097 };
1098
1099 extern enum gimplify_status gimplify_expr (tree *, gimple_seq *, gimple_seq *,
1100                                            bool (*) (tree), fallback_t);
1101 extern void gimplify_type_sizes (tree, gimple_seq *);
1102 extern void gimplify_one_sizepos (tree *, gimple_seq *);
1103 extern bool gimplify_stmt (tree *, gimple_seq *);
1104 extern gimple gimplify_body (tree *, tree, bool);
1105 extern void push_gimplify_context (struct gimplify_ctx *);
1106 extern void pop_gimplify_context (gimple);
1107 extern void gimplify_and_add (tree, gimple_seq *);
1108
1109 /* Miscellaneous helpers.  */
1110 extern void gimple_add_tmp_var (tree);
1111 extern gimple gimple_current_bind_expr (void);
1112 extern VEC(gimple, heap) *gimple_bind_expr_stack (void);
1113 extern tree voidify_wrapper_expr (tree, tree);
1114 extern tree build_and_jump (tree *);
1115 extern tree force_labels_r (tree *, int *, void *);
1116 extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *,
1117                                                   gimple_seq *);
1118 struct gimplify_omp_ctx;
1119 extern void omp_firstprivatize_variable (struct gimplify_omp_ctx *, tree);
1120 extern tree gimple_boolify (tree);
1121 extern gimple_predicate rhs_predicate_for (tree);
1122 extern tree canonicalize_cond_expr_cond (tree);
1123
1124 /* In omp-low.c.  */
1125 extern tree omp_reduction_init (tree, tree);
1126
1127 /* In trans-mem.c.  */
1128 extern void diagnose_tm_safe_errors (tree);
1129
1130 /* In tree-nested.c.  */
1131 extern void lower_nested_functions (tree);
1132 extern void insert_field_into_struct (tree, tree);
1133
1134 /* In gimplify.c.  */
1135 extern void gimplify_function_tree (tree);
1136
1137 /* In cfgexpand.c.  */
1138 extern tree gimple_assign_rhs_to_tree (gimple);
1139
1140 /* In builtins.c  */
1141 extern bool validate_gimple_arglist (const_gimple, ...);
1142
1143 /* In tree-ssa.c  */
1144 extern bool tree_ssa_useless_type_conversion (tree);
1145 extern tree tree_ssa_strip_useless_type_conversions (tree);
1146 extern bool useless_type_conversion_p (tree, tree);
1147 extern bool types_compatible_p (tree, tree);
1148
1149 /* Return the code for GIMPLE statement G.  */
1150
1151 static inline enum gimple_code
1152 gimple_code (const_gimple g)
1153 {
1154   return g->gsbase.code;
1155 }
1156
1157
1158 /* Return the GSS code used by a GIMPLE code.  */
1159
1160 static inline enum gimple_statement_structure_enum
1161 gss_for_code (enum gimple_code code)
1162 {
1163   gcc_gimple_checking_assert ((unsigned int)code < LAST_AND_UNUSED_GIMPLE_CODE);
1164   return gss_for_code_[code];
1165 }
1166
1167
1168 /* Return which GSS code is used by GS.  */
1169
1170 static inline enum gimple_statement_structure_enum
1171 gimple_statement_structure (gimple gs)
1172 {
1173   return gss_for_code (gimple_code (gs));
1174 }
1175
1176
1177 /* Return true if statement G has sub-statements.  This is only true for
1178    High GIMPLE statements.  */
1179
1180 static inline bool
1181 gimple_has_substatements (gimple g)
1182 {
1183   switch (gimple_code (g))
1184     {
1185     case GIMPLE_BIND:
1186     case GIMPLE_CATCH:
1187     case GIMPLE_EH_FILTER:
1188     case GIMPLE_EH_ELSE:
1189     case GIMPLE_TRY:
1190     case GIMPLE_OMP_FOR:
1191     case GIMPLE_OMP_MASTER:
1192     case GIMPLE_OMP_ORDERED:
1193     case GIMPLE_OMP_SECTION:
1194     case GIMPLE_OMP_PARALLEL:
1195     case GIMPLE_OMP_TASK:
1196     case GIMPLE_OMP_SECTIONS:
1197     case GIMPLE_OMP_SINGLE:
1198     case GIMPLE_OMP_CRITICAL:
1199     case GIMPLE_WITH_CLEANUP_EXPR:
1200     case GIMPLE_TRANSACTION:
1201       return true;
1202
1203     default:
1204       return false;
1205     }
1206 }
1207
1208
1209 /* Return the basic block holding statement G.  */
1210
1211 static inline struct basic_block_def *
1212 gimple_bb (const_gimple g)
1213 {
1214   return g->gsbase.bb;
1215 }
1216
1217
1218 /* Return the lexical scope block holding statement G.  */
1219
1220 static inline tree
1221 gimple_block (const_gimple g)
1222 {
1223   return g->gsbase.block;
1224 }
1225
1226
1227 /* Set BLOCK to be the lexical scope block holding statement G.  */
1228
1229 static inline void
1230 gimple_set_block (gimple g, tree block)
1231 {
1232   g->gsbase.block = block;
1233 }
1234
1235
1236 /* Return location information for statement G.  */
1237
1238 static inline location_t
1239 gimple_location (const_gimple g)
1240 {
1241   return g->gsbase.location;
1242 }
1243
1244 /* Return pointer to location information for statement G.  */
1245
1246 static inline const location_t *
1247 gimple_location_ptr (const_gimple g)
1248 {
1249   return &g->gsbase.location;
1250 }
1251
1252
1253 /* Set location information for statement G.  */
1254
1255 static inline void
1256 gimple_set_location (gimple g, location_t location)
1257 {
1258   g->gsbase.location = location;
1259 }
1260
1261
1262 /* Return true if G contains location information.  */
1263
1264 static inline bool
1265 gimple_has_location (const_gimple g)
1266 {
1267   return gimple_location (g) != UNKNOWN_LOCATION;
1268 }
1269
1270
1271 /* Return the file name of the location of STMT.  */
1272
1273 static inline const char *
1274 gimple_filename (const_gimple stmt)
1275 {
1276   return LOCATION_FILE (gimple_location (stmt));
1277 }
1278
1279
1280 /* Return the line number of the location of STMT.  */
1281
1282 static inline int
1283 gimple_lineno (const_gimple stmt)
1284 {
1285   return LOCATION_LINE (gimple_location (stmt));
1286 }
1287
1288
1289 /* Determine whether SEQ is a singleton. */
1290
1291 static inline bool
1292 gimple_seq_singleton_p (gimple_seq seq)
1293 {
1294   return ((gimple_seq_first (seq) != NULL)
1295           && (gimple_seq_first (seq) == gimple_seq_last (seq)));
1296 }
1297
1298 /* Return true if no warnings should be emitted for statement STMT.  */
1299
1300 static inline bool
1301 gimple_no_warning_p (const_gimple stmt)
1302 {
1303   return stmt->gsbase.no_warning;
1304 }
1305
1306 /* Set the no_warning flag of STMT to NO_WARNING.  */
1307
1308 static inline void
1309 gimple_set_no_warning (gimple stmt, bool no_warning)
1310 {
1311   stmt->gsbase.no_warning = (unsigned) no_warning;
1312 }
1313
1314 /* Set the visited status on statement STMT to VISITED_P.  */
1315
1316 static inline void
1317 gimple_set_visited (gimple stmt, bool visited_p)
1318 {
1319   stmt->gsbase.visited = (unsigned) visited_p;
1320 }
1321
1322
1323 /* Return the visited status for statement STMT.  */
1324
1325 static inline bool
1326 gimple_visited_p (gimple stmt)
1327 {
1328   return stmt->gsbase.visited;
1329 }
1330
1331
1332 /* Set pass local flag PLF on statement STMT to VAL_P.  */
1333
1334 static inline void
1335 gimple_set_plf (gimple stmt, enum plf_mask plf, bool val_p)
1336 {
1337   if (val_p)
1338     stmt->gsbase.plf |= (unsigned int) plf;
1339   else
1340     stmt->gsbase.plf &= ~((unsigned int) plf);
1341 }
1342
1343
1344 /* Return the value of pass local flag PLF on statement STMT.  */
1345
1346 static inline unsigned int
1347 gimple_plf (gimple stmt, enum plf_mask plf)
1348 {
1349   return stmt->gsbase.plf & ((unsigned int) plf);
1350 }
1351
1352
1353 /* Set the UID of statement.  */
1354
1355 static inline void
1356 gimple_set_uid (gimple g, unsigned uid)
1357 {
1358   g->gsbase.uid = uid;
1359 }
1360
1361
1362 /* Return the UID of statement.  */
1363
1364 static inline unsigned
1365 gimple_uid (const_gimple g)
1366 {
1367   return g->gsbase.uid;
1368 }
1369
1370
1371 /* Return true if GIMPLE statement G has register or memory operands.  */
1372
1373 static inline bool
1374 gimple_has_ops (const_gimple g)
1375 {
1376   return gimple_code (g) >= GIMPLE_COND && gimple_code (g) <= GIMPLE_RETURN;
1377 }
1378
1379
1380 /* Return true if GIMPLE statement G has memory operands.  */
1381
1382 static inline bool
1383 gimple_has_mem_ops (const_gimple g)
1384 {
1385   return gimple_code (g) >= GIMPLE_ASSIGN && gimple_code (g) <= GIMPLE_RETURN;
1386 }
1387
1388
1389 /* Return the set of DEF operands for statement G.  */
1390
1391 static inline struct def_optype_d *
1392 gimple_def_ops (const_gimple g)
1393 {
1394   if (!gimple_has_ops (g))
1395     return NULL;
1396   return g->gsops.opbase.def_ops;
1397 }
1398
1399
1400 /* Set DEF to be the set of DEF operands for statement G.  */
1401
1402 static inline void
1403 gimple_set_def_ops (gimple g, struct def_optype_d *def)
1404 {
1405   gcc_gimple_checking_assert (gimple_has_ops (g));
1406   g->gsops.opbase.def_ops = def;
1407 }
1408
1409
1410 /* Return the set of USE operands for statement G.  */
1411
1412 static inline struct use_optype_d *
1413 gimple_use_ops (const_gimple g)
1414 {
1415   if (!gimple_has_ops (g))
1416     return NULL;
1417   return g->gsops.opbase.use_ops;
1418 }
1419
1420
1421 /* Set USE to be the set of USE operands for statement G.  */
1422
1423 static inline void
1424 gimple_set_use_ops (gimple g, struct use_optype_d *use)
1425 {
1426   gcc_gimple_checking_assert (gimple_has_ops (g));
1427   g->gsops.opbase.use_ops = use;
1428 }
1429
1430
1431 /* Return the set of VUSE operand for statement G.  */
1432
1433 static inline use_operand_p
1434 gimple_vuse_op (const_gimple g)
1435 {
1436   struct use_optype_d *ops;
1437   if (!gimple_has_mem_ops (g))
1438     return NULL_USE_OPERAND_P;
1439   ops = g->gsops.opbase.use_ops;
1440   if (ops
1441       && USE_OP_PTR (ops)->use == &g->gsmembase.vuse)
1442     return USE_OP_PTR (ops);
1443   return NULL_USE_OPERAND_P;
1444 }
1445
1446 /* Return the set of VDEF operand for statement G.  */
1447
1448 static inline def_operand_p
1449 gimple_vdef_op (const_gimple g)
1450 {
1451   struct def_optype_d *ops;
1452   if (!gimple_has_mem_ops (g))
1453     return NULL_DEF_OPERAND_P;
1454   ops = g->gsops.opbase.def_ops;
1455   if (ops
1456       && DEF_OP_PTR (ops) == &g->gsmembase.vdef)
1457     return DEF_OP_PTR (ops);
1458   return NULL_DEF_OPERAND_P;
1459 }
1460
1461
1462 /* Return the single VUSE operand of the statement G.  */
1463
1464 static inline tree
1465 gimple_vuse (const_gimple g)
1466 {
1467   if (!gimple_has_mem_ops (g))
1468     return NULL_TREE;
1469   return g->gsmembase.vuse;
1470 }
1471
1472 /* Return the single VDEF operand of the statement G.  */
1473
1474 static inline tree
1475 gimple_vdef (const_gimple g)
1476 {
1477   if (!gimple_has_mem_ops (g))
1478     return NULL_TREE;
1479   return g->gsmembase.vdef;
1480 }
1481
1482 /* Return the single VUSE operand of the statement G.  */
1483
1484 static inline tree *
1485 gimple_vuse_ptr (gimple g)
1486 {
1487   if (!gimple_has_mem_ops (g))
1488     return NULL;
1489   return &g->gsmembase.vuse;
1490 }
1491
1492 /* Return the single VDEF operand of the statement G.  */
1493
1494 static inline tree *
1495 gimple_vdef_ptr (gimple g)
1496 {
1497   if (!gimple_has_mem_ops (g))
1498     return NULL;
1499   return &g->gsmembase.vdef;
1500 }
1501
1502 /* Set the single VUSE operand of the statement G.  */
1503
1504 static inline void
1505 gimple_set_vuse (gimple g, tree vuse)
1506 {
1507   gcc_gimple_checking_assert (gimple_has_mem_ops (g));
1508   g->gsmembase.vuse = vuse;
1509 }
1510
1511 /* Set the single VDEF operand of the statement G.  */
1512
1513 static inline void
1514 gimple_set_vdef (gimple g, tree vdef)
1515 {
1516   gcc_gimple_checking_assert (gimple_has_mem_ops (g));
1517   g->gsmembase.vdef = vdef;
1518 }
1519
1520
1521 /* Return true if statement G has operands and the modified field has
1522    been set.  */
1523
1524 static inline bool
1525 gimple_modified_p (const_gimple g)
1526 {
1527   return (gimple_has_ops (g)) ? (bool) g->gsbase.modified : false;
1528 }
1529
1530
1531 /* Return the tree code for the expression computed by STMT.  This is
1532    only valid for GIMPLE_COND, GIMPLE_CALL and GIMPLE_ASSIGN.  For
1533    GIMPLE_CALL, return CALL_EXPR as the expression code for
1534    consistency.  This is useful when the caller needs to deal with the
1535    three kinds of computation that GIMPLE supports.  */
1536
1537 static inline enum tree_code
1538 gimple_expr_code (const_gimple stmt)
1539 {
1540   enum gimple_code code = gimple_code (stmt);
1541   if (code == GIMPLE_ASSIGN || code == GIMPLE_COND)
1542     return (enum tree_code) stmt->gsbase.subcode;
1543   else
1544     {
1545       gcc_gimple_checking_assert (code == GIMPLE_CALL);
1546       return CALL_EXPR;
1547     }
1548 }
1549
1550
1551 /* Mark statement S as modified, and update it.  */
1552
1553 static inline void
1554 update_stmt (gimple s)
1555 {
1556   if (gimple_has_ops (s))
1557     {
1558       gimple_set_modified (s, true);
1559       update_stmt_operands (s);
1560     }
1561 }
1562
1563 /* Update statement S if it has been optimized.  */
1564
1565 static inline void
1566 update_stmt_if_modified (gimple s)
1567 {
1568   if (gimple_modified_p (s))
1569     update_stmt_operands (s);
1570 }
1571
1572 /* Return true if statement STMT contains volatile operands.  */
1573
1574 static inline bool
1575 gimple_has_volatile_ops (const_gimple stmt)
1576 {
1577   if (gimple_has_mem_ops (stmt))
1578     return stmt->gsbase.has_volatile_ops;
1579   else
1580     return false;
1581 }
1582
1583
1584 /* Set the HAS_VOLATILE_OPS flag to VOLATILEP.  */
1585
1586 static inline void
1587 gimple_set_has_volatile_ops (gimple stmt, bool volatilep)
1588 {
1589   if (gimple_has_mem_ops (stmt))
1590     stmt->gsbase.has_volatile_ops = (unsigned) volatilep;
1591 }
1592
1593
1594 /* Return true if statement STMT may access memory.  */
1595
1596 static inline bool
1597 gimple_references_memory_p (gimple stmt)
1598 {
1599   return gimple_has_mem_ops (stmt) && gimple_vuse (stmt);
1600 }
1601
1602
1603 /* Return the subcode for OMP statement S.  */
1604
1605 static inline unsigned
1606 gimple_omp_subcode (const_gimple s)
1607 {
1608   gcc_gimple_checking_assert (gimple_code (s) >= GIMPLE_OMP_ATOMIC_LOAD
1609               && gimple_code (s) <= GIMPLE_OMP_SINGLE);
1610   return s->gsbase.subcode;
1611 }
1612
1613 /* Set the subcode for OMP statement S to SUBCODE.  */
1614
1615 static inline void
1616 gimple_omp_set_subcode (gimple s, unsigned int subcode)
1617 {
1618   /* We only have 16 bits for the subcode.  Assert that we are not
1619      overflowing it.  */
1620   gcc_gimple_checking_assert (subcode < (1 << 16));
1621   s->gsbase.subcode = subcode;
1622 }
1623
1624 /* Set the nowait flag on OMP_RETURN statement S.  */
1625
1626 static inline void
1627 gimple_omp_return_set_nowait (gimple s)
1628 {
1629   GIMPLE_CHECK (s, GIMPLE_OMP_RETURN);
1630   s->gsbase.subcode |= GF_OMP_RETURN_NOWAIT;
1631 }
1632
1633
1634 /* Return true if OMP return statement G has the GF_OMP_RETURN_NOWAIT
1635    flag set.  */
1636
1637 static inline bool
1638 gimple_omp_return_nowait_p (const_gimple g)
1639 {
1640   GIMPLE_CHECK (g, GIMPLE_OMP_RETURN);
1641   return (gimple_omp_subcode (g) & GF_OMP_RETURN_NOWAIT) != 0;
1642 }
1643
1644
1645 /* Return true if OMP section statement G has the GF_OMP_SECTION_LAST
1646    flag set.  */
1647
1648 static inline bool
1649 gimple_omp_section_last_p (const_gimple g)
1650 {
1651   GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
1652   return (gimple_omp_subcode (g) & GF_OMP_SECTION_LAST) != 0;
1653 }
1654
1655
1656 /* Set the GF_OMP_SECTION_LAST flag on G.  */
1657
1658 static inline void
1659 gimple_omp_section_set_last (gimple g)
1660 {
1661   GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
1662   g->gsbase.subcode |= GF_OMP_SECTION_LAST;
1663 }
1664
1665
1666 /* Return true if OMP parallel statement G has the
1667    GF_OMP_PARALLEL_COMBINED flag set.  */
1668
1669 static inline bool
1670 gimple_omp_parallel_combined_p (const_gimple g)
1671 {
1672   GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
1673   return (gimple_omp_subcode (g) & GF_OMP_PARALLEL_COMBINED) != 0;
1674 }
1675
1676
1677 /* Set the GF_OMP_PARALLEL_COMBINED field in G depending on the boolean
1678    value of COMBINED_P.  */
1679
1680 static inline void
1681 gimple_omp_parallel_set_combined_p (gimple g, bool combined_p)
1682 {
1683   GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
1684   if (combined_p)
1685     g->gsbase.subcode |= GF_OMP_PARALLEL_COMBINED;
1686   else
1687     g->gsbase.subcode &= ~GF_OMP_PARALLEL_COMBINED;
1688 }
1689
1690
1691 /* Return true if OMP atomic load/store statement G has the
1692    GF_OMP_ATOMIC_NEED_VALUE flag set.  */
1693
1694 static inline bool
1695 gimple_omp_atomic_need_value_p (const_gimple g)
1696 {
1697   if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
1698     GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
1699   return (gimple_omp_subcode (g) & GF_OMP_ATOMIC_NEED_VALUE) != 0;
1700 }
1701
1702
1703 /* Set the GF_OMP_ATOMIC_NEED_VALUE flag on G.  */
1704
1705 static inline void
1706 gimple_omp_atomic_set_need_value (gimple g)
1707 {
1708   if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
1709     GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
1710   g->gsbase.subcode |= GF_OMP_ATOMIC_NEED_VALUE;
1711 }
1712
1713
1714 /* Return the number of operands for statement GS.  */
1715
1716 static inline unsigned
1717 gimple_num_ops (const_gimple gs)
1718 {
1719   return gs->gsbase.num_ops;
1720 }
1721
1722
1723 /* Set the number of operands for statement GS.  */
1724
1725 static inline void
1726 gimple_set_num_ops (gimple gs, unsigned num_ops)
1727 {
1728   gs->gsbase.num_ops = num_ops;
1729 }
1730
1731
1732 /* Return the array of operands for statement GS.  */
1733
1734 static inline tree *
1735 gimple_ops (gimple gs)
1736 {
1737   size_t off;
1738
1739   /* All the tuples have their operand vector at the very bottom
1740      of the structure.  Note that those structures that do not
1741      have an operand vector have a zero offset.  */
1742   off = gimple_ops_offset_[gimple_statement_structure (gs)];
1743   gcc_gimple_checking_assert (off != 0);
1744
1745   return (tree *) ((char *) gs + off);
1746 }
1747
1748
1749 /* Return operand I for statement GS.  */
1750
1751 static inline tree
1752 gimple_op (const_gimple gs, unsigned i)
1753 {
1754   if (gimple_has_ops (gs))
1755     {
1756       gcc_gimple_checking_assert (i < gimple_num_ops (gs));
1757       return gimple_ops (CONST_CAST_GIMPLE (gs))[i];
1758     }
1759   else
1760     return NULL_TREE;
1761 }
1762
1763 /* Return a pointer to operand I for statement GS.  */
1764
1765 static inline tree *
1766 gimple_op_ptr (const_gimple gs, unsigned i)
1767 {
1768   if (gimple_has_ops (gs))
1769     {
1770       gcc_gimple_checking_assert (i < gimple_num_ops (gs));
1771       return gimple_ops (CONST_CAST_GIMPLE (gs)) + i;
1772     }
1773   else
1774     return NULL;
1775 }
1776
1777 /* Set operand I of statement GS to OP.  */
1778
1779 static inline void
1780 gimple_set_op (gimple gs, unsigned i, tree op)
1781 {
1782   gcc_gimple_checking_assert (gimple_has_ops (gs) && i < gimple_num_ops (gs));
1783
1784   /* Note.  It may be tempting to assert that OP matches
1785      is_gimple_operand, but that would be wrong.  Different tuples
1786      accept slightly different sets of tree operands.  Each caller
1787      should perform its own validation.  */
1788   gimple_ops (gs)[i] = op;
1789 }
1790
1791 /* Return true if GS is a GIMPLE_ASSIGN.  */
1792
1793 static inline bool
1794 is_gimple_assign (const_gimple gs)
1795 {
1796   return gimple_code (gs) == GIMPLE_ASSIGN;
1797 }
1798
1799 /* Determine if expression CODE is one of the valid expressions that can
1800    be used on the RHS of GIMPLE assignments.  */
1801
1802 static inline enum gimple_rhs_class
1803 get_gimple_rhs_class (enum tree_code code)
1804 {
1805   return (enum gimple_rhs_class) gimple_rhs_class_table[(int) code];
1806 }
1807
1808 /* Return the LHS of assignment statement GS.  */
1809
1810 static inline tree
1811 gimple_assign_lhs (const_gimple gs)
1812 {
1813   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1814   return gimple_op (gs, 0);
1815 }
1816
1817
1818 /* Return a pointer to the LHS of assignment statement GS.  */
1819
1820 static inline tree *
1821 gimple_assign_lhs_ptr (const_gimple gs)
1822 {
1823   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1824   return gimple_op_ptr (gs, 0);
1825 }
1826
1827
1828 /* Set LHS to be the LHS operand of assignment statement GS.  */
1829
1830 static inline void
1831 gimple_assign_set_lhs (gimple gs, tree lhs)
1832 {
1833   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1834   gimple_set_op (gs, 0, lhs);
1835
1836   if (lhs && TREE_CODE (lhs) == SSA_NAME)
1837     SSA_NAME_DEF_STMT (lhs) = gs;
1838 }
1839
1840
1841 /* Return the first operand on the RHS of assignment statement GS.  */
1842
1843 static inline tree
1844 gimple_assign_rhs1 (const_gimple gs)
1845 {
1846   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1847   return gimple_op (gs, 1);
1848 }
1849
1850
1851 /* Return a pointer to the first operand on the RHS of assignment
1852    statement GS.  */
1853
1854 static inline tree *
1855 gimple_assign_rhs1_ptr (const_gimple gs)
1856 {
1857   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1858   return gimple_op_ptr (gs, 1);
1859 }
1860
1861 /* Set RHS to be the first operand on the RHS of assignment statement GS.  */
1862
1863 static inline void
1864 gimple_assign_set_rhs1 (gimple gs, tree rhs)
1865 {
1866   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1867
1868   gimple_set_op (gs, 1, rhs);
1869 }
1870
1871
1872 /* Return the second operand on the RHS of assignment statement GS.
1873    If GS does not have two operands, NULL is returned instead.  */
1874
1875 static inline tree
1876 gimple_assign_rhs2 (const_gimple gs)
1877 {
1878   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1879
1880   if (gimple_num_ops (gs) >= 3)
1881     return gimple_op (gs, 2);
1882   else
1883     return NULL_TREE;
1884 }
1885
1886
1887 /* Return a pointer to the second operand on the RHS of assignment
1888    statement GS.  */
1889
1890 static inline tree *
1891 gimple_assign_rhs2_ptr (const_gimple gs)
1892 {
1893   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1894   return gimple_op_ptr (gs, 2);
1895 }
1896
1897
1898 /* Set RHS to be the second operand on the RHS of assignment statement GS.  */
1899
1900 static inline void
1901 gimple_assign_set_rhs2 (gimple gs, tree rhs)
1902 {
1903   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1904
1905   gimple_set_op (gs, 2, rhs);
1906 }
1907
1908 /* Return the third operand on the RHS of assignment statement GS.
1909    If GS does not have two operands, NULL is returned instead.  */
1910
1911 static inline tree
1912 gimple_assign_rhs3 (const_gimple gs)
1913 {
1914   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1915
1916   if (gimple_num_ops (gs) >= 4)
1917     return gimple_op (gs, 3);
1918   else
1919     return NULL_TREE;
1920 }
1921
1922 /* Return a pointer to the third operand on the RHS of assignment
1923    statement GS.  */
1924
1925 static inline tree *
1926 gimple_assign_rhs3_ptr (const_gimple gs)
1927 {
1928   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1929   return gimple_op_ptr (gs, 3);
1930 }
1931
1932
1933 /* Set RHS to be the third operand on the RHS of assignment statement GS.  */
1934
1935 static inline void
1936 gimple_assign_set_rhs3 (gimple gs, tree rhs)
1937 {
1938   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1939
1940   gimple_set_op (gs, 3, rhs);
1941 }
1942
1943 /* A wrapper around gimple_assign_set_rhs_with_ops_1, for callers which expect
1944    to see only a maximum of two operands.  */
1945
1946 static inline void
1947 gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
1948                                 tree op1, tree op2)
1949 {
1950   gimple_assign_set_rhs_with_ops_1 (gsi, code, op1, op2, NULL);
1951 }
1952
1953 /* A wrapper around extract_ops_from_tree_1, for callers which expect
1954    to see only a maximum of two operands.  */
1955
1956 static inline void
1957 extract_ops_from_tree (tree expr, enum tree_code *code, tree *op0,
1958                        tree *op1)
1959 {
1960   tree op2;
1961   extract_ops_from_tree_1 (expr, code, op0, op1, &op2);
1962   gcc_assert (op2 == NULL_TREE);
1963 }
1964
1965 /* Returns true if GS is a nontemporal move.  */
1966
1967 static inline bool
1968 gimple_assign_nontemporal_move_p (const_gimple gs)
1969 {
1970   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1971   return gs->gsbase.nontemporal_move;
1972 }
1973
1974 /* Sets nontemporal move flag of GS to NONTEMPORAL.  */
1975
1976 static inline void
1977 gimple_assign_set_nontemporal_move (gimple gs, bool nontemporal)
1978 {
1979   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1980   gs->gsbase.nontemporal_move = nontemporal;
1981 }
1982
1983
1984 /* Return the code of the expression computed on the rhs of assignment
1985    statement GS.  In case that the RHS is a single object, returns the
1986    tree code of the object.  */
1987
1988 static inline enum tree_code
1989 gimple_assign_rhs_code (const_gimple gs)
1990 {
1991   enum tree_code code;
1992   GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
1993
1994   code = (enum tree_code) gs->gsbase.subcode;
1995   /* While we initially set subcode to the TREE_CODE of the rhs for
1996      GIMPLE_SINGLE_RHS assigns we do not update that subcode to stay
1997      in sync when we rewrite stmts into SSA form or do SSA propagations.  */
1998   if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
1999     code = TREE_CODE (gimple_assign_rhs1 (gs));
2000
2001   return code;
2002 }
2003
2004
2005 /* Set CODE to be the code for the expression computed on the RHS of
2006    assignment S.  */
2007
2008 static inline void
2009 gimple_assign_set_rhs_code (gimple s, enum tree_code code)
2010 {
2011   GIMPLE_CHECK (s, GIMPLE_ASSIGN);
2012   s->gsbase.subcode = code;
2013 }
2014
2015
2016 /* Return the gimple rhs class of the code of the expression computed on
2017    the rhs of assignment statement GS.
2018    This will never return GIMPLE_INVALID_RHS.  */
2019
2020 static inline enum gimple_rhs_class
2021 gimple_assign_rhs_class (const_gimple gs)
2022 {
2023   return get_gimple_rhs_class (gimple_assign_rhs_code (gs));
2024 }
2025
2026 /* Return true if GS is an assignment with a singleton RHS, i.e.,
2027    there is no operator associated with the assignment itself.
2028    Unlike gimple_assign_copy_p, this predicate returns true for
2029    any RHS operand, including those that perform an operation
2030    and do not have the semantics of a copy, such as COND_EXPR.  */
2031
2032 static inline bool
2033 gimple_assign_single_p (gimple gs)
2034 {
2035   return (is_gimple_assign (gs)
2036           && gimple_assign_rhs_class (gs) == GIMPLE_SINGLE_RHS);
2037 }
2038
2039
2040 /* Return true if S is a type-cast assignment.  */
2041
2042 static inline bool
2043 gimple_assign_cast_p (gimple s)
2044 {
2045   if (is_gimple_assign (s))
2046     {
2047       enum tree_code sc = gimple_assign_rhs_code (s);
2048       return CONVERT_EXPR_CODE_P (sc)
2049              || sc == VIEW_CONVERT_EXPR
2050              || sc == FIX_TRUNC_EXPR;
2051     }
2052
2053   return false;
2054 }
2055
2056
2057 /* Return true if GS is a GIMPLE_CALL.  */
2058
2059 static inline bool
2060 is_gimple_call (const_gimple gs)
2061 {
2062   return gimple_code (gs) == GIMPLE_CALL;
2063 }
2064
2065 /* Return the LHS of call statement GS.  */
2066
2067 static inline tree
2068 gimple_call_lhs (const_gimple gs)
2069 {
2070   GIMPLE_CHECK (gs, GIMPLE_CALL);
2071   return gimple_op (gs, 0);
2072 }
2073
2074
2075 /* Return a pointer to the LHS of call statement GS.  */
2076
2077 static inline tree *
2078 gimple_call_lhs_ptr (const_gimple gs)
2079 {
2080   GIMPLE_CHECK (gs, GIMPLE_CALL);
2081   return gimple_op_ptr (gs, 0);
2082 }
2083
2084
2085 /* Set LHS to be the LHS operand of call statement GS.  */
2086
2087 static inline void
2088 gimple_call_set_lhs (gimple gs, tree lhs)
2089 {
2090   GIMPLE_CHECK (gs, GIMPLE_CALL);
2091   gimple_set_op (gs, 0, lhs);
2092   if (lhs && TREE_CODE (lhs) == SSA_NAME)
2093     SSA_NAME_DEF_STMT (lhs) = gs;
2094 }
2095
2096
2097 /* Return true if call GS calls an internal-only function, as enumerated
2098    by internal_fn.  */
2099
2100 static inline bool
2101 gimple_call_internal_p (const_gimple gs)
2102 {
2103   GIMPLE_CHECK (gs, GIMPLE_CALL);
2104   return (gs->gsbase.subcode & GF_CALL_INTERNAL) != 0;
2105 }
2106
2107
2108 /* Return the target of internal call GS.  */
2109
2110 static inline enum internal_fn
2111 gimple_call_internal_fn (const_gimple gs)
2112 {
2113   gcc_gimple_checking_assert (gimple_call_internal_p (gs));
2114   return gs->gimple_call.u.internal_fn;
2115 }
2116
2117
2118 /* Return the function type of the function called by GS.  */
2119
2120 static inline tree
2121 gimple_call_fntype (const_gimple gs)
2122 {
2123   GIMPLE_CHECK (gs, GIMPLE_CALL);
2124   if (gimple_call_internal_p (gs))
2125     return NULL_TREE;
2126   return gs->gimple_call.u.fntype;
2127 }
2128
2129 /* Set the type of the function called by GS to FNTYPE.  */
2130
2131 static inline void
2132 gimple_call_set_fntype (gimple gs, tree fntype)
2133 {
2134   GIMPLE_CHECK (gs, GIMPLE_CALL);
2135   gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
2136   gs->gimple_call.u.fntype = fntype;
2137 }
2138
2139
2140 /* Return the tree node representing the function called by call
2141    statement GS.  */
2142
2143 static inline tree
2144 gimple_call_fn (const_gimple gs)
2145 {
2146   GIMPLE_CHECK (gs, GIMPLE_CALL);
2147   return gimple_op (gs, 1);
2148 }
2149
2150 /* Return a pointer to the tree node representing the function called by call
2151    statement GS.  */
2152
2153 static inline tree *
2154 gimple_call_fn_ptr (const_gimple gs)
2155 {
2156   GIMPLE_CHECK (gs, GIMPLE_CALL);
2157   return gimple_op_ptr (gs, 1);
2158 }
2159
2160
2161 /* Set FN to be the function called by call statement GS.  */
2162
2163 static inline void
2164 gimple_call_set_fn (gimple gs, tree fn)
2165 {
2166   GIMPLE_CHECK (gs, GIMPLE_CALL);
2167   gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
2168   gimple_set_op (gs, 1, fn);
2169 }
2170
2171
2172 /* Set FNDECL to be the function called by call statement GS.  */
2173
2174 static inline void
2175 gimple_call_set_fndecl (gimple gs, tree decl)
2176 {
2177   GIMPLE_CHECK (gs, GIMPLE_CALL);
2178   gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
2179   gimple_set_op (gs, 1, build_fold_addr_expr_loc (gimple_location (gs), decl));
2180 }
2181
2182
2183 /* Set internal function FN to be the function called by call statement GS.  */
2184
2185 static inline void
2186 gimple_call_set_internal_fn (gimple gs, enum internal_fn fn)
2187 {
2188   GIMPLE_CHECK (gs, GIMPLE_CALL);
2189   gcc_gimple_checking_assert (gimple_call_internal_p (gs));
2190   gs->gimple_call.u.internal_fn = fn;
2191 }
2192
2193
2194 /* Given a valid GIMPLE_CALL function address return the FUNCTION_DECL
2195    associated with the callee if known.  Otherwise return NULL_TREE.  */
2196
2197 static inline tree
2198 gimple_call_addr_fndecl (const_tree fn)
2199 {
2200   if (fn && TREE_CODE (fn) == ADDR_EXPR)
2201     {
2202       tree fndecl = TREE_OPERAND (fn, 0);
2203       if (TREE_CODE (fndecl) == MEM_REF
2204           && TREE_CODE (TREE_OPERAND (fndecl, 0)) == ADDR_EXPR
2205           && integer_zerop (TREE_OPERAND (fndecl, 1)))
2206         fndecl = TREE_OPERAND (TREE_OPERAND (fndecl, 0), 0);
2207       if (TREE_CODE (fndecl) == FUNCTION_DECL)
2208         return fndecl;
2209     }
2210   return NULL_TREE;
2211 }
2212
2213 /* If a given GIMPLE_CALL's callee is a FUNCTION_DECL, return it.
2214    Otherwise return NULL.  This function is analogous to
2215    get_callee_fndecl in tree land.  */
2216
2217 static inline tree
2218 gimple_call_fndecl (const_gimple gs)
2219 {
2220   return gimple_call_addr_fndecl (gimple_call_fn (gs));
2221 }
2222
2223
2224 /* Return the type returned by call statement GS.  */
2225
2226 static inline tree
2227 gimple_call_return_type (const_gimple gs)
2228 {
2229   tree type = gimple_call_fntype (gs);
2230
2231   if (type == NULL_TREE)
2232     return TREE_TYPE (gimple_call_lhs (gs));
2233
2234   /* The type returned by a function is the type of its
2235      function type.  */
2236   return TREE_TYPE (type);
2237 }
2238
2239
2240 /* Return the static chain for call statement GS.  */
2241
2242 static inline tree
2243 gimple_call_chain (const_gimple gs)
2244 {
2245   GIMPLE_CHECK (gs, GIMPLE_CALL);
2246   return gimple_op (gs, 2);
2247 }
2248
2249
2250 /* Return a pointer to the static chain for call statement GS.  */
2251
2252 static inline tree *
2253 gimple_call_chain_ptr (const_gimple gs)
2254 {
2255   GIMPLE_CHECK (gs, GIMPLE_CALL);
2256   return gimple_op_ptr (gs, 2);
2257 }
2258
2259 /* Set CHAIN to be the static chain for call statement GS.  */
2260
2261 static inline void
2262 gimple_call_set_chain (gimple gs, tree chain)
2263 {
2264   GIMPLE_CHECK (gs, GIMPLE_CALL);
2265
2266   gimple_set_op (gs, 2, chain);
2267 }
2268
2269
2270 /* Return the number of arguments used by call statement GS.  */
2271
2272 static inline unsigned
2273 gimple_call_num_args (const_gimple gs)
2274 {
2275   unsigned num_ops;
2276   GIMPLE_CHECK (gs, GIMPLE_CALL);
2277   num_ops = gimple_num_ops (gs);
2278   return num_ops - 3;
2279 }
2280
2281
2282 /* Return the argument at position INDEX for call statement GS.  */
2283
2284 static inline tree
2285 gimple_call_arg (const_gimple gs, unsigned index)
2286 {
2287   GIMPLE_CHECK (gs, GIMPLE_CALL);
2288   return gimple_op (gs, index + 3);
2289 }
2290
2291
2292 /* Return a pointer to the argument at position INDEX for call
2293    statement GS.  */
2294
2295 static inline tree *
2296 gimple_call_arg_ptr (const_gimple gs, unsigned index)
2297 {
2298   GIMPLE_CHECK (gs, GIMPLE_CALL);
2299   return gimple_op_ptr (gs, index + 3);
2300 }
2301
2302
2303 /* Set ARG to be the argument at position INDEX for call statement GS.  */
2304
2305 static inline void
2306 gimple_call_set_arg (gimple gs, unsigned index, tree arg)
2307 {
2308   GIMPLE_CHECK (gs, GIMPLE_CALL);
2309   gimple_set_op (gs, index + 3, arg);
2310 }
2311
2312
2313 /* If TAIL_P is true, mark call statement S as being a tail call
2314    (i.e., a call just before the exit of a function).  These calls are
2315    candidate for tail call optimization.  */
2316
2317 static inline void
2318 gimple_call_set_tail (gimple s, bool tail_p)
2319 {
2320   GIMPLE_CHECK (s, GIMPLE_CALL);
2321   if (tail_p)
2322     s->gsbase.subcode |= GF_CALL_TAILCALL;
2323   else
2324     s->gsbase.subcode &= ~GF_CALL_TAILCALL;
2325 }
2326
2327
2328 /* Return true if GIMPLE_CALL S is marked as a tail call.  */
2329
2330 static inline bool
2331 gimple_call_tail_p (gimple s)
2332 {
2333   GIMPLE_CHECK (s, GIMPLE_CALL);
2334   return (s->gsbase.subcode & GF_CALL_TAILCALL) != 0;
2335 }
2336
2337
2338 /* Set the inlinable status of GIMPLE_CALL S to INLINABLE_P.  */
2339
2340 static inline void
2341 gimple_call_set_cannot_inline (gimple s, bool inlinable_p)
2342 {
2343   GIMPLE_CHECK (s, GIMPLE_CALL);
2344   if (inlinable_p)
2345     s->gsbase.subcode |= GF_CALL_CANNOT_INLINE;
2346   else
2347     s->gsbase.subcode &= ~GF_CALL_CANNOT_INLINE;
2348 }
2349
2350
2351 /* Return true if GIMPLE_CALL S cannot be inlined.  */
2352
2353 static inline bool
2354 gimple_call_cannot_inline_p (gimple s)
2355 {
2356   GIMPLE_CHECK (s, GIMPLE_CALL);
2357   return (s->gsbase.subcode & GF_CALL_CANNOT_INLINE) != 0;
2358 }
2359
2360
2361 /* If RETURN_SLOT_OPT_P is true mark GIMPLE_CALL S as valid for return
2362    slot optimization.  This transformation uses the target of the call
2363    expansion as the return slot for calls that return in memory.  */
2364
2365 static inline void
2366 gimple_call_set_return_slot_opt (gimple s, bool return_slot_opt_p)
2367 {
2368   GIMPLE_CHECK (s, GIMPLE_CALL);
2369   if (return_slot_opt_p)
2370     s->gsbase.subcode |= GF_CALL_RETURN_SLOT_OPT;
2371   else
2372     s->gsbase.subcode &= ~GF_CALL_RETURN_SLOT_OPT;
2373 }
2374
2375
2376 /* Return true if S is marked for return slot optimization.  */
2377
2378 static inline bool
2379 gimple_call_return_slot_opt_p (gimple s)
2380 {
2381   GIMPLE_CHECK (s, GIMPLE_CALL);
2382   return (s->gsbase.subcode & GF_CALL_RETURN_SLOT_OPT) != 0;
2383 }
2384
2385
2386 /* If FROM_THUNK_P is true, mark GIMPLE_CALL S as being the jump from a
2387    thunk to the thunked-to function.  */
2388
2389 static inline void
2390 gimple_call_set_from_thunk (gimple s, bool from_thunk_p)
2391 {
2392   GIMPLE_CHECK (s, GIMPLE_CALL);
2393   if (from_thunk_p)
2394     s->gsbase.subcode |= GF_CALL_FROM_THUNK;
2395   else
2396     s->gsbase.subcode &= ~GF_CALL_FROM_THUNK;
2397 }
2398
2399
2400 /* Return true if GIMPLE_CALL S is a jump from a thunk.  */
2401
2402 static inline bool
2403 gimple_call_from_thunk_p (gimple s)
2404 {
2405   GIMPLE_CHECK (s, GIMPLE_CALL);
2406   return (s->gsbase.subcode & GF_CALL_FROM_THUNK) != 0;
2407 }
2408
2409
2410 /* If PASS_ARG_PACK_P is true, GIMPLE_CALL S is a stdarg call that needs the
2411    argument pack in its argument list.  */
2412
2413 static inline void
2414 gimple_call_set_va_arg_pack (gimple s, bool pass_arg_pack_p)
2415 {
2416   GIMPLE_CHECK (s, GIMPLE_CALL);
2417   if (pass_arg_pack_p)
2418     s->gsbase.subcode |= GF_CALL_VA_ARG_PACK;
2419   else
2420     s->gsbase.subcode &= ~GF_CALL_VA_ARG_PACK;
2421 }
2422
2423
2424 /* Return true if GIMPLE_CALL S is a stdarg call that needs the
2425    argument pack in its argument list.  */
2426
2427 static inline bool
2428 gimple_call_va_arg_pack_p (gimple s)
2429 {
2430   GIMPLE_CHECK (s, GIMPLE_CALL);
2431   return (s->gsbase.subcode & GF_CALL_VA_ARG_PACK) != 0;
2432 }
2433
2434
2435 /* Return true if S is a noreturn call.  */
2436
2437 static inline bool
2438 gimple_call_noreturn_p (gimple s)
2439 {
2440   GIMPLE_CHECK (s, GIMPLE_CALL);
2441   return (gimple_call_flags (s) & ECF_NORETURN) != 0;
2442 }
2443
2444
2445 /* If NOTHROW_P is true, GIMPLE_CALL S is a call that is known to not throw
2446    even if the called function can throw in other cases.  */
2447
2448 static inline void
2449 gimple_call_set_nothrow (gimple s, bool nothrow_p)
2450 {
2451   GIMPLE_CHECK (s, GIMPLE_CALL);
2452   if (nothrow_p)
2453     s->gsbase.subcode |= GF_CALL_NOTHROW;
2454   else
2455     s->gsbase.subcode &= ~GF_CALL_NOTHROW;
2456 }
2457
2458 /* Return true if S is a nothrow call.  */
2459
2460 static inline bool
2461 gimple_call_nothrow_p (gimple s)
2462 {
2463   GIMPLE_CHECK (s, GIMPLE_CALL);
2464   return (gimple_call_flags (s) & ECF_NOTHROW) != 0;
2465 }
2466
2467 /* If FOR_VAR is true, GIMPLE_CALL S is a call to builtin_alloca that
2468    is known to be emitted for VLA objects.  Those are wrapped by
2469    stack_save/stack_restore calls and hence can't lead to unbounded
2470    stack growth even when they occur in loops.  */
2471
2472 static inline void
2473 gimple_call_set_alloca_for_var (gimple s, bool for_var)
2474 {
2475   GIMPLE_CHECK (s, GIMPLE_CALL);
2476   if (for_var)
2477     s->gsbase.subcode |= GF_CALL_ALLOCA_FOR_VAR;
2478   else
2479     s->gsbase.subcode &= ~GF_CALL_ALLOCA_FOR_VAR;
2480 }
2481
2482 /* Return true of S is a call to builtin_alloca emitted for VLA objects.  */
2483
2484 static inline bool
2485 gimple_call_alloca_for_var_p (gimple s)
2486 {
2487   GIMPLE_CHECK (s, GIMPLE_CALL);
2488   return (s->gsbase.subcode & GF_CALL_ALLOCA_FOR_VAR) != 0;
2489 }
2490
2491 /* Copy all the GF_CALL_* flags from ORIG_CALL to DEST_CALL.  */
2492
2493 static inline void
2494 gimple_call_copy_flags (gimple dest_call, gimple orig_call)
2495 {
2496   GIMPLE_CHECK (dest_call, GIMPLE_CALL);
2497   GIMPLE_CHECK (orig_call, GIMPLE_CALL);
2498   dest_call->gsbase.subcode = orig_call->gsbase.subcode;
2499 }
2500
2501
2502 /* Return a pointer to the points-to solution for the set of call-used
2503    variables of the call CALL.  */
2504
2505 static inline struct pt_solution *
2506 gimple_call_use_set (gimple call)
2507 {
2508   GIMPLE_CHECK (call, GIMPLE_CALL);
2509   return &call->gimple_call.call_used;
2510 }
2511
2512
2513 /* Return a pointer to the points-to solution for the set of call-used
2514    variables of the call CALL.  */
2515
2516 static inline struct pt_solution *
2517 gimple_call_clobber_set (gimple call)
2518 {
2519   GIMPLE_CHECK (call, GIMPLE_CALL);
2520   return &call->gimple_call.call_clobbered;
2521 }
2522
2523
2524 /* Returns true if this is a GIMPLE_ASSIGN or a GIMPLE_CALL with a
2525    non-NULL lhs.  */
2526
2527 static inline bool
2528 gimple_has_lhs (gimple stmt)
2529 {
2530   return (is_gimple_assign (stmt)
2531           || (is_gimple_call (stmt)
2532               && gimple_call_lhs (stmt) != NULL_TREE));
2533 }
2534
2535
2536 /* Return the code of the predicate computed by conditional statement GS.  */
2537
2538 static inline enum tree_code
2539 gimple_cond_code (const_gimple gs)
2540 {
2541   GIMPLE_CHECK (gs, GIMPLE_COND);
2542   return (enum tree_code) gs->gsbase.subcode;
2543 }
2544
2545
2546 /* Set CODE to be the predicate code for the conditional statement GS.  */
2547
2548 static inline void
2549 gimple_cond_set_code (gimple gs, enum tree_code code)
2550 {
2551   GIMPLE_CHECK (gs, GIMPLE_COND);
2552   gs->gsbase.subcode = code;
2553 }
2554
2555
2556 /* Return the LHS of the predicate computed by conditional statement GS.  */
2557
2558 static inline tree
2559 gimple_cond_lhs (const_gimple gs)
2560 {
2561   GIMPLE_CHECK (gs, GIMPLE_COND);
2562   return gimple_op (gs, 0);
2563 }
2564
2565 /* Return the pointer to the LHS of the predicate computed by conditional
2566    statement GS.  */
2567
2568 static inline tree *
2569 gimple_cond_lhs_ptr (const_gimple gs)
2570 {
2571   GIMPLE_CHECK (gs, GIMPLE_COND);
2572   return gimple_op_ptr (gs, 0);
2573 }
2574
2575 /* Set LHS to be the LHS operand of the predicate computed by
2576    conditional statement GS.  */
2577
2578 static inline void
2579 gimple_cond_set_lhs (gimple gs, tree lhs)
2580 {
2581   GIMPLE_CHECK (gs, GIMPLE_COND);
2582   gimple_set_op (gs, 0, lhs);
2583 }
2584
2585
2586 /* Return the RHS operand of the predicate computed by conditional GS.  */
2587
2588 static inline tree
2589 gimple_cond_rhs (const_gimple gs)
2590 {
2591   GIMPLE_CHECK (gs, GIMPLE_COND);
2592   return gimple_op (gs, 1);
2593 }
2594
2595 /* Return the pointer to the RHS operand of the predicate computed by
2596    conditional GS.  */
2597
2598 static inline tree *
2599 gimple_cond_rhs_ptr (const_gimple gs)
2600 {
2601   GIMPLE_CHECK (gs, GIMPLE_COND);
2602   return gimple_op_ptr (gs, 1);
2603 }
2604
2605
2606 /* Set RHS to be the RHS operand of the predicate computed by
2607    conditional statement GS.  */
2608
2609 static inline void
2610 gimple_cond_set_rhs (gimple gs, tree rhs)
2611 {
2612   GIMPLE_CHECK (gs, GIMPLE_COND);
2613   gimple_set_op (gs, 1, rhs);
2614 }
2615
2616
2617 /* Return the label used by conditional statement GS when its
2618    predicate evaluates to true.  */
2619
2620 static inline tree
2621 gimple_cond_true_label (const_gimple gs)
2622 {
2623   GIMPLE_CHECK (gs, GIMPLE_COND);
2624   return gimple_op (gs, 2);
2625 }
2626
2627
2628 /* Set LABEL to be the label used by conditional statement GS when its
2629    predicate evaluates to true.  */
2630
2631 static inline void
2632 gimple_cond_set_true_label (gimple gs, tree label)
2633 {
2634   GIMPLE_CHECK (gs, GIMPLE_COND);
2635   gimple_set_op (gs, 2, label);
2636 }
2637
2638
2639 /* Set LABEL to be the label used by conditional statement GS when its
2640    predicate evaluates to false.  */
2641
2642 static inline void
2643 gimple_cond_set_false_label (gimple gs, tree label)
2644 {
2645   GIMPLE_CHECK (gs, GIMPLE_COND);
2646   gimple_set_op (gs, 3, label);
2647 }
2648
2649
2650 /* Return the label used by conditional statement GS when its
2651    predicate evaluates to false.  */
2652
2653 static inline tree
2654 gimple_cond_false_label (const_gimple gs)
2655 {
2656   GIMPLE_CHECK (gs, GIMPLE_COND);
2657   return gimple_op (gs, 3);
2658 }
2659
2660
2661 /* Set the conditional COND_STMT to be of the form 'if (1 == 0)'.  */
2662
2663 static inline void
2664 gimple_cond_make_false (gimple gs)
2665 {
2666   gimple_cond_set_lhs (gs, boolean_true_node);
2667   gimple_cond_set_rhs (gs, boolean_false_node);
2668   gs->gsbase.subcode = EQ_EXPR;
2669 }
2670
2671
2672 /* Set the conditional COND_STMT to be of the form 'if (1 == 1)'.  */
2673
2674 static inline void
2675 gimple_cond_make_true (gimple gs)
2676 {
2677   gimple_cond_set_lhs (gs, boolean_true_node);
2678   gimple_cond_set_rhs (gs, boolean_true_node);
2679   gs->gsbase.subcode = EQ_EXPR;
2680 }
2681
2682 /* Check if conditional statemente GS is of the form 'if (1 == 1)',
2683   'if (0 == 0)', 'if (1 != 0)' or 'if (0 != 1)' */
2684
2685 static inline bool
2686 gimple_cond_true_p (const_gimple gs)
2687 {
2688   tree lhs = gimple_cond_lhs (gs);
2689   tree rhs = gimple_cond_rhs (gs);
2690   enum tree_code code = gimple_cond_code (gs);
2691
2692   if (lhs != boolean_true_node && lhs != boolean_false_node)
2693     return false;
2694
2695   if (rhs != boolean_true_node && rhs != boolean_false_node)
2696     return false;
2697
2698   if (code == NE_EXPR && lhs != rhs)
2699     return true;
2700
2701   if (code == EQ_EXPR && lhs == rhs)
2702       return true;
2703
2704   return false;
2705 }
2706
2707 /* Check if conditional statement GS is of the form 'if (1 != 1)',
2708    'if (0 != 0)', 'if (1 == 0)' or 'if (0 == 1)' */
2709
2710 static inline bool
2711 gimple_cond_false_p (const_gimple gs)
2712 {
2713   tree lhs = gimple_cond_lhs (gs);
2714   tree rhs = gimple_cond_rhs (gs);
2715   enum tree_code code = gimple_cond_code (gs);
2716
2717   if (lhs != boolean_true_node && lhs != boolean_false_node)
2718     return false;
2719
2720   if (rhs != boolean_true_node && rhs != boolean_false_node)
2721     return false;
2722
2723   if (code == NE_EXPR && lhs == rhs)
2724     return true;
2725
2726   if (code == EQ_EXPR && lhs != rhs)
2727       return true;
2728
2729   return false;
2730 }
2731
2732 /* Check if conditional statement GS is of the form 'if (var != 0)' or
2733    'if (var == 1)' */
2734
2735 static inline bool
2736 gimple_cond_single_var_p (gimple gs)
2737 {
2738   if (gimple_cond_code (gs) == NE_EXPR
2739       && gimple_cond_rhs (gs) == boolean_false_node)
2740     return true;
2741
2742   if (gimple_cond_code (gs) == EQ_EXPR
2743       && gimple_cond_rhs (gs) == boolean_true_node)
2744     return true;
2745
2746   return false;
2747 }
2748
2749 /* Set the code, LHS and RHS of GIMPLE_COND STMT from CODE, LHS and RHS.  */
2750
2751 static inline void
2752 gimple_cond_set_condition (gimple stmt, enum tree_code code, tree lhs, tree rhs)
2753 {
2754   gimple_cond_set_code (stmt, code);
2755   gimple_cond_set_lhs (stmt, lhs);
2756   gimple_cond_set_rhs (stmt, rhs);
2757 }
2758
2759 /* Return the LABEL_DECL node used by GIMPLE_LABEL statement GS.  */
2760
2761 static inline tree
2762 gimple_label_label (const_gimple gs)
2763 {
2764   GIMPLE_CHECK (gs, GIMPLE_LABEL);
2765   return gimple_op (gs, 0);
2766 }
2767
2768
2769 /* Set LABEL to be the LABEL_DECL node used by GIMPLE_LABEL statement
2770    GS.  */
2771
2772 static inline void
2773 gimple_label_set_label (gimple gs, tree label)
2774 {
2775   GIMPLE_CHECK (gs, GIMPLE_LABEL);
2776   gimple_set_op (gs, 0, label);
2777 }
2778
2779
2780 /* Return the destination of the unconditional jump GS.  */
2781
2782 static inline tree
2783 gimple_goto_dest (const_gimple gs)
2784 {
2785   GIMPLE_CHECK (gs, GIMPLE_GOTO);
2786   return gimple_op (gs, 0);
2787 }
2788
2789
2790 /* Set DEST to be the destination of the unconditonal jump GS.  */
2791
2792 static inline void
2793 gimple_goto_set_dest (gimple gs, tree dest)
2794 {
2795   GIMPLE_CHECK (gs, GIMPLE_GOTO);
2796   gimple_set_op (gs, 0, dest);
2797 }
2798
2799
2800 /* Return the variables declared in the GIMPLE_BIND statement GS.  */
2801
2802 static inline tree
2803 gimple_bind_vars (const_gimple gs)
2804 {
2805   GIMPLE_CHECK (gs, GIMPLE_BIND);
2806   return gs->gimple_bind.vars;
2807 }
2808
2809
2810 /* Set VARS to be the set of variables declared in the GIMPLE_BIND
2811    statement GS.  */
2812
2813 static inline void
2814 gimple_bind_set_vars (gimple gs, tree vars)
2815 {
2816   GIMPLE_CHECK (gs, GIMPLE_BIND);
2817   gs->gimple_bind.vars = vars;
2818 }
2819
2820
2821 /* Append VARS to the set of variables declared in the GIMPLE_BIND
2822    statement GS.  */
2823
2824 static inline void
2825 gimple_bind_append_vars (gimple gs, tree vars)
2826 {
2827   GIMPLE_CHECK (gs, GIMPLE_BIND);
2828   gs->gimple_bind.vars = chainon (gs->gimple_bind.vars, vars);
2829 }
2830
2831
2832 /* Return the GIMPLE sequence contained in the GIMPLE_BIND statement GS.  */
2833
2834 static inline gimple_seq
2835 gimple_bind_body (gimple gs)
2836 {
2837   GIMPLE_CHECK (gs, GIMPLE_BIND);
2838   return gs->gimple_bind.body;
2839 }
2840
2841
2842 /* Set SEQ to be the GIMPLE sequence contained in the GIMPLE_BIND
2843    statement GS.  */
2844
2845 static inline void
2846 gimple_bind_set_body (gimple gs, gimple_seq seq)
2847 {
2848   GIMPLE_CHECK (gs, GIMPLE_BIND);
2849   gs->gimple_bind.body = seq;
2850 }
2851
2852
2853 /* Append a statement to the end of a GIMPLE_BIND's body.  */
2854
2855 static inline void
2856 gimple_bind_add_stmt (gimple gs, gimple stmt)
2857 {
2858   GIMPLE_CHECK (gs, GIMPLE_BIND);
2859   gimple_seq_add_stmt (&gs->gimple_bind.body, stmt);
2860 }
2861
2862
2863 /* Append a sequence of statements to the end of a GIMPLE_BIND's body.  */
2864
2865 static inline void
2866 gimple_bind_add_seq (gimple gs, gimple_seq seq)
2867 {
2868   GIMPLE_CHECK (gs, GIMPLE_BIND);
2869   gimple_seq_add_seq (&gs->gimple_bind.body, seq);
2870 }
2871
2872
2873 /* Return the TREE_BLOCK node associated with GIMPLE_BIND statement
2874    GS.  This is analogous to the BIND_EXPR_BLOCK field in trees.  */
2875
2876 static inline tree
2877 gimple_bind_block (const_gimple gs)
2878 {
2879   GIMPLE_CHECK (gs, GIMPLE_BIND);
2880   return gs->gimple_bind.block;
2881 }
2882
2883
2884 /* Set BLOCK to be the TREE_BLOCK node associated with GIMPLE_BIND
2885    statement GS.  */
2886
2887 static inline void
2888 gimple_bind_set_block (gimple gs, tree block)
2889 {
2890   GIMPLE_CHECK (gs, GIMPLE_BIND);
2891   gcc_gimple_checking_assert (block == NULL_TREE
2892                               || TREE_CODE (block) == BLOCK);
2893   gs->gimple_bind.block = block;
2894 }
2895
2896
2897 /* Return the number of input operands for GIMPLE_ASM GS.  */
2898
2899 static inline unsigned
2900 gimple_asm_ninputs (const_gimple gs)
2901 {
2902   GIMPLE_CHECK (gs, GIMPLE_ASM);
2903   return gs->gimple_asm.ni;
2904 }
2905
2906
2907 /* Return the number of output operands for GIMPLE_ASM GS.  */
2908
2909 static inline unsigned
2910 gimple_asm_noutputs (const_gimple gs)
2911 {
2912   GIMPLE_CHECK (gs, GIMPLE_ASM);
2913   return gs->gimple_asm.no;
2914 }
2915
2916
2917 /* Return the number of clobber operands for GIMPLE_ASM GS.  */
2918
2919 static inline unsigned
2920 gimple_asm_nclobbers (const_gimple gs)
2921 {
2922   GIMPLE_CHECK (gs, GIMPLE_ASM);
2923   return gs->gimple_asm.nc;
2924 }
2925
2926 /* Return the number of label operands for GIMPLE_ASM GS.  */
2927
2928 static inline unsigned
2929 gimple_asm_nlabels (const_gimple gs)
2930 {
2931   GIMPLE_CHECK (gs, GIMPLE_ASM);
2932   return gs->gimple_asm.nl;
2933 }
2934
2935 /* Return input operand INDEX of GIMPLE_ASM GS.  */
2936
2937 static inline tree
2938 gimple_asm_input_op (const_gimple gs, unsigned index)
2939 {
2940   GIMPLE_CHECK (gs, GIMPLE_ASM);
2941   gcc_gimple_checking_assert (index <= gs->gimple_asm.ni);
2942   return gimple_op (gs, index);
2943 }
2944
2945 /* Return a pointer to input operand INDEX of GIMPLE_ASM GS.  */
2946
2947 static inline tree *
2948 gimple_asm_input_op_ptr (const_gimple gs, unsigned index)
2949 {
2950   GIMPLE_CHECK (gs, GIMPLE_ASM);
2951   gcc_gimple_checking_assert (index <= gs->gimple_asm.ni);
2952   return gimple_op_ptr (gs, index);
2953 }
2954
2955
2956 /* Set IN_OP to be input operand INDEX in GIMPLE_ASM GS.  */
2957
2958 static inline void
2959 gimple_asm_set_input_op (gimple gs, unsigned index, tree in_op)
2960 {
2961   GIMPLE_CHECK (gs, GIMPLE_ASM);
2962   gcc_gimple_checking_assert (index <= gs->gimple_asm.ni
2963                               && TREE_CODE (in_op) == TREE_LIST);
2964   gimple_set_op (gs, index, in_op);
2965 }
2966
2967
2968 /* Return output operand INDEX of GIMPLE_ASM GS.  */
2969
2970 static inline tree
2971 gimple_asm_output_op (const_gimple gs, unsigned index)
2972 {
2973   GIMPLE_CHECK (gs, GIMPLE_ASM);
2974   gcc_gimple_checking_assert (index <= gs->gimple_asm.no);
2975   return gimple_op (gs, index + gs->gimple_asm.ni);
2976 }
2977
2978 /* Return a pointer to output operand INDEX of GIMPLE_ASM GS.  */
2979
2980 static inline tree *
2981 gimple_asm_output_op_ptr (const_gimple gs, unsigned index)
2982 {
2983   GIMPLE_CHECK (gs, GIMPLE_ASM);
2984   gcc_gimple_checking_assert (index <= gs->gimple_asm.no);
2985   return gimple_op_ptr (gs, index + gs->gimple_asm.ni);
2986 }
2987
2988
2989 /* Set OUT_OP to be output operand INDEX in GIMPLE_ASM GS.  */
2990
2991 static inline void
2992 gimple_asm_set_output_op (gimple gs, unsigned index, tree out_op)
2993 {
2994   GIMPLE_CHECK (gs, GIMPLE_ASM);
2995   gcc_gimple_checking_assert (index <= gs->gimple_asm.no
2996                               && TREE_CODE (out_op) == TREE_LIST);
2997   gimple_set_op (gs, index + gs->gimple_asm.ni, out_op);
2998 }
2999
3000
3001 /* Return clobber operand INDEX of GIMPLE_ASM GS.  */
3002
3003 static inline tree
3004 gimple_asm_clobber_op (const_gimple gs, unsigned index)
3005 {
3006   GIMPLE_CHECK (gs, GIMPLE_ASM);
3007   gcc_gimple_checking_assert (index <= gs->gimple_asm.nc);
3008   return gimple_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.no);
3009 }
3010
3011
3012 /* Set CLOBBER_OP to be clobber operand INDEX in GIMPLE_ASM GS.  */
3013
3014 static inline void
3015 gimple_asm_set_clobber_op (gimple gs, unsigned index, tree clobber_op)
3016 {
3017   GIMPLE_CHECK (gs, GIMPLE_ASM);
3018   gcc_gimple_checking_assert (index <= gs->gimple_asm.nc
3019                               && TREE_CODE (clobber_op) == TREE_LIST);
3020   gimple_set_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.no, clobber_op);
3021 }
3022
3023 /* Return label operand INDEX of GIMPLE_ASM GS.  */
3024
3025 static inline tree
3026 gimple_asm_label_op (const_gimple gs, unsigned index)
3027 {
3028   GIMPLE_CHECK (gs, GIMPLE_ASM);
3029   gcc_gimple_checking_assert (index <= gs->gimple_asm.nl);
3030   return gimple_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.nc);
3031 }
3032
3033 /* Set LABEL_OP to be label operand INDEX in GIMPLE_ASM GS.  */
3034
3035 static inline void
3036 gimple_asm_set_label_op (gimple gs, unsigned index, tree label_op)
3037 {
3038   GIMPLE_CHECK (gs, GIMPLE_ASM);
3039   gcc_gimple_checking_assert (index <= gs->gimple_asm.nl
3040                               && TREE_CODE (label_op) == TREE_LIST);
3041   gimple_set_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.nc, label_op);
3042 }
3043
3044 /* Return the string representing the assembly instruction in
3045    GIMPLE_ASM GS.  */
3046
3047 static inline const char *
3048 gimple_asm_string (const_gimple gs)
3049 {
3050   GIMPLE_CHECK (gs, GIMPLE_ASM);
3051   return gs->gimple_asm.string;
3052 }
3053
3054
3055 /* Return true if GS is an asm statement marked volatile.  */
3056
3057 static inline bool
3058 gimple_asm_volatile_p (const_gimple gs)
3059 {
3060   GIMPLE_CHECK (gs, GIMPLE_ASM);
3061   return (gs->gsbase.subcode & GF_ASM_VOLATILE) != 0;
3062 }
3063
3064
3065 /* If VOLATLE_P is true, mark asm statement GS as volatile.  */
3066
3067 static inline void
3068 gimple_asm_set_volatile (gimple gs, bool volatile_p)
3069 {
3070   GIMPLE_CHECK (gs, GIMPLE_ASM);
3071   if (volatile_p)
3072     gs->gsbase.subcode |= GF_ASM_VOLATILE;
3073   else
3074     gs->gsbase.subcode &= ~GF_ASM_VOLATILE;
3075 }
3076
3077
3078 /* If INPUT_P is true, mark asm GS as an ASM_INPUT.  */
3079
3080 static inline void
3081 gimple_asm_set_input (gimple gs, bool input_p)
3082 {
3083   GIMPLE_CHECK (gs, GIMPLE_ASM);
3084   if (input_p)
3085     gs->gsbase.subcode |= GF_ASM_INPUT;
3086   else
3087     gs->gsbase.subcode &= ~GF_ASM_INPUT;
3088 }
3089
3090
3091 /* Return true if asm GS is an ASM_INPUT.  */
3092
3093 static inline bool
3094 gimple_asm_input_p (const_gimple gs)
3095 {
3096   GIMPLE_CHECK (gs, GIMPLE_ASM);
3097   return (gs->gsbase.subcode & GF_ASM_INPUT) != 0;
3098 }
3099
3100
3101 /* Return the types handled by GIMPLE_CATCH statement GS.  */
3102
3103 static inline tree
3104 gimple_catch_types (const_gimple gs)
3105 {
3106   GIMPLE_CHECK (gs, GIMPLE_CATCH);
3107   return gs->gimple_catch.types;
3108 }
3109
3110
3111 /* Return a pointer to the types handled by GIMPLE_CATCH statement GS.  */
3112
3113 static inline tree *
3114 gimple_catch_types_ptr (gimple gs)
3115 {
3116   GIMPLE_CHECK (gs, GIMPLE_CATCH);
3117   return &gs->gimple_catch.types;
3118 }
3119
3120
3121 /* Return the GIMPLE sequence representing the body of the handler of
3122    GIMPLE_CATCH statement GS.  */
3123
3124 static inline gimple_seq
3125 gimple_catch_handler (gimple gs)
3126 {
3127   GIMPLE_CHECK (gs, GIMPLE_CATCH);
3128   return gs->gimple_catch.handler;
3129 }
3130
3131
3132 /* Return a pointer to the GIMPLE sequence representing the body of
3133    the handler of GIMPLE_CATCH statement GS.  */
3134
3135 static inline gimple_seq *
3136 gimple_catch_handler_ptr (gimple gs)
3137 {
3138   GIMPLE_CHECK (gs, GIMPLE_CATCH);
3139   return &gs->gimple_catch.handler;
3140 }
3141
3142
3143 /* Set T to be the set of types handled by GIMPLE_CATCH GS.  */
3144
3145 static inline void
3146 gimple_catch_set_types (gimple gs, tree t)
3147 {
3148   GIMPLE_CHECK (gs, GIMPLE_CATCH);
3149   gs->gimple_catch.types = t;
3150 }
3151
3152
3153 /* Set HANDLER to be the body of GIMPLE_CATCH GS.  */
3154
3155 static inline void
3156 gimple_catch_set_handler (gimple gs, gimple_seq handler)
3157 {
3158   GIMPLE_CHECK (gs, GIMPLE_CATCH);
3159   gs->gimple_catch.handler = handler;
3160 }
3161
3162
3163 /* Return the types handled by GIMPLE_EH_FILTER statement GS.  */
3164
3165 static inline tree
3166 gimple_eh_filter_types (const_gimple gs)
3167 {
3168   GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
3169   return gs->gimple_eh_filter.types;
3170 }
3171
3172
3173 /* Return a pointer to the types handled by GIMPLE_EH_FILTER statement
3174    GS.  */
3175
3176 static inline tree *
3177 gimple_eh_filter_types_ptr (gimple gs)
3178 {
3179   GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
3180   return &gs->gimple_eh_filter.types;
3181 }
3182
3183
3184 /* Return the sequence of statement to execute when GIMPLE_EH_FILTER
3185    statement fails.  */
3186
3187 static inline gimple_seq
3188 gimple_eh_filter_failure (gimple gs)
3189 {
3190   GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
3191   return gs->gimple_eh_filter.failure;
3192 }
3193
3194
3195 /* Set TYPES to be the set of types handled by GIMPLE_EH_FILTER GS.  */
3196
3197 static inline void
3198 gimple_eh_filter_set_types (gimple gs, tree types)
3199 {
3200   GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
3201   gs->gimple_eh_filter.types = types;
3202 }
3203
3204
3205 /* Set FAILURE to be the sequence of statements to execute on failure
3206    for GIMPLE_EH_FILTER GS.  */
3207
3208 static inline void
3209 gimple_eh_filter_set_failure (gimple gs, gimple_seq failure)
3210 {
3211   GIMPLE_CHECK (gs, GIMPLE_EH_FILTER);
3212   gs->gimple_eh_filter.failure = failure;
3213 }
3214
3215 /* Get the function decl to be called by the MUST_NOT_THROW region.  */
3216
3217 static inline tree
3218 gimple_eh_must_not_throw_fndecl (gimple gs)
3219 {
3220   GIMPLE_CHECK (gs, GIMPLE_EH_MUST_NOT_THROW);
3221   return gs->gimple_eh_mnt.fndecl;
3222 }
3223
3224 /* Set the function decl to be called by GS to DECL.  */
3225
3226 static inline void
3227 gimple_eh_must_not_throw_set_fndecl (gimple gs, tree decl)
3228 {
3229   GIMPLE_CHECK (gs, GIMPLE_EH_MUST_NOT_THROW);
3230   gs->gimple_eh_mnt.fndecl = decl;
3231 }
3232
3233 /* GIMPLE_EH_ELSE accessors.  */
3234
3235 static inline gimple_seq
3236 gimple_eh_else_n_body (gimple gs)
3237 {
3238   GIMPLE_CHECK (gs, GIMPLE_EH_ELSE);
3239   return gs->gimple_eh_else.n_body;
3240 }
3241
3242 static inline gimple_seq
3243 gimple_eh_else_e_body (gimple gs)
3244 {
3245   GIMPLE_CHECK (gs, GIMPLE_EH_ELSE);
3246   return gs->gimple_eh_else.e_body;
3247 }
3248
3249 static inline void
3250 gimple_eh_else_set_n_body (gimple gs, gimple_seq seq)
3251 {
3252   GIMPLE_CHECK (gs, GIMPLE_EH_ELSE);
3253   gs->gimple_eh_else.n_body = seq;
3254 }
3255
3256 static inline void
3257 gimple_eh_else_set_e_body (gimple gs, gimple_seq seq)
3258 {
3259   GIMPLE_CHECK (gs, GIMPLE_EH_ELSE);
3260   gs->gimple_eh_else.e_body = seq;
3261 }
3262
3263 /* GIMPLE_TRY accessors. */
3264
3265 /* Return the kind of try block represented by GIMPLE_TRY GS.  This is
3266    either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY.  */
3267
3268 static inline enum gimple_try_flags
3269 gimple_try_kind (const_gimple gs)
3270 {
3271   GIMPLE_CHECK (gs, GIMPLE_TRY);
3272   return (enum gimple_try_flags) (gs->gsbase.subcode & GIMPLE_TRY_KIND);
3273 }
3274
3275
3276 /* Set the kind of try block represented by GIMPLE_TRY GS.  */
3277
3278 static inline void
3279 gimple_try_set_kind (gimple gs, enum gimple_try_flags kind)
3280 {
3281   GIMPLE_CHECK (gs, GIMPLE_TRY);
3282   gcc_gimple_checking_assert (kind == GIMPLE_TRY_CATCH
3283                               || kind == GIMPLE_TRY_FINALLY);
3284   if (gimple_try_kind (gs) != kind)
3285     gs->gsbase.subcode = (unsigned int) kind;
3286 }
3287
3288
3289 /* Return the GIMPLE_TRY_CATCH_IS_CLEANUP flag.  */
3290
3291 static inline bool
3292 gimple_try_catch_is_cleanup (const_gimple gs)
3293 {
3294   gcc_gimple_checking_assert (gimple_try_kind (gs) == GIMPLE_TRY_CATCH);
3295   return (gs->gsbase.subcode & GIMPLE_TRY_CATCH_IS_CLEANUP) != 0;
3296 }
3297
3298
3299 /* Return the sequence of statements used as the body for GIMPLE_TRY GS.  */
3300
3301 static inline gimple_seq
3302 gimple_try_eval (gimple gs)
3303 {
3304   GIMPLE_CHECK (gs, GIMPLE_TRY);
3305   return gs->gimple_try.eval;
3306 }
3307
3308
3309 /* Return the sequence of statements used as the cleanup body for
3310    GIMPLE_TRY GS.  */
3311
3312 static inline gimple_seq
3313 gimple_try_cleanup (gimple gs)
3314 {
3315   GIMPLE_CHECK (gs, GIMPLE_TRY);
3316   return gs->gimple_try.cleanup;
3317 }
3318
3319
3320 /* Set the GIMPLE_TRY_CATCH_IS_CLEANUP flag.  */
3321
3322 static inline void
3323 gimple_try_set_catch_is_cleanup (gimple g, bool catch_is_cleanup)
3324 {
3325   gcc_gimple_checking_assert (gimple_try_kind (g) == GIMPLE_TRY_CATCH);
3326   if (catch_is_cleanup)
3327     g->gsbase.subcode |= GIMPLE_TRY_CATCH_IS_CLEANUP;
3328   else
3329     g->gsbase.subcode &= ~GIMPLE_TRY_CATCH_IS_CLEANUP;
3330 }
3331
3332
3333 /* Set EVAL to be the sequence of statements to use as the body for
3334    GIMPLE_TRY GS.  */
3335
3336 static inline void
3337 gimple_try_set_eval (gimple gs, gimple_seq eval)
3338 {
3339   GIMPLE_CHECK (gs, GIMPLE_TRY);
3340   gs->gimple_try.eval = eval;
3341 }
3342
3343
3344 /* Set CLEANUP to be the sequence of statements to use as the cleanup
3345    body for GIMPLE_TRY GS.  */
3346
3347 static inline void
3348 gimple_try_set_cleanup (gimple gs, gimple_seq cleanup)
3349 {
3350   GIMPLE_CHECK (gs, GIMPLE_TRY);
3351   gs->gimple_try.cleanup = cleanup;
3352 }
3353
3354
3355 /* Return the cleanup sequence for cleanup statement GS.  */
3356
3357 static inline gimple_seq
3358 gimple_wce_cleanup (gimple gs)
3359 {
3360   GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
3361   return gs->gimple_wce.cleanup;
3362 }
3363
3364
3365 /* Set CLEANUP to be the cleanup sequence for GS.  */
3366
3367 static inline void
3368 gimple_wce_set_cleanup (gimple gs, gimple_seq cleanup)
3369 {
3370   GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
3371   gs->gimple_wce.cleanup = cleanup;
3372 }
3373
3374
3375 /* Return the CLEANUP_EH_ONLY flag for a WCE tuple.  */
3376
3377 static inline bool
3378 gimple_wce_cleanup_eh_only (const_gimple gs)
3379 {
3380   GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
3381   return gs->gsbase.subcode != 0;
3382 }
3383
3384
3385 /* Set the CLEANUP_EH_ONLY flag for a WCE tuple.  */
3386
3387 static inline void
3388 gimple_wce_set_cleanup_eh_only (gimple gs, bool eh_only_p)
3389 {
3390   GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
3391   gs->gsbase.subcode = (unsigned int) eh_only_p;
3392 }
3393
3394
3395 /* Return the maximum number of arguments supported by GIMPLE_PHI GS.  */
3396
3397 static inline unsigned
3398 gimple_phi_capacity (const_gimple gs)
3399 {
3400   GIMPLE_CHECK (gs, GIMPLE_PHI);
3401   return gs->gimple_phi.capacity;
3402 }
3403
3404
3405 /* Return the number of arguments in GIMPLE_PHI GS.  This must always
3406    be exactly the number of incoming edges for the basic block holding
3407    GS.  */
3408
3409 static inline unsigned
3410 gimple_phi_num_args (const_gimple gs)
3411 {
3412   GIMPLE_CHECK (gs, GIMPLE_PHI);
3413   return gs->gimple_phi.nargs;
3414 }
3415
3416
3417 /* Return the SSA name created by GIMPLE_PHI GS.  */
3418
3419 static inline tree
3420 gimple_phi_result (const_gimple gs)
3421 {
3422   GIMPLE_CHECK (gs, GIMPLE_PHI);
3423   return gs->gimple_phi.result;
3424 }
3425
3426 /* Return a pointer to the SSA name created by GIMPLE_PHI GS.  */
3427
3428 static inline tree *
3429 gimple_phi_result_ptr (gimple gs)
3430 {
3431   GIMPLE_CHECK (gs, GIMPLE_PHI);
3432   return &gs->gimple_phi.result;
3433 }
3434
3435 /* Set RESULT to be the SSA name created by GIMPLE_PHI GS.  */
3436
3437 static inline void
3438 gimple_phi_set_result (gimple gs, tree result)
3439 {
3440   GIMPLE_CHECK (gs, GIMPLE_PHI);
3441   gs->gimple_phi.result = result;
3442 }
3443
3444
3445 /* Return the PHI argument corresponding to incoming edge INDEX for
3446    GIMPLE_PHI GS.  */
3447
3448 static inline struct phi_arg_d *
3449 gimple_phi_arg (gimple gs, unsigned index)
3450 {
3451   GIMPLE_CHECK (gs, GIMPLE_PHI);
3452   gcc_gimple_checking_assert (index <= gs->gimple_phi.capacity);
3453   return &(gs->gimple_phi.args[index]);
3454 }
3455
3456 /* Set PHIARG to be the argument corresponding to incoming edge INDEX
3457    for GIMPLE_PHI GS.  */
3458
3459 static inline void
3460 gimple_phi_set_arg (gimple gs, unsigned index, struct phi_arg_d * phiarg)
3461 {
3462   GIMPLE_CHECK (gs, GIMPLE_PHI);
3463   gcc_gimple_checking_assert (index <= gs->gimple_phi.nargs);
3464   gs->gimple_phi.args[index] = *phiarg;
3465 }
3466
3467 /* Return the region number for GIMPLE_RESX GS.  */
3468
3469 static inline int
3470 gimple_resx_region (const_gimple gs)
3471 {
3472   GIMPLE_CHECK (gs, GIMPLE_RESX);
3473   return gs->gimple_eh_ctrl.region;
3474 }
3475
3476 /* Set REGION to be the region number for GIMPLE_RESX GS.  */
3477
3478 static inline void
3479 gimple_resx_set_region (gimple gs, int region)
3480 {
3481   GIMPLE_CHECK (gs, GIMPLE_RESX);
3482   gs->gimple_eh_ctrl.region = region;
3483 }
3484
3485 /* Return the region number for GIMPLE_EH_DISPATCH GS.  */
3486
3487 static inline int
3488 gimple_eh_dispatch_region (const_gimple gs)
3489 {
3490   GIMPLE_CHECK (gs, GIMPLE_EH_DISPATCH);
3491   return gs->gimple_eh_ctrl.region;
3492 }
3493
3494 /* Set REGION to be the region number for GIMPLE_EH_DISPATCH GS.  */
3495
3496 static inline void
3497 gimple_eh_dispatch_set_region (gimple gs, int region)
3498 {
3499   GIMPLE_CHECK (gs, GIMPLE_EH_DISPATCH);
3500   gs->gimple_eh_ctrl.region = region;
3501 }
3502
3503 /* Return the number of labels associated with the switch statement GS.  */
3504
3505 static inline unsigned
3506 gimple_switch_num_labels (const_gimple gs)
3507 {
3508   unsigned num_ops;
3509   GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3510   num_ops = gimple_num_ops (gs);
3511   gcc_gimple_checking_assert (num_ops > 1);
3512   return num_ops - 1;
3513 }
3514
3515
3516 /* Set NLABELS to be the number of labels for the switch statement GS.  */
3517
3518 static inline void
3519 gimple_switch_set_num_labels (gimple g, unsigned nlabels)
3520 {
3521   GIMPLE_CHECK (g, GIMPLE_SWITCH);
3522   gimple_set_num_ops (g, nlabels + 1);
3523 }
3524
3525
3526 /* Return the index variable used by the switch statement GS.  */
3527
3528 static inline tree
3529 gimple_switch_index (const_gimple gs)
3530 {
3531   GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3532   return gimple_op (gs, 0);
3533 }
3534
3535
3536 /* Return a pointer to the index variable for the switch statement GS.  */
3537
3538 static inline tree *
3539 gimple_switch_index_ptr (const_gimple gs)
3540 {
3541   GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3542   return gimple_op_ptr (gs, 0);
3543 }
3544
3545
3546 /* Set INDEX to be the index variable for switch statement GS.  */
3547
3548 static inline void
3549 gimple_switch_set_index (gimple gs, tree index)
3550 {
3551   GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3552   gcc_gimple_checking_assert (SSA_VAR_P (index) || CONSTANT_CLASS_P (index));
3553   gimple_set_op (gs, 0, index);
3554 }
3555
3556
3557 /* Return the label numbered INDEX.  The default label is 0, followed by any
3558    labels in a switch statement.  */
3559
3560 static inline tree
3561 gimple_switch_label (const_gimple gs, unsigned index)
3562 {
3563   GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3564   gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 1);
3565   return gimple_op (gs, index + 1);
3566 }
3567
3568 /* Set the label number INDEX to LABEL.  0 is always the default label.  */
3569
3570 static inline void
3571 gimple_switch_set_label (gimple gs, unsigned index, tree label)
3572 {
3573   GIMPLE_CHECK (gs, GIMPLE_SWITCH);
3574   gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 1
3575                               && (label == NULL_TREE
3576                                   || TREE_CODE (label) == CASE_LABEL_EXPR));
3577   gimple_set_op (gs, index + 1, label);
3578 }
3579
3580 /* Return the default label for a switch statement.  */
3581
3582 static inline tree
3583 gimple_switch_default_label (const_gimple gs)
3584 {
3585   return gimple_switch_label (gs, 0);
3586 }
3587
3588 /* Set the default label for a switch statement.  */
3589
3590 static inline void
3591 gimple_switch_set_default_label (gimple gs, tree label)
3592 {
3593   gimple_switch_set_label (gs, 0, label);
3594 }
3595
3596 /* Return true if GS is a GIMPLE_DEBUG statement.  */
3597
3598 static inline bool
3599 is_gimple_debug (const_gimple gs)
3600 {
3601   return gimple_code (gs) == GIMPLE_DEBUG;
3602 }
3603
3604 /* Return true if S is a GIMPLE_DEBUG BIND statement.  */
3605
3606 static inline bool
3607 gimple_debug_bind_p (const_gimple s)
3608 {
3609   if (is_gimple_debug (s))
3610     return s->gsbase.subcode == GIMPLE_DEBUG_BIND;
3611
3612   return false;
3613 }
3614
3615 /* Return the variable bound in a GIMPLE_DEBUG bind statement.  */
3616
3617 static inline tree
3618 gimple_debug_bind_get_var (gimple dbg)
3619 {
3620   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3621   gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
3622   return gimple_op (dbg, 0);
3623 }
3624
3625 /* Return the value bound to the variable in a GIMPLE_DEBUG bind
3626    statement.  */
3627
3628 static inline tree
3629 gimple_debug_bind_get_value (gimple dbg)
3630 {
3631   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3632   gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
3633   return gimple_op (dbg, 1);
3634 }
3635
3636 /* Return a pointer to the value bound to the variable in a
3637    GIMPLE_DEBUG bind statement.  */
3638
3639 static inline tree *
3640 gimple_debug_bind_get_value_ptr (gimple dbg)
3641 {
3642   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3643   gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
3644   return gimple_op_ptr (dbg, 1);
3645 }
3646
3647 /* Set the variable bound in a GIMPLE_DEBUG bind statement.  */
3648
3649 static inline void
3650 gimple_debug_bind_set_var (gimple dbg, tree var)
3651 {
3652   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3653   gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
3654   gimple_set_op (dbg, 0, var);
3655 }
3656
3657 /* Set the value bound to the variable in a GIMPLE_DEBUG bind
3658    statement.  */
3659
3660 static inline void
3661 gimple_debug_bind_set_value (gimple dbg, tree value)
3662 {
3663   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3664   gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
3665   gimple_set_op (dbg, 1, value);
3666 }
3667
3668 /* The second operand of a GIMPLE_DEBUG_BIND, when the value was
3669    optimized away.  */
3670 #define GIMPLE_DEBUG_BIND_NOVALUE NULL_TREE /* error_mark_node */
3671
3672 /* Remove the value bound to the variable in a GIMPLE_DEBUG bind
3673    statement.  */
3674
3675 static inline void
3676 gimple_debug_bind_reset_value (gimple dbg)
3677 {
3678   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3679   gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
3680   gimple_set_op (dbg, 1, GIMPLE_DEBUG_BIND_NOVALUE);
3681 }
3682
3683 /* Return true if the GIMPLE_DEBUG bind statement is bound to a
3684    value.  */
3685
3686 static inline bool
3687 gimple_debug_bind_has_value_p (gimple dbg)
3688 {
3689   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3690   gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
3691   return gimple_op (dbg, 1) != GIMPLE_DEBUG_BIND_NOVALUE;
3692 }
3693
3694 #undef GIMPLE_DEBUG_BIND_NOVALUE
3695
3696 /* Return true if S is a GIMPLE_DEBUG SOURCE BIND statement.  */
3697
3698 static inline bool
3699 gimple_debug_source_bind_p (const_gimple s)
3700 {
3701   if (is_gimple_debug (s))
3702     return s->gsbase.subcode == GIMPLE_DEBUG_SOURCE_BIND;
3703
3704   return false;
3705 }
3706
3707 /* Return the variable bound in a GIMPLE_DEBUG source bind statement.  */
3708
3709 static inline tree
3710 gimple_debug_source_bind_get_var (gimple dbg)
3711 {
3712   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3713   gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
3714   return gimple_op (dbg, 0);
3715 }
3716
3717 /* Return the value bound to the variable in a GIMPLE_DEBUG source bind
3718    statement.  */
3719
3720 static inline tree
3721 gimple_debug_source_bind_get_value (gimple dbg)
3722 {
3723   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3724   gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
3725   return gimple_op (dbg, 1);
3726 }
3727
3728 /* Return a pointer to the value bound to the variable in a
3729    GIMPLE_DEBUG source bind statement.  */
3730
3731 static inline tree *
3732 gimple_debug_source_bind_get_value_ptr (gimple dbg)
3733 {
3734   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3735   gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
3736   return gimple_op_ptr (dbg, 1);
3737 }
3738
3739 /* Set the variable bound in a GIMPLE_DEBUG source bind statement.  */
3740
3741 static inline void
3742 gimple_debug_source_bind_set_var (gimple dbg, tree var)
3743 {
3744   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3745   gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
3746   gimple_set_op (dbg, 0, var);
3747 }
3748
3749 /* Set the value bound to the variable in a GIMPLE_DEBUG source bind
3750    statement.  */
3751
3752 static inline void
3753 gimple_debug_source_bind_set_value (gimple dbg, tree value)
3754 {
3755   GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
3756   gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
3757   gimple_set_op (dbg, 1, value);
3758 }
3759
3760 /* Return the body for the OMP statement GS.  */
3761
3762 static inline gimple_seq
3763 gimple_omp_body (gimple gs)
3764 {
3765   return gs->omp.body;
3766 }
3767
3768 /* Set BODY to be the body for the OMP statement GS.  */
3769
3770 static inline void
3771 gimple_omp_set_body (gimple gs, gimple_seq body)
3772 {
3773   gs->omp.body = body;
3774 }
3775
3776
3777 /* Return the name associated with OMP_CRITICAL statement GS.  */
3778
3779 static inline tree
3780 gimple_omp_critical_name (const_gimple gs)
3781 {
3782   GIMPLE_CHECK (gs, GIMPLE_OMP_CRITICAL);
3783   return gs->gimple_omp_critical.name;
3784 }
3785
3786
3787 /* Return a pointer to the name associated with OMP critical statement GS.  */
3788
3789 static inline tree *
3790 gimple_omp_critical_name_ptr (gimple gs)
3791 {
3792   GIMPLE_CHECK (gs, GIMPLE_OMP_CRITICAL);
3793   return &gs->gimple_omp_critical.name;
3794 }
3795
3796
3797 /* Set NAME to be the name associated with OMP critical statement GS.  */
3798
3799 static inline void
3800 gimple_omp_critical_set_name (gimple gs, tree name)
3801 {
3802   GIMPLE_CHECK (gs, GIMPLE_OMP_CRITICAL);
3803   gs->gimple_omp_critical.name = name;
3804 }
3805
3806
3807 /* Return the clauses associated with OMP_FOR GS.  */
3808
3809 static inline tree
3810 gimple_omp_for_clauses (const_gimple gs)
3811 {
3812   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3813   return gs->gimple_omp_for.clauses;
3814 }
3815
3816
3817 /* Return a pointer to the OMP_FOR GS.  */
3818
3819 static inline tree *
3820 gimple_omp_for_clauses_ptr (gimple gs)
3821 {
3822   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3823   return &gs->gimple_omp_for.clauses;
3824 }
3825
3826
3827 /* Set CLAUSES to be the list of clauses associated with OMP_FOR GS.  */
3828
3829 static inline void
3830 gimple_omp_for_set_clauses (gimple gs, tree clauses)
3831 {
3832   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3833   gs->gimple_omp_for.clauses = clauses;
3834 }
3835
3836
3837 /* Get the collapse count of OMP_FOR GS.  */
3838
3839 static inline size_t
3840 gimple_omp_for_collapse (gimple gs)
3841 {
3842   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3843   return gs->gimple_omp_for.collapse;
3844 }
3845
3846
3847 /* Return the index variable for OMP_FOR GS.  */
3848
3849 static inline tree
3850 gimple_omp_for_index (const_gimple gs, size_t i)
3851 {
3852   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3853   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3854   return gs->gimple_omp_for.iter[i].index;
3855 }
3856
3857
3858 /* Return a pointer to the index variable for OMP_FOR GS.  */
3859
3860 static inline tree *
3861 gimple_omp_for_index_ptr (gimple gs, size_t i)
3862 {
3863   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3864   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3865   return &gs->gimple_omp_for.iter[i].index;
3866 }
3867
3868
3869 /* Set INDEX to be the index variable for OMP_FOR GS.  */
3870
3871 static inline void
3872 gimple_omp_for_set_index (gimple gs, size_t i, tree index)
3873 {
3874   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3875   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3876   gs->gimple_omp_for.iter[i].index = index;
3877 }
3878
3879
3880 /* Return the initial value for OMP_FOR GS.  */
3881
3882 static inline tree
3883 gimple_omp_for_initial (const_gimple gs, size_t i)
3884 {
3885   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3886   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3887   return gs->gimple_omp_for.iter[i].initial;
3888 }
3889
3890
3891 /* Return a pointer to the initial value for OMP_FOR GS.  */
3892
3893 static inline tree *
3894 gimple_omp_for_initial_ptr (gimple gs, size_t i)
3895 {
3896   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3897   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3898   return &gs->gimple_omp_for.iter[i].initial;
3899 }
3900
3901
3902 /* Set INITIAL to be the initial value for OMP_FOR GS.  */
3903
3904 static inline void
3905 gimple_omp_for_set_initial (gimple gs, size_t i, tree initial)
3906 {
3907   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3908   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3909   gs->gimple_omp_for.iter[i].initial = initial;
3910 }
3911
3912
3913 /* Return the final value for OMP_FOR GS.  */
3914
3915 static inline tree
3916 gimple_omp_for_final (const_gimple gs, size_t i)
3917 {
3918   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3919   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3920   return gs->gimple_omp_for.iter[i].final;
3921 }
3922
3923
3924 /* Return a pointer to the final value for OMP_FOR GS.  */
3925
3926 static inline tree *
3927 gimple_omp_for_final_ptr (gimple gs, size_t i)
3928 {
3929   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3930   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3931   return &gs->gimple_omp_for.iter[i].final;
3932 }
3933
3934
3935 /* Set FINAL to be the final value for OMP_FOR GS.  */
3936
3937 static inline void
3938 gimple_omp_for_set_final (gimple gs, size_t i, tree final)
3939 {
3940   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3941   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3942   gs->gimple_omp_for.iter[i].final = final;
3943 }
3944
3945
3946 /* Return the increment value for OMP_FOR GS.  */
3947
3948 static inline tree
3949 gimple_omp_for_incr (const_gimple gs, size_t i)
3950 {
3951   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3952   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3953   return gs->gimple_omp_for.iter[i].incr;
3954 }
3955
3956
3957 /* Return a pointer to the increment value for OMP_FOR GS.  */
3958
3959 static inline tree *
3960 gimple_omp_for_incr_ptr (gimple gs, size_t i)
3961 {
3962   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3963   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3964   return &gs->gimple_omp_for.iter[i].incr;
3965 }
3966
3967
3968 /* Set INCR to be the increment value for OMP_FOR GS.  */
3969
3970 static inline void
3971 gimple_omp_for_set_incr (gimple gs, size_t i, tree incr)
3972 {
3973   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3974   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
3975   gs->gimple_omp_for.iter[i].incr = incr;
3976 }
3977
3978
3979 /* Return the sequence of statements to execute before the OMP_FOR
3980    statement GS starts.  */
3981
3982 static inline gimple_seq
3983 gimple_omp_for_pre_body (gimple gs)
3984 {
3985   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3986   return gs->gimple_omp_for.pre_body;
3987 }
3988
3989
3990 /* Set PRE_BODY to be the sequence of statements to execute before the
3991    OMP_FOR statement GS starts.  */
3992
3993 static inline void
3994 gimple_omp_for_set_pre_body (gimple gs, gimple_seq pre_body)
3995 {
3996   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
3997   gs->gimple_omp_for.pre_body = pre_body;
3998 }
3999
4000
4001 /* Return the clauses associated with OMP_PARALLEL GS.  */
4002
4003 static inline tree
4004 gimple_omp_parallel_clauses (const_gimple gs)
4005 {
4006   GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
4007   return gs->gimple_omp_parallel.clauses;
4008 }
4009
4010
4011 /* Return a pointer to the clauses associated with OMP_PARALLEL GS.  */
4012
4013 static inline tree *
4014 gimple_omp_parallel_clauses_ptr (gimple gs)
4015 {
4016   GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
4017   return &gs->gimple_omp_parallel.clauses;
4018 }
4019
4020
4021 /* Set CLAUSES to be the list of clauses associated with OMP_PARALLEL
4022    GS.  */
4023
4024 static inline void
4025 gimple_omp_parallel_set_clauses (gimple gs, tree clauses)
4026 {
4027   GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
4028   gs->gimple_omp_parallel.clauses = clauses;
4029 }
4030
4031
4032 /* Return the child function used to hold the body of OMP_PARALLEL GS.  */
4033
4034 static inline tree
4035 gimple_omp_parallel_child_fn (const_gimple gs)
4036 {
4037   GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
4038   return gs->gimple_omp_parallel.child_fn;
4039 }
4040
4041 /* Return a pointer to the child function used to hold the body of
4042    OMP_PARALLEL GS.  */
4043
4044 static inline tree *
4045 gimple_omp_parallel_child_fn_ptr (gimple gs)
4046 {
4047   GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
4048   return &gs->gimple_omp_parallel.child_fn;
4049 }
4050
4051
4052 /* Set CHILD_FN to be the child function for OMP_PARALLEL GS.  */
4053
4054 static inline void
4055 gimple_omp_parallel_set_child_fn (gimple gs, tree child_fn)
4056 {
4057   GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
4058   gs->gimple_omp_parallel.child_fn = child_fn;
4059 }
4060
4061
4062 /* Return the artificial argument used to send variables and values
4063    from the parent to the children threads in OMP_PARALLEL GS.  */
4064
4065 static inline tree
4066 gimple_omp_parallel_data_arg (const_gimple gs)
4067 {
4068   GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
4069   return gs->gimple_omp_parallel.data_arg;
4070 }
4071
4072
4073 /* Return a pointer to the data argument for OMP_PARALLEL GS.  */
4074
4075 static inline tree *
4076 gimple_omp_parallel_data_arg_ptr (gimple gs)
4077 {
4078   GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
4079   return &gs->gimple_omp_parallel.data_arg;
4080 }
4081
4082
4083 /* Set DATA_ARG to be the data argument for OMP_PARALLEL GS.  */
4084
4085 static inline void
4086 gimple_omp_parallel_set_data_arg (gimple gs, tree data_arg)
4087 {
4088   GIMPLE_CHECK (gs, GIMPLE_OMP_PARALLEL);
4089   gs->gimple_omp_parallel.data_arg = data_arg;
4090 }
4091
4092
4093 /* Return the clauses associated with OMP_TASK GS.  */
4094
4095 static inline tree
4096 gimple_omp_task_clauses (const_gimple gs)
4097 {
4098   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4099   return gs->gimple_omp_parallel.clauses;
4100 }
4101
4102
4103 /* Return a pointer to the clauses associated with OMP_TASK GS.  */
4104
4105 static inline tree *
4106 gimple_omp_task_clauses_ptr (gimple gs)
4107 {
4108   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4109   return &gs->gimple_omp_parallel.clauses;
4110 }
4111
4112
4113 /* Set CLAUSES to be the list of clauses associated with OMP_TASK
4114    GS.  */
4115
4116 static inline void
4117 gimple_omp_task_set_clauses (gimple gs, tree clauses)
4118 {
4119   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4120   gs->gimple_omp_parallel.clauses = clauses;
4121 }
4122
4123
4124 /* Return the child function used to hold the body of OMP_TASK GS.  */
4125
4126 static inline tree
4127 gimple_omp_task_child_fn (const_gimple gs)
4128 {
4129   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4130   return gs->gimple_omp_parallel.child_fn;
4131 }
4132
4133 /* Return a pointer to the child function used to hold the body of
4134    OMP_TASK GS.  */
4135
4136 static inline tree *
4137 gimple_omp_task_child_fn_ptr (gimple gs)
4138 {
4139   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4140   return &gs->gimple_omp_parallel.child_fn;
4141 }
4142
4143
4144 /* Set CHILD_FN to be the child function for OMP_TASK GS.  */
4145
4146 static inline void
4147 gimple_omp_task_set_child_fn (gimple gs, tree child_fn)
4148 {
4149   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4150   gs->gimple_omp_parallel.child_fn = child_fn;
4151 }
4152
4153
4154 /* Return the artificial argument used to send variables and values
4155    from the parent to the children threads in OMP_TASK GS.  */
4156
4157 static inline tree
4158 gimple_omp_task_data_arg (const_gimple gs)
4159 {
4160   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4161   return gs->gimple_omp_parallel.data_arg;
4162 }
4163
4164
4165 /* Return a pointer to the data argument for OMP_TASK GS.  */
4166
4167 static inline tree *
4168 gimple_omp_task_data_arg_ptr (gimple gs)
4169 {
4170   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4171   return &gs->gimple_omp_parallel.data_arg;
4172 }
4173
4174
4175 /* Set DATA_ARG to be the data argument for OMP_TASK GS.  */
4176
4177 static inline void
4178 gimple_omp_task_set_data_arg (gimple gs, tree data_arg)
4179 {
4180   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4181   gs->gimple_omp_parallel.data_arg = data_arg;
4182 }
4183
4184
4185 /* Return the clauses associated with OMP_TASK GS.  */
4186
4187 static inline tree
4188 gimple_omp_taskreg_clauses (const_gimple gs)
4189 {
4190   if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
4191     GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4192   return gs->gimple_omp_parallel.clauses;
4193 }
4194
4195
4196 /* Return a pointer to the clauses associated with OMP_TASK GS.  */
4197
4198 static inline tree *
4199 gimple_omp_taskreg_clauses_ptr (gimple gs)
4200 {
4201   if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
4202     GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4203   return &gs->gimple_omp_parallel.clauses;
4204 }
4205
4206
4207 /* Set CLAUSES to be the list of clauses associated with OMP_TASK
4208    GS.  */
4209
4210 static inline void
4211 gimple_omp_taskreg_set_clauses (gimple gs, tree clauses)
4212 {
4213   if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
4214     GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4215   gs->gimple_omp_parallel.clauses = clauses;
4216 }
4217
4218
4219 /* Return the child function used to hold the body of OMP_TASK GS.  */
4220
4221 static inline tree
4222 gimple_omp_taskreg_child_fn (const_gimple gs)
4223 {
4224   if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
4225     GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4226   return gs->gimple_omp_parallel.child_fn;
4227 }
4228
4229 /* Return a pointer to the child function used to hold the body of
4230    OMP_TASK GS.  */
4231
4232 static inline tree *
4233 gimple_omp_taskreg_child_fn_ptr (gimple gs)
4234 {
4235   if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
4236     GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4237   return &gs->gimple_omp_parallel.child_fn;
4238 }
4239
4240
4241 /* Set CHILD_FN to be the child function for OMP_TASK GS.  */
4242
4243 static inline void
4244 gimple_omp_taskreg_set_child_fn (gimple gs, tree child_fn)
4245 {
4246   if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
4247     GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4248   gs->gimple_omp_parallel.child_fn = child_fn;
4249 }
4250
4251
4252 /* Return the artificial argument used to send variables and values
4253    from the parent to the children threads in OMP_TASK GS.  */
4254
4255 static inline tree
4256 gimple_omp_taskreg_data_arg (const_gimple gs)
4257 {
4258   if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
4259     GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4260   return gs->gimple_omp_parallel.data_arg;
4261 }
4262
4263
4264 /* Return a pointer to the data argument for OMP_TASK GS.  */
4265
4266 static inline tree *
4267 gimple_omp_taskreg_data_arg_ptr (gimple gs)
4268 {
4269   if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
4270     GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4271   return &gs->gimple_omp_parallel.data_arg;
4272 }
4273
4274
4275 /* Set DATA_ARG to be the data argument for OMP_TASK GS.  */
4276
4277 static inline void
4278 gimple_omp_taskreg_set_data_arg (gimple gs, tree data_arg)
4279 {
4280   if (gimple_code (gs) != GIMPLE_OMP_PARALLEL)
4281     GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4282   gs->gimple_omp_parallel.data_arg = data_arg;
4283 }
4284
4285
4286 /* Return the copy function used to hold the body of OMP_TASK GS.  */
4287
4288 static inline tree
4289 gimple_omp_task_copy_fn (const_gimple gs)
4290 {
4291   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4292   return gs->gimple_omp_task.copy_fn;
4293 }
4294
4295 /* Return a pointer to the copy function used to hold the body of
4296    OMP_TASK GS.  */
4297
4298 static inline tree *
4299 gimple_omp_task_copy_fn_ptr (gimple gs)
4300 {
4301   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4302   return &gs->gimple_omp_task.copy_fn;
4303 }
4304
4305
4306 /* Set CHILD_FN to be the copy function for OMP_TASK GS.  */
4307
4308 static inline void
4309 gimple_omp_task_set_copy_fn (gimple gs, tree copy_fn)
4310 {
4311   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4312   gs->gimple_omp_task.copy_fn = copy_fn;
4313 }
4314
4315
4316 /* Return size of the data block in bytes in OMP_TASK GS.  */
4317
4318 static inline tree
4319 gimple_omp_task_arg_size (const_gimple gs)
4320 {
4321   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4322   return gs->gimple_omp_task.arg_size;
4323 }
4324
4325
4326 /* Return a pointer to the data block size for OMP_TASK GS.  */
4327
4328 static inline tree *
4329 gimple_omp_task_arg_size_ptr (gimple gs)
4330 {
4331   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4332   return &gs->gimple_omp_task.arg_size;
4333 }
4334
4335
4336 /* Set ARG_SIZE to be the data block size for OMP_TASK GS.  */
4337
4338 static inline void
4339 gimple_omp_task_set_arg_size (gimple gs, tree arg_size)
4340 {
4341   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4342   gs->gimple_omp_task.arg_size = arg_size;
4343 }
4344
4345
4346 /* Return align of the data block in bytes in OMP_TASK GS.  */
4347
4348 static inline tree
4349 gimple_omp_task_arg_align (const_gimple gs)
4350 {
4351   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4352   return gs->gimple_omp_task.arg_align;
4353 }
4354
4355
4356 /* Return a pointer to the data block align for OMP_TASK GS.  */
4357
4358 static inline tree *
4359 gimple_omp_task_arg_align_ptr (gimple gs)
4360 {
4361   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4362   return &gs->gimple_omp_task.arg_align;
4363 }
4364
4365
4366 /* Set ARG_SIZE to be the data block align for OMP_TASK GS.  */
4367
4368 static inline void
4369 gimple_omp_task_set_arg_align (gimple gs, tree arg_align)
4370 {
4371   GIMPLE_CHECK (gs, GIMPLE_OMP_TASK);
4372   gs->gimple_omp_task.arg_align = arg_align;
4373 }
4374
4375
4376 /* Return the clauses associated with OMP_SINGLE GS.  */
4377
4378 static inline tree
4379 gimple_omp_single_clauses (const_gimple gs)
4380 {
4381   GIMPLE_CHECK (gs, GIMPLE_OMP_SINGLE);
4382   return gs->gimple_omp_single.clauses;
4383 }
4384
4385
4386 /* Return a pointer to the clauses associated with OMP_SINGLE GS.  */
4387
4388 static inline tree *
4389 gimple_omp_single_clauses_ptr (gimple gs)
4390 {
4391   GIMPLE_CHECK (gs, GIMPLE_OMP_SINGLE);
4392   return &gs->gimple_omp_single.clauses;
4393 }
4394
4395
4396 /* Set CLAUSES to be the clauses associated with OMP_SINGLE GS.  */
4397
4398 static inline void
4399 gimple_omp_single_set_clauses (gimple gs, tree clauses)
4400 {
4401   GIMPLE_CHECK (gs, GIMPLE_OMP_SINGLE);
4402   gs->gimple_omp_single.clauses = clauses;
4403 }
4404
4405
4406 /* Return the clauses associated with OMP_SECTIONS GS.  */
4407
4408 static inline tree
4409 gimple_omp_sections_clauses (const_gimple gs)
4410 {
4411   GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4412   return gs->gimple_omp_sections.clauses;
4413 }
4414
4415
4416 /* Return a pointer to the clauses associated with OMP_SECTIONS GS.  */
4417
4418 static inline tree *
4419 gimple_omp_sections_clauses_ptr (gimple gs)
4420 {
4421   GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4422   return &gs->gimple_omp_sections.clauses;
4423 }
4424
4425
4426 /* Set CLAUSES to be the set of clauses associated with OMP_SECTIONS
4427    GS.  */
4428
4429 static inline void
4430 gimple_omp_sections_set_clauses (gimple gs, tree clauses)
4431 {
4432   GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4433   gs->gimple_omp_sections.clauses = clauses;
4434 }
4435
4436
4437 /* Return the control variable associated with the GIMPLE_OMP_SECTIONS
4438    in GS.  */
4439
4440 static inline tree
4441 gimple_omp_sections_control (const_gimple gs)
4442 {
4443   GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4444   return gs->gimple_omp_sections.control;
4445 }
4446
4447
4448 /* Return a pointer to the clauses associated with the GIMPLE_OMP_SECTIONS
4449    GS.  */
4450
4451 static inline tree *
4452 gimple_omp_sections_control_ptr (gimple gs)
4453 {
4454   GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4455   return &gs->gimple_omp_sections.control;
4456 }
4457
4458
4459 /* Set CONTROL to be the set of clauses associated with the
4460    GIMPLE_OMP_SECTIONS in GS.  */
4461
4462 static inline void
4463 gimple_omp_sections_set_control (gimple gs, tree control)
4464 {
4465   GIMPLE_CHECK (gs, GIMPLE_OMP_SECTIONS);
4466   gs->gimple_omp_sections.control = control;
4467 }
4468
4469
4470 /* Set COND to be the condition code for OMP_FOR GS.  */
4471
4472 static inline void
4473 gimple_omp_for_set_cond (gimple gs, size_t i, enum tree_code cond)
4474 {
4475   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
4476   gcc_gimple_checking_assert (TREE_CODE_CLASS (cond) == tcc_comparison
4477                               && i < gs->gimple_omp_for.collapse);
4478   gs->gimple_omp_for.iter[i].cond = cond;
4479 }
4480
4481
4482 /* Return the condition code associated with OMP_FOR GS.  */
4483
4484 static inline enum tree_code
4485 gimple_omp_for_cond (const_gimple gs, size_t i)
4486 {
4487   GIMPLE_CHECK (gs, GIMPLE_OMP_FOR);
4488   gcc_gimple_checking_assert (i < gs->gimple_omp_for.collapse);
4489   return gs->gimple_omp_for.iter[i].cond;
4490 }
4491
4492
4493 /* Set the value being stored in an atomic store.  */
4494
4495 static inline void
4496 gimple_omp_atomic_store_set_val (gimple g, tree val)
4497 {
4498   GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
4499   g->gimple_omp_atomic_store.val = val;
4500 }
4501
4502
4503 /* Return the value being stored in an atomic store.  */
4504
4505 static inline tree
4506 gimple_omp_atomic_store_val (const_gimple g)
4507 {
4508   GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
4509   return g->gimple_omp_atomic_store.val;
4510 }
4511
4512
4513 /* Return a pointer to the value being stored in an atomic store.  */
4514
4515 static inline tree *
4516 gimple_omp_atomic_store_val_ptr (gimple g)
4517 {
4518   GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
4519   return &g->gimple_omp_atomic_store.val;
4520 }
4521
4522
4523 /* Set the LHS of an atomic load.  */
4524
4525 static inline void
4526 gimple_omp_atomic_load_set_lhs (gimple g, tree lhs)
4527 {
4528   GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4529   g->gimple_omp_atomic_load.lhs = lhs;
4530 }
4531
4532
4533 /* Get the LHS of an atomic load.  */
4534
4535 static inline tree
4536 gimple_omp_atomic_load_lhs (const_gimple g)
4537 {
4538   GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4539   return g->gimple_omp_atomic_load.lhs;
4540 }
4541
4542
4543 /* Return a pointer to the LHS of an atomic load.  */
4544
4545 static inline tree *
4546 gimple_omp_atomic_load_lhs_ptr (gimple g)
4547 {
4548   GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4549   return &g->gimple_omp_atomic_load.lhs;
4550 }
4551
4552
4553 /* Set the RHS of an atomic load.  */
4554
4555 static inline void
4556 gimple_omp_atomic_load_set_rhs (gimple g, tree rhs)
4557 {
4558   GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4559   g->gimple_omp_atomic_load.rhs = rhs;
4560 }
4561
4562
4563 /* Get the RHS of an atomic load.  */
4564
4565 static inline tree
4566 gimple_omp_atomic_load_rhs (const_gimple g)
4567 {
4568   GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4569   return g->gimple_omp_atomic_load.rhs;
4570 }
4571
4572
4573 /* Return a pointer to the RHS of an atomic load.  */
4574
4575 static inline tree *
4576 gimple_omp_atomic_load_rhs_ptr (gimple g)
4577 {
4578   GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_LOAD);
4579   return &g->gimple_omp_atomic_load.rhs;
4580 }
4581
4582
4583 /* Get the definition of the control variable in a GIMPLE_OMP_CONTINUE.  */
4584
4585 static inline tree
4586 gimple_omp_continue_control_def (const_gimple g)
4587 {
4588   GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4589   return g->gimple_omp_continue.control_def;
4590 }
4591
4592 /* The same as above, but return the address.  */
4593
4594 static inline tree *
4595 gimple_omp_continue_control_def_ptr (gimple g)
4596 {
4597   GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4598   return &g->gimple_omp_continue.control_def;
4599 }
4600
4601 /* Set the definition of the control variable in a GIMPLE_OMP_CONTINUE.  */
4602
4603 static inline void
4604 gimple_omp_continue_set_control_def (gimple g, tree def)
4605 {
4606   GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4607   g->gimple_omp_continue.control_def = def;
4608 }
4609
4610
4611 /* Get the use of the control variable in a GIMPLE_OMP_CONTINUE.  */
4612
4613 static inline tree
4614 gimple_omp_continue_control_use (const_gimple g)
4615 {
4616   GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4617   return g->gimple_omp_continue.control_use;
4618 }
4619
4620
4621 /* The same as above, but return the address.  */
4622
4623 static inline tree *
4624 gimple_omp_continue_control_use_ptr (gimple g)
4625 {
4626   GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4627   return &g->gimple_omp_continue.control_use;
4628 }
4629
4630
4631 /* Set the use of the control variable in a GIMPLE_OMP_CONTINUE.  */
4632
4633 static inline void
4634 gimple_omp_continue_set_control_use (gimple g, tree use)
4635 {
4636   GIMPLE_CHECK (g, GIMPLE_OMP_CONTINUE);
4637   g->gimple_omp_continue.control_use = use;
4638 }
4639
4640 /* Return the body for the GIMPLE_TRANSACTION statement GS.  */
4641
4642 static inline gimple_seq
4643 gimple_transaction_body (gimple gs)
4644 {
4645   GIMPLE_CHECK (gs, GIMPLE_TRANSACTION);
4646   return gs->gimple_transaction.body;
4647 }
4648
4649 /* Return the label associated with a GIMPLE_TRANSACTION.  */
4650
4651 static inline tree
4652 gimple_transaction_label (const_gimple gs)
4653 {
4654   GIMPLE_CHECK (gs, GIMPLE_TRANSACTION);
4655   return gs->gimple_transaction.label;
4656 }
4657
4658 static inline tree *
4659 gimple_transaction_label_ptr (gimple gs)
4660 {
4661   GIMPLE_CHECK (gs, GIMPLE_TRANSACTION);
4662   return &gs->gimple_transaction.label;
4663 }
4664
4665 /* Return the subcode associated with a GIMPLE_TRANSACTION.  */
4666
4667 static inline unsigned int
4668 gimple_transaction_subcode (const_gimple gs)
4669 {
4670   GIMPLE_CHECK (gs, GIMPLE_TRANSACTION);
4671   return gs->gsbase.subcode;
4672 }
4673
4674 /* Set BODY to be the body for the GIMPLE_TRANSACTION statement GS.  */
4675
4676 static inline void
4677 gimple_transaction_set_body (gimple gs, gimple_seq body)
4678 {
4679   GIMPLE_CHECK (gs, GIMPLE_TRANSACTION);
4680   gs->gimple_transaction.body = body;
4681 }
4682
4683 /* Set the label associated with a GIMPLE_TRANSACTION.  */
4684
4685 static inline void
4686 gimple_transaction_set_label (gimple gs, tree label)
4687 {
4688   GIMPLE_CHECK (gs, GIMPLE_TRANSACTION);
4689   gs->gimple_transaction.label = label;
4690 }
4691
4692 /* Set the subcode associated with a GIMPLE_TRANSACTION.  */
4693
4694 static inline void
4695 gimple_transaction_set_subcode (gimple gs, unsigned int subcode)
4696 {
4697   GIMPLE_CHECK (gs, GIMPLE_TRANSACTION);
4698   gs->gsbase.subcode = subcode;
4699 }
4700
4701
4702 /* Return a pointer to the return value for GIMPLE_RETURN GS.  */
4703
4704 static inline tree *
4705 gimple_return_retval_ptr (const_gimple gs)
4706 {
4707   GIMPLE_CHECK (gs, GIMPLE_RETURN);
4708   return gimple_op_ptr (gs, 0);
4709 }
4710
4711 /* Return the return value for GIMPLE_RETURN GS.  */
4712
4713 static inline tree
4714 gimple_return_retval (const_gimple gs)
4715 {
4716   GIMPLE_CHECK (gs, GIMPLE_RETURN);
4717   return gimple_op (gs, 0);
4718 }
4719
4720
4721 /* Set RETVAL to be the return value for GIMPLE_RETURN GS.  */
4722
4723 static inline void
4724 gimple_return_set_retval (gimple gs, tree retval)
4725 {
4726   GIMPLE_CHECK (gs, GIMPLE_RETURN);
4727   gimple_set_op (gs, 0, retval);
4728 }
4729
4730
4731 /* Returns true when the gimple statment STMT is any of the OpenMP types.  */
4732
4733 #define CASE_GIMPLE_OMP                         \
4734     case GIMPLE_OMP_PARALLEL:                   \
4735     case GIMPLE_OMP_TASK:                       \
4736     case GIMPLE_OMP_FOR:                        \
4737     case GIMPLE_OMP_SECTIONS:                   \
4738     case GIMPLE_OMP_SECTIONS_SWITCH:            \
4739     case GIMPLE_OMP_SINGLE:                     \
4740     case GIMPLE_OMP_SECTION:                    \
4741     case GIMPLE_OMP_MASTER:                     \
4742     case GIMPLE_OMP_ORDERED:                    \
4743     case GIMPLE_OMP_CRITICAL:                   \
4744     case GIMPLE_OMP_RETURN:                     \
4745     case GIMPLE_OMP_ATOMIC_LOAD:                \
4746     case GIMPLE_OMP_ATOMIC_STORE:               \
4747     case GIMPLE_OMP_CONTINUE
4748
4749 static inline bool
4750 is_gimple_omp (const_gimple stmt)
4751 {
4752   switch (gimple_code (stmt))
4753     {
4754     CASE_GIMPLE_OMP:
4755       return true;
4756     default:
4757       return false;
4758     }
4759 }
4760
4761
4762 /* Returns TRUE if statement G is a GIMPLE_NOP.  */
4763
4764 static inline bool
4765 gimple_nop_p (const_gimple g)
4766 {
4767   return gimple_code (g) == GIMPLE_NOP;
4768 }
4769
4770
4771 /* Return true if GS is a GIMPLE_RESX.  */
4772
4773 static inline bool
4774 is_gimple_resx (const_gimple gs)
4775 {
4776   return gimple_code (gs) == GIMPLE_RESX;
4777 }
4778
4779 /* Return the predictor of GIMPLE_PREDICT statement GS.  */
4780
4781 static inline enum br_predictor
4782 gimple_predict_predictor (gimple gs)
4783 {
4784   GIMPLE_CHECK (gs, GIMPLE_PREDICT);
4785   return (enum br_predictor) (gs->gsbase.subcode & ~GF_PREDICT_TAKEN);
4786 }
4787
4788
4789 /* Set the predictor of GIMPLE_PREDICT statement GS to PREDICT.  */
4790
4791 static inline void
4792 gimple_predict_set_predictor (gimple gs, enum br_predictor predictor)
4793 {
4794   GIMPLE_CHECK (gs, GIMPLE_PREDICT);
4795   gs->gsbase.subcode = (gs->gsbase.subcode & GF_PREDICT_TAKEN)
4796                        | (unsigned) predictor;
4797 }
4798
4799
4800 /* Return the outcome of GIMPLE_PREDICT statement GS.  */
4801
4802 static inline enum prediction
4803 gimple_predict_outcome (gimple gs)
4804 {
4805   GIMPLE_CHECK (gs, GIMPLE_PREDICT);
4806   return (gs->gsbase.subcode & GF_PREDICT_TAKEN) ? TAKEN : NOT_TAKEN;
4807 }
4808
4809
4810 /* Set the outcome of GIMPLE_PREDICT statement GS to OUTCOME.  */
4811
4812 static inline void
4813 gimple_predict_set_outcome (gimple gs, enum prediction outcome)
4814 {
4815   GIMPLE_CHECK (gs, GIMPLE_PREDICT);
4816   if (outcome == TAKEN)
4817     gs->gsbase.subcode |= GF_PREDICT_TAKEN;
4818   else
4819     gs->gsbase.subcode &= ~GF_PREDICT_TAKEN;
4820 }
4821
4822
4823 /* Return the type of the main expression computed by STMT.  Return
4824    void_type_node if the statement computes nothing.  */
4825
4826 static inline tree
4827 gimple_expr_type (const_gimple stmt)
4828 {
4829   enum gimple_code code = gimple_code (stmt);
4830
4831   if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
4832     {
4833       tree type;
4834       /* In general we want to pass out a type that can be substituted
4835          for both the RHS and the LHS types if there is a possibly
4836          useless conversion involved.  That means returning the
4837          original RHS type as far as we can reconstruct it.  */
4838       if (code == GIMPLE_CALL)
4839         type = gimple_call_return_type (stmt);
4840       else
4841         switch (gimple_assign_rhs_code (stmt))
4842           {
4843           case POINTER_PLUS_EXPR:
4844             type = TREE_TYPE (gimple_assign_rhs1 (stmt));
4845             break;
4846
4847           default:
4848             /* As fallback use the type of the LHS.  */
4849             type = TREE_TYPE (gimple_get_lhs (stmt));
4850             break;
4851           }
4852       return type;
4853     }
4854   else if (code == GIMPLE_COND)
4855     return boolean_type_node;
4856   else
4857     return void_type_node;
4858 }
4859
4860
4861 /* Return a new iterator pointing to GIMPLE_SEQ's first statement.  */
4862
4863 static inline gimple_stmt_iterator
4864 gsi_start (gimple_seq seq)
4865 {
4866   gimple_stmt_iterator i;
4867
4868   i.ptr = gimple_seq_first (seq);
4869   i.seq = seq;
4870   i.bb = (i.ptr && i.ptr->stmt) ? gimple_bb (i.ptr->stmt) : NULL;
4871
4872   return i;
4873 }
4874
4875
4876 /* Return a new iterator pointing to the first statement in basic block BB.  */
4877
4878 static inline gimple_stmt_iterator
4879 gsi_start_bb (basic_block bb)
4880 {
4881   gimple_stmt_iterator i;
4882   gimple_seq seq;
4883
4884   seq = bb_seq (bb);
4885   i.ptr = gimple_seq_first (seq);
4886   i.seq = seq;
4887   i.bb = bb;
4888
4889   return i;
4890 }
4891
4892
4893 /* Return a new iterator initially pointing to GIMPLE_SEQ's last statement.  */
4894
4895 static inline gimple_stmt_iterator
4896 gsi_last (gimple_seq seq)
4897 {
4898   gimple_stmt_iterator i;
4899
4900   i.ptr = gimple_seq_last (seq);
4901   i.seq = seq;
4902   i.bb = (i.ptr && i.ptr->stmt) ? gimple_bb (i.ptr->stmt) : NULL;
4903
4904   return i;
4905 }
4906
4907
4908 /* Return a new iterator pointing to the last statement in basic block BB.  */
4909
4910 static inline gimple_stmt_iterator
4911 gsi_last_bb (basic_block bb)
4912 {
4913   gimple_stmt_iterator i;
4914   gimple_seq seq;
4915
4916   seq = bb_seq (bb);
4917   i.ptr = gimple_seq_last (seq);
4918   i.seq = seq;
4919   i.bb = bb;
4920
4921   return i;
4922 }
4923
4924
4925 /* Return true if I is at the end of its sequence.  */
4926
4927 static inline bool
4928 gsi_end_p (gimple_stmt_iterator i)
4929 {
4930   return i.ptr == NULL;
4931 }
4932
4933
4934 /* Return true if I is one statement before the end of its sequence.  */
4935
4936 static inline bool
4937 gsi_one_before_end_p (gimple_stmt_iterator i)
4938 {
4939   return i.ptr != NULL && i.ptr->next == NULL;
4940 }
4941
4942
4943 /* Advance the iterator to the next gimple statement.  */
4944
4945 static inline void
4946 gsi_next (gimple_stmt_iterator *i)
4947 {
4948   i->ptr = i->ptr->next;
4949 }
4950
4951 /* Advance the iterator to the previous gimple statement.  */
4952
4953 static inline void
4954 gsi_prev (gimple_stmt_iterator *i)
4955 {
4956   i->ptr = i->ptr->prev;
4957 }
4958
4959 /* Return the current stmt.  */
4960
4961 static inline gimple
4962 gsi_stmt (gimple_stmt_iterator i)
4963 {
4964   return i.ptr->stmt;
4965 }
4966
4967 /* Return a block statement iterator that points to the first non-label
4968    statement in block BB.  */
4969
4970 static inline gimple_stmt_iterator
4971 gsi_after_labels (basic_block bb)
4972 {
4973   gimple_stmt_iterator gsi = gsi_start_bb (bb);
4974
4975   while (!gsi_end_p (gsi) && gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL)
4976     gsi_next (&gsi);
4977
4978   return gsi;
4979 }
4980
4981 /* Advance the iterator to the next non-debug gimple statement.  */
4982
4983 static inline void
4984 gsi_next_nondebug (gimple_stmt_iterator *i)
4985 {
4986   do
4987     {
4988       gsi_next (i);
4989     }
4990   while (!gsi_end_p (*i) && is_gimple_debug (gsi_stmt (*i)));
4991 }
4992
4993 /* Advance the iterator to the next non-debug gimple statement.  */
4994
4995 static inline void
4996 gsi_prev_nondebug (gimple_stmt_iterator *i)
4997 {
4998   do
4999     {
5000       gsi_prev (i);
5001     }
5002   while (!gsi_end_p (*i) && is_gimple_debug (gsi_stmt (*i)));
5003 }
5004
5005 /* Return a new iterator pointing to the first non-debug statement in
5006    basic block BB.  */
5007
5008 static inline gimple_stmt_iterator
5009 gsi_start_nondebug_bb (basic_block bb)
5010 {
5011   gimple_stmt_iterator i = gsi_start_bb (bb);
5012
5013   if (!gsi_end_p (i) && is_gimple_debug (gsi_stmt (i)))
5014     gsi_next_nondebug (&i);
5015
5016   return i;
5017 }
5018
5019 /* Return a new iterator pointing to the last non-debug statement in
5020    basic block BB.  */
5021
5022 static inline gimple_stmt_iterator
5023 gsi_last_nondebug_bb (basic_block bb)
5024 {
5025   gimple_stmt_iterator i = gsi_last_bb (bb);
5026
5027   if (!gsi_end_p (i) && is_gimple_debug (gsi_stmt (i)))
5028     gsi_prev_nondebug (&i);
5029
5030   return i;
5031 }
5032
5033 /* Return a pointer to the current stmt.
5034
5035   NOTE: You may want to use gsi_replace on the iterator itself,
5036   as this performs additional bookkeeping that will not be done
5037   if you simply assign through a pointer returned by gsi_stmt_ptr.  */
5038
5039 static inline gimple *
5040 gsi_stmt_ptr (gimple_stmt_iterator *i)
5041 {
5042   return &i->ptr->stmt;
5043 }
5044
5045
5046 /* Return the basic block associated with this iterator.  */
5047
5048 static inline basic_block
5049 gsi_bb (gimple_stmt_iterator i)
5050 {
5051   return i.bb;
5052 }
5053
5054
5055 /* Return the sequence associated with this iterator.  */
5056
5057 static inline gimple_seq
5058 gsi_seq (gimple_stmt_iterator i)
5059 {
5060   return i.seq;
5061 }
5062
5063
5064 enum gsi_iterator_update
5065 {
5066   GSI_NEW_STMT,         /* Only valid when single statement is added, move
5067                            iterator to it.  */
5068   GSI_SAME_STMT,        /* Leave the iterator at the same statement.  */
5069   GSI_CONTINUE_LINKING  /* Move iterator to whatever position is suitable
5070                            for linking other statements in the same
5071                            direction.  */
5072 };
5073
5074 /* In gimple-iterator.c  */
5075 gimple_stmt_iterator gsi_start_phis (basic_block);
5076 gimple_seq gsi_split_seq_after (gimple_stmt_iterator);
5077 gimple_seq gsi_split_seq_before (gimple_stmt_iterator *);
5078 void gsi_replace (gimple_stmt_iterator *, gimple, bool);
5079 void gsi_insert_before (gimple_stmt_iterator *, gimple,
5080                         enum gsi_iterator_update);
5081 void gsi_insert_before_without_update (gimple_stmt_iterator *, gimple,
5082                                        enum gsi_iterator_update);
5083 void gsi_insert_seq_before (gimple_stmt_iterator *, gimple_seq,
5084                             enum gsi_iterator_update);
5085 void gsi_insert_seq_before_without_update (gimple_stmt_iterator *, gimple_seq,
5086                                            enum gsi_iterator_update);
5087 void gsi_insert_after (gimple_stmt_iterator *, gimple,
5088                        enum gsi_iterator_update);
5089 void gsi_insert_after_without_update (gimple_stmt_iterator *, gimple,
5090                                       enum gsi_iterator_update);
5091 void gsi_insert_seq_after (gimple_stmt_iterator *, gimple_seq,
5092                            enum gsi_iterator_update);
5093 void gsi_insert_seq_after_without_update (gimple_stmt_iterator *, gimple_seq,
5094                                           enum gsi_iterator_update);
5095 void gsi_remove (gimple_stmt_iterator *, bool);
5096 gimple_stmt_iterator gsi_for_stmt (gimple);
5097 void gsi_move_after (gimple_stmt_iterator *, gimple_stmt_iterator *);
5098 void gsi_move_before (gimple_stmt_iterator *, gimple_stmt_iterator *);
5099 void gsi_move_to_bb_end (gimple_stmt_iterator *, struct basic_block_def *);
5100 void gsi_insert_on_edge (edge, gimple);
5101 void gsi_insert_seq_on_edge (edge, gimple_seq);
5102 basic_block gsi_insert_on_edge_immediate (edge, gimple);
5103 basic_block gsi_insert_seq_on_edge_immediate (edge, gimple_seq);
5104 void gsi_commit_one_edge_insert (edge, basic_block *);
5105 void gsi_commit_edge_inserts (void);
5106 gimple gimple_call_copy_skip_args (gimple, bitmap);
5107
5108
5109 /* Convenience routines to walk all statements of a gimple function.
5110    Note that this is useful exclusively before the code is converted
5111    into SSA form.  Once the program is in SSA form, the standard
5112    operand interface should be used to analyze/modify statements.  */
5113 struct walk_stmt_info
5114 {
5115   /* Points to the current statement being walked.  */
5116   gimple_stmt_iterator gsi;
5117
5118   /* Additional data that the callback functions may want to carry
5119      through the recursion.  */
5120   void *info;
5121
5122   /* Pointer map used to mark visited tree nodes when calling
5123      walk_tree on each operand.  If set to NULL, duplicate tree nodes
5124      will be visited more than once.  */
5125   struct pointer_set_t *pset;
5126
5127   /* Operand returned by the callbacks.  This is set when calling
5128      walk_gimple_seq.  If the walk_stmt_fn or walk_tree_fn callback
5129      returns non-NULL, this field will contain the tree returned by
5130      the last callback.  */
5131   tree callback_result;
5132
5133   /* Indicates whether the operand being examined may be replaced
5134      with something that matches is_gimple_val (if true) or something
5135      slightly more complicated (if false).  "Something" technically
5136      means the common subset of is_gimple_lvalue and is_gimple_rhs,
5137      but we never try to form anything more complicated than that, so
5138      we don't bother checking.
5139
5140      Also note that CALLBACK should update this flag while walking the
5141      sub-expressions of a statement.  For instance, when walking the
5142      statement 'foo (&var)', the flag VAL_ONLY will initially be set
5143      to true, however, when walking &var, the operand of that
5144      ADDR_EXPR does not need to be a GIMPLE value.  */
5145   BOOL_BITFIELD val_only : 1;
5146
5147   /* True if we are currently walking the LHS of an assignment.  */
5148   BOOL_BITFIELD is_lhs : 1;
5149
5150   /* Optional.  Set to true by the callback functions if they made any
5151      changes.  */
5152   BOOL_BITFIELD changed : 1;
5153
5154   /* True if we're interested in location information.  */
5155   BOOL_BITFIELD want_locations : 1;
5156
5157   /* True if we've removed the statement that was processed.  */
5158   BOOL_BITFIELD removed_stmt : 1;
5159 };
5160
5161 /* Callback for walk_gimple_stmt.  Called for every statement found
5162    during traversal.  The first argument points to the statement to
5163    walk.  The second argument is a flag that the callback sets to
5164    'true' if it the callback handled all the operands and
5165    sub-statements of the statement (the default value of this flag is
5166    'false').  The third argument is an anonymous pointer to data
5167    to be used by the callback.  */
5168 typedef tree (*walk_stmt_fn) (gimple_stmt_iterator *, bool *,
5169                               struct walk_stmt_info *);
5170
5171 gimple walk_gimple_seq (gimple_seq, walk_stmt_fn, walk_tree_fn,
5172                         struct walk_stmt_info *);
5173 tree walk_gimple_stmt (gimple_stmt_iterator *, walk_stmt_fn, walk_tree_fn,
5174                        struct walk_stmt_info *);
5175 tree walk_gimple_op (gimple, walk_tree_fn, struct walk_stmt_info *);
5176
5177 #ifdef GATHER_STATISTICS
5178 /* Enum and arrays used for allocation stats.  Keep in sync with
5179    gimple.c:gimple_alloc_kind_names.  */
5180 enum gimple_alloc_kind
5181 {
5182   gimple_alloc_kind_assign,     /* Assignments.  */
5183   gimple_alloc_kind_phi,        /* PHI nodes.  */
5184   gimple_alloc_kind_cond,       /* Conditionals.  */
5185   gimple_alloc_kind_seq,        /* Sequences.  */
5186   gimple_alloc_kind_rest,       /* Everything else.  */
5187   gimple_alloc_kind_all
5188 };
5189
5190 extern int gimple_alloc_counts[];
5191 extern int gimple_alloc_sizes[];
5192
5193 /* Return the allocation kind for a given stmt CODE.  */
5194 static inline enum gimple_alloc_kind
5195 gimple_alloc_kind (enum gimple_code code)
5196 {
5197   switch (code)
5198     {
5199       case GIMPLE_ASSIGN:
5200         return gimple_alloc_kind_assign;
5201       case GIMPLE_PHI:
5202         return gimple_alloc_kind_phi;
5203       case GIMPLE_COND:
5204         return gimple_alloc_kind_cond;
5205       default:
5206         return gimple_alloc_kind_rest;
5207     }
5208 }
5209 #endif /* GATHER_STATISTICS */
5210
5211 extern void dump_gimple_statistics (void);
5212
5213 /* In gimple-fold.c.  */
5214 void gimplify_and_update_call_from_tree (gimple_stmt_iterator *, tree);
5215 tree gimple_fold_builtin (gimple);
5216 bool fold_stmt (gimple_stmt_iterator *);
5217 bool fold_stmt_inplace (gimple_stmt_iterator *);
5218 tree get_symbol_constant_value (tree);
5219 tree canonicalize_constructor_val (tree);
5220 extern tree maybe_fold_and_comparisons (enum tree_code, tree, tree, 
5221                                         enum tree_code, tree, tree);
5222 extern tree maybe_fold_or_comparisons (enum tree_code, tree, tree,
5223                                        enum tree_code, tree, tree);
5224
5225 bool gimple_val_nonnegative_real_p (tree);
5226 #endif  /* GCC_GIMPLE_H */