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