OSDN Git Service

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