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