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