intrinsic.h (gfc_check_selected_real_kind, [...]): Update prototypes.
[gcc.git] / gcc / gimplify.c
1 /* Tree lowering pass. This pass converts the GENERIC functions-as-trees
2 tree representation into the GIMPLE form.
3 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
5 Major work done by Sebastian Pop <s.pop@laposte.net>,
6 Diego Novillo <dnovillo@redhat.com> and Jason Merrill <jason@redhat.com>.
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "gimple.h"
30 #include "tree-iterator.h"
31 #include "tree-inline.h"
32 #include "tree-pretty-print.h"
33 #include "langhooks.h"
34 #include "tree-flow.h"
35 #include "cgraph.h"
36 #include "timevar.h"
37 #include "hashtab.h"
38 #include "flags.h"
39 #include "function.h"
40 #include "output.h"
41 #include "ggc.h"
42 #include "toplev.h"
43 #include "target.h"
44 #include "pointer-set.h"
45 #include "splay-tree.h"
46 #include "vec.h"
47 #include "gimple.h"
48 #include "tree-pass.h"
49
50 #include "langhooks-def.h" /* FIXME: for lhd_set_decl_assembler_name. */
51 #include "expr.h" /* FIXME: for can_move_by_pieces
52 and STACK_CHECK_MAX_VAR_SIZE. */
53
54 enum gimplify_omp_var_data
55 {
56 GOVD_SEEN = 1,
57 GOVD_EXPLICIT = 2,
58 GOVD_SHARED = 4,
59 GOVD_PRIVATE = 8,
60 GOVD_FIRSTPRIVATE = 16,
61 GOVD_LASTPRIVATE = 32,
62 GOVD_REDUCTION = 64,
63 GOVD_LOCAL = 128,
64 GOVD_DEBUG_PRIVATE = 256,
65 GOVD_PRIVATE_OUTER_REF = 512,
66 GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
67 | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LOCAL)
68 };
69
70
71 enum omp_region_type
72 {
73 ORT_WORKSHARE = 0,
74 ORT_PARALLEL = 2,
75 ORT_COMBINED_PARALLEL = 3,
76 ORT_TASK = 4,
77 ORT_UNTIED_TASK = 5
78 };
79
80 struct gimplify_omp_ctx
81 {
82 struct gimplify_omp_ctx *outer_context;
83 splay_tree variables;
84 struct pointer_set_t *privatized_types;
85 location_t location;
86 enum omp_clause_default_kind default_kind;
87 enum omp_region_type region_type;
88 };
89
90 static struct gimplify_ctx *gimplify_ctxp;
91 static struct gimplify_omp_ctx *gimplify_omp_ctxp;
92
93
94 /* Formal (expression) temporary table handling: Multiple occurrences of
95 the same scalar expression are evaluated into the same temporary. */
96
97 typedef struct gimple_temp_hash_elt
98 {
99 tree val; /* Key */
100 tree temp; /* Value */
101 } elt_t;
102
103 /* Forward declarations. */
104 static enum gimplify_status gimplify_compound_expr (tree *, gimple_seq *, bool);
105
106 /* Mark X addressable. Unlike the langhook we expect X to be in gimple
107 form and we don't do any syntax checking. */
108 void
109 mark_addressable (tree x)
110 {
111 while (handled_component_p (x))
112 x = TREE_OPERAND (x, 0);
113 if (TREE_CODE (x) != VAR_DECL
114 && TREE_CODE (x) != PARM_DECL
115 && TREE_CODE (x) != RESULT_DECL)
116 return ;
117 TREE_ADDRESSABLE (x) = 1;
118 }
119
120 /* Return a hash value for a formal temporary table entry. */
121
122 static hashval_t
123 gimple_tree_hash (const void *p)
124 {
125 tree t = ((const elt_t *) p)->val;
126 return iterative_hash_expr (t, 0);
127 }
128
129 /* Compare two formal temporary table entries. */
130
131 static int
132 gimple_tree_eq (const void *p1, const void *p2)
133 {
134 tree t1 = ((const elt_t *) p1)->val;
135 tree t2 = ((const elt_t *) p2)->val;
136 enum tree_code code = TREE_CODE (t1);
137
138 if (TREE_CODE (t2) != code
139 || TREE_TYPE (t1) != TREE_TYPE (t2))
140 return 0;
141
142 if (!operand_equal_p (t1, t2, 0))
143 return 0;
144
145 /* Only allow them to compare equal if they also hash equal; otherwise
146 results are nondeterminate, and we fail bootstrap comparison. */
147 gcc_assert (gimple_tree_hash (p1) == gimple_tree_hash (p2));
148
149 return 1;
150 }
151
152 /* Link gimple statement GS to the end of the sequence *SEQ_P. If
153 *SEQ_P is NULL, a new sequence is allocated. This function is
154 similar to gimple_seq_add_stmt, but does not scan the operands.
155 During gimplification, we need to manipulate statement sequences
156 before the def/use vectors have been constructed. */
157
158 void
159 gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs)
160 {
161 gimple_stmt_iterator si;
162
163 if (gs == NULL)
164 return;
165
166 if (*seq_p == NULL)
167 *seq_p = gimple_seq_alloc ();
168
169 si = gsi_last (*seq_p);
170
171 gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT);
172 }
173
174 /* Append sequence SRC to the end of sequence *DST_P. If *DST_P is
175 NULL, a new sequence is allocated. This function is
176 similar to gimple_seq_add_seq, but does not scan the operands.
177 During gimplification, we need to manipulate statement sequences
178 before the def/use vectors have been constructed. */
179
180 static void
181 gimplify_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
182 {
183 gimple_stmt_iterator si;
184
185 if (src == NULL)
186 return;
187
188 if (*dst_p == NULL)
189 *dst_p = gimple_seq_alloc ();
190
191 si = gsi_last (*dst_p);
192 gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT);
193 }
194
195 /* Set up a context for the gimplifier. */
196
197 void
198 push_gimplify_context (struct gimplify_ctx *c)
199 {
200 memset (c, '\0', sizeof (*c));
201 c->prev_context = gimplify_ctxp;
202 gimplify_ctxp = c;
203 }
204
205 /* Tear down a context for the gimplifier. If BODY is non-null, then
206 put the temporaries into the outer BIND_EXPR. Otherwise, put them
207 in the local_decls.
208
209 BODY is not a sequence, but the first tuple in a sequence. */
210
211 void
212 pop_gimplify_context (gimple body)
213 {
214 struct gimplify_ctx *c = gimplify_ctxp;
215
216 gcc_assert (c && (c->bind_expr_stack == NULL
217 || VEC_empty (gimple, c->bind_expr_stack)));
218 VEC_free (gimple, heap, c->bind_expr_stack);
219 gimplify_ctxp = c->prev_context;
220
221 if (body)
222 declare_vars (c->temps, body, false);
223 else
224 record_vars (c->temps);
225
226 if (c->temp_htab)
227 htab_delete (c->temp_htab);
228 }
229
230 static void
231 gimple_push_bind_expr (gimple gimple_bind)
232 {
233 if (gimplify_ctxp->bind_expr_stack == NULL)
234 gimplify_ctxp->bind_expr_stack = VEC_alloc (gimple, heap, 8);
235 VEC_safe_push (gimple, heap, gimplify_ctxp->bind_expr_stack, gimple_bind);
236 }
237
238 static void
239 gimple_pop_bind_expr (void)
240 {
241 VEC_pop (gimple, gimplify_ctxp->bind_expr_stack);
242 }
243
244 gimple
245 gimple_current_bind_expr (void)
246 {
247 return VEC_last (gimple, gimplify_ctxp->bind_expr_stack);
248 }
249
250 /* Return the stack GIMPLE_BINDs created during gimplification. */
251
252 VEC(gimple, heap) *
253 gimple_bind_expr_stack (void)
254 {
255 return gimplify_ctxp->bind_expr_stack;
256 }
257
258 /* Returns true iff there is a COND_EXPR between us and the innermost
259 CLEANUP_POINT_EXPR. This info is used by gimple_push_cleanup. */
260
261 static bool
262 gimple_conditional_context (void)
263 {
264 return gimplify_ctxp->conditions > 0;
265 }
266
267 /* Note that we've entered a COND_EXPR. */
268
269 static void
270 gimple_push_condition (void)
271 {
272 #ifdef ENABLE_GIMPLE_CHECKING
273 if (gimplify_ctxp->conditions == 0)
274 gcc_assert (gimple_seq_empty_p (gimplify_ctxp->conditional_cleanups));
275 #endif
276 ++(gimplify_ctxp->conditions);
277 }
278
279 /* Note that we've left a COND_EXPR. If we're back at unconditional scope
280 now, add any conditional cleanups we've seen to the prequeue. */
281
282 static void
283 gimple_pop_condition (gimple_seq *pre_p)
284 {
285 int conds = --(gimplify_ctxp->conditions);
286
287 gcc_assert (conds >= 0);
288 if (conds == 0)
289 {
290 gimplify_seq_add_seq (pre_p, gimplify_ctxp->conditional_cleanups);
291 gimplify_ctxp->conditional_cleanups = NULL;
292 }
293 }
294
295 /* A stable comparison routine for use with splay trees and DECLs. */
296
297 static int
298 splay_tree_compare_decl_uid (splay_tree_key xa, splay_tree_key xb)
299 {
300 tree a = (tree) xa;
301 tree b = (tree) xb;
302
303 return DECL_UID (a) - DECL_UID (b);
304 }
305
306 /* Create a new omp construct that deals with variable remapping. */
307
308 static struct gimplify_omp_ctx *
309 new_omp_context (enum omp_region_type region_type)
310 {
311 struct gimplify_omp_ctx *c;
312
313 c = XCNEW (struct gimplify_omp_ctx);
314 c->outer_context = gimplify_omp_ctxp;
315 c->variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0);
316 c->privatized_types = pointer_set_create ();
317 c->location = input_location;
318 c->region_type = region_type;
319 if ((region_type & ORT_TASK) == 0)
320 c->default_kind = OMP_CLAUSE_DEFAULT_SHARED;
321 else
322 c->default_kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
323
324 return c;
325 }
326
327 /* Destroy an omp construct that deals with variable remapping. */
328
329 static void
330 delete_omp_context (struct gimplify_omp_ctx *c)
331 {
332 splay_tree_delete (c->variables);
333 pointer_set_destroy (c->privatized_types);
334 XDELETE (c);
335 }
336
337 static void omp_add_variable (struct gimplify_omp_ctx *, tree, unsigned int);
338 static bool omp_notice_variable (struct gimplify_omp_ctx *, tree, bool);
339
340 /* Both gimplify the statement T and append it to *SEQ_P. This function
341 behaves exactly as gimplify_stmt, but you don't have to pass T as a
342 reference. */
343
344 void
345 gimplify_and_add (tree t, gimple_seq *seq_p)
346 {
347 gimplify_stmt (&t, seq_p);
348 }
349
350 /* Gimplify statement T into sequence *SEQ_P, and return the first
351 tuple in the sequence of generated tuples for this statement.
352 Return NULL if gimplifying T produced no tuples. */
353
354 static gimple
355 gimplify_and_return_first (tree t, gimple_seq *seq_p)
356 {
357 gimple_stmt_iterator last = gsi_last (*seq_p);
358
359 gimplify_and_add (t, seq_p);
360
361 if (!gsi_end_p (last))
362 {
363 gsi_next (&last);
364 return gsi_stmt (last);
365 }
366 else
367 return gimple_seq_first_stmt (*seq_p);
368 }
369
370 /* Strip off a legitimate source ending from the input string NAME of
371 length LEN. Rather than having to know the names used by all of
372 our front ends, we strip off an ending of a period followed by
373 up to five characters. (Java uses ".class".) */
374
375 static inline void
376 remove_suffix (char *name, int len)
377 {
378 int i;
379
380 for (i = 2; i < 8 && len > i; i++)
381 {
382 if (name[len - i] == '.')
383 {
384 name[len - i] = '\0';
385 break;
386 }
387 }
388 }
389
390 /* Create a new temporary name with PREFIX. Returns an identifier. */
391
392 static GTY(()) unsigned int tmp_var_id_num;
393
394 tree
395 create_tmp_var_name (const char *prefix)
396 {
397 char *tmp_name;
398
399 if (prefix)
400 {
401 char *preftmp = ASTRDUP (prefix);
402
403 remove_suffix (preftmp, strlen (preftmp));
404 prefix = preftmp;
405 }
406
407 ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
408 return get_identifier (tmp_name);
409 }
410
411
412 /* Create a new temporary variable declaration of type TYPE.
413 Does NOT push it into the current binding. */
414
415 tree
416 create_tmp_var_raw (tree type, const char *prefix)
417 {
418 tree tmp_var;
419 tree new_type;
420
421 /* Make the type of the variable writable. */
422 new_type = build_type_variant (type, 0, 0);
423 TYPE_ATTRIBUTES (new_type) = TYPE_ATTRIBUTES (type);
424
425 tmp_var = build_decl (input_location,
426 VAR_DECL, prefix ? create_tmp_var_name (prefix) : NULL,
427 type);
428
429 /* The variable was declared by the compiler. */
430 DECL_ARTIFICIAL (tmp_var) = 1;
431 /* And we don't want debug info for it. */
432 DECL_IGNORED_P (tmp_var) = 1;
433
434 /* Make the variable writable. */
435 TREE_READONLY (tmp_var) = 0;
436
437 DECL_EXTERNAL (tmp_var) = 0;
438 TREE_STATIC (tmp_var) = 0;
439 TREE_USED (tmp_var) = 1;
440
441 return tmp_var;
442 }
443
444 /* Create a new temporary variable declaration of type TYPE. DOES push the
445 variable into the current binding. Further, assume that this is called
446 only from gimplification or optimization, at which point the creation of
447 certain types are bugs. */
448
449 tree
450 create_tmp_var (tree type, const char *prefix)
451 {
452 tree tmp_var;
453
454 /* We don't allow types that are addressable (meaning we can't make copies),
455 or incomplete. We also used to reject every variable size objects here,
456 but now support those for which a constant upper bound can be obtained.
457 The processing for variable sizes is performed in gimple_add_tmp_var,
458 point at which it really matters and possibly reached via paths not going
459 through this function, e.g. after direct calls to create_tmp_var_raw. */
460 gcc_assert (!TREE_ADDRESSABLE (type) && COMPLETE_TYPE_P (type));
461
462 tmp_var = create_tmp_var_raw (type, prefix);
463 gimple_add_tmp_var (tmp_var);
464 return tmp_var;
465 }
466
467 /* Create a new temporary variable declaration of type TYPE by calling
468 create_tmp_var and if TYPE is a vector or a complex number, mark the new
469 temporary as gimple register. */
470
471 tree
472 create_tmp_reg (tree type, const char *prefix)
473 {
474 tree tmp;
475
476 tmp = create_tmp_var (type, prefix);
477 if (TREE_CODE (type) == COMPLEX_TYPE
478 || TREE_CODE (type) == VECTOR_TYPE)
479 DECL_GIMPLE_REG_P (tmp) = 1;
480
481 return tmp;
482 }
483
484 /* Create a temporary with a name derived from VAL. Subroutine of
485 lookup_tmp_var; nobody else should call this function. */
486
487 static inline tree
488 create_tmp_from_val (tree val)
489 {
490 return create_tmp_var (TREE_TYPE (val), get_name (val));
491 }
492
493 /* Create a temporary to hold the value of VAL. If IS_FORMAL, try to reuse
494 an existing expression temporary. */
495
496 static tree
497 lookup_tmp_var (tree val, bool is_formal)
498 {
499 tree ret;
500
501 /* If not optimizing, never really reuse a temporary. local-alloc
502 won't allocate any variable that is used in more than one basic
503 block, which means it will go into memory, causing much extra
504 work in reload and final and poorer code generation, outweighing
505 the extra memory allocation here. */
506 if (!optimize || !is_formal || TREE_SIDE_EFFECTS (val))
507 ret = create_tmp_from_val (val);
508 else
509 {
510 elt_t elt, *elt_p;
511 void **slot;
512
513 elt.val = val;
514 if (gimplify_ctxp->temp_htab == NULL)
515 gimplify_ctxp->temp_htab
516 = htab_create (1000, gimple_tree_hash, gimple_tree_eq, free);
517 slot = htab_find_slot (gimplify_ctxp->temp_htab, (void *)&elt, INSERT);
518 if (*slot == NULL)
519 {
520 elt_p = XNEW (elt_t);
521 elt_p->val = val;
522 elt_p->temp = ret = create_tmp_from_val (val);
523 *slot = (void *) elt_p;
524 }
525 else
526 {
527 elt_p = (elt_t *) *slot;
528 ret = elt_p->temp;
529 }
530 }
531
532 return ret;
533 }
534
535
536 /* Return true if T is a CALL_EXPR or an expression that can be
537 assigned to a temporary. Note that this predicate should only be
538 used during gimplification. See the rationale for this in
539 gimplify_modify_expr. */
540
541 static bool
542 is_gimple_reg_rhs_or_call (tree t)
543 {
544 return (get_gimple_rhs_class (TREE_CODE (t)) != GIMPLE_INVALID_RHS
545 || TREE_CODE (t) == CALL_EXPR);
546 }
547
548 /* Return true if T is a valid memory RHS or a CALL_EXPR. Note that
549 this predicate should only be used during gimplification. See the
550 rationale for this in gimplify_modify_expr. */
551
552 static bool
553 is_gimple_mem_rhs_or_call (tree t)
554 {
555 /* If we're dealing with a renamable type, either source or dest must be
556 a renamed variable. */
557 if (is_gimple_reg_type (TREE_TYPE (t)))
558 return is_gimple_val (t);
559 else
560 return (is_gimple_val (t) || is_gimple_lvalue (t)
561 || TREE_CODE (t) == CALL_EXPR);
562 }
563
564 /* Helper for get_formal_tmp_var and get_initialized_tmp_var. */
565
566 static tree
567 internal_get_tmp_var (tree val, gimple_seq *pre_p, gimple_seq *post_p,
568 bool is_formal)
569 {
570 tree t, mod;
571
572 /* Notice that we explicitly allow VAL to be a CALL_EXPR so that we
573 can create an INIT_EXPR and convert it into a GIMPLE_CALL below. */
574 gimplify_expr (&val, pre_p, post_p, is_gimple_reg_rhs_or_call,
575 fb_rvalue);
576
577 t = lookup_tmp_var (val, is_formal);
578
579 if (is_formal
580 && (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
581 || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE))
582 DECL_GIMPLE_REG_P (t) = 1;
583
584 mod = build2 (INIT_EXPR, TREE_TYPE (t), t, unshare_expr (val));
585
586 if (EXPR_HAS_LOCATION (val))
587 SET_EXPR_LOCATION (mod, EXPR_LOCATION (val));
588 else
589 SET_EXPR_LOCATION (mod, input_location);
590
591 /* gimplify_modify_expr might want to reduce this further. */
592 gimplify_and_add (mod, pre_p);
593 ggc_free (mod);
594
595 /* If we're gimplifying into ssa, gimplify_modify_expr will have
596 given our temporary an SSA name. Find and return it. */
597 if (gimplify_ctxp->into_ssa)
598 {
599 gimple last = gimple_seq_last_stmt (*pre_p);
600 t = gimple_get_lhs (last);
601 }
602
603 return t;
604 }
605
606 /* Returns a formal temporary variable initialized with VAL. PRE_P is as
607 in gimplify_expr. Only use this function if:
608
609 1) The value of the unfactored expression represented by VAL will not
610 change between the initialization and use of the temporary, and
611 2) The temporary will not be otherwise modified.
612
613 For instance, #1 means that this is inappropriate for SAVE_EXPR temps,
614 and #2 means it is inappropriate for && temps.
615
616 For other cases, use get_initialized_tmp_var instead. */
617
618 tree
619 get_formal_tmp_var (tree val, gimple_seq *pre_p)
620 {
621 return internal_get_tmp_var (val, pre_p, NULL, true);
622 }
623
624 /* Returns a temporary variable initialized with VAL. PRE_P and POST_P
625 are as in gimplify_expr. */
626
627 tree
628 get_initialized_tmp_var (tree val, gimple_seq *pre_p, gimple_seq *post_p)
629 {
630 return internal_get_tmp_var (val, pre_p, post_p, false);
631 }
632
633 /* Declares all the variables in VARS in SCOPE. If DEBUG_INFO is
634 true, generate debug info for them; otherwise don't. */
635
636 void
637 declare_vars (tree vars, gimple scope, bool debug_info)
638 {
639 tree last = vars;
640 if (last)
641 {
642 tree temps, block;
643
644 gcc_assert (gimple_code (scope) == GIMPLE_BIND);
645
646 temps = nreverse (last);
647
648 block = gimple_bind_block (scope);
649 gcc_assert (!block || TREE_CODE (block) == BLOCK);
650 if (!block || !debug_info)
651 {
652 TREE_CHAIN (last) = gimple_bind_vars (scope);
653 gimple_bind_set_vars (scope, temps);
654 }
655 else
656 {
657 /* We need to attach the nodes both to the BIND_EXPR and to its
658 associated BLOCK for debugging purposes. The key point here
659 is that the BLOCK_VARS of the BIND_EXPR_BLOCK of a BIND_EXPR
660 is a subchain of the BIND_EXPR_VARS of the BIND_EXPR. */
661 if (BLOCK_VARS (block))
662 BLOCK_VARS (block) = chainon (BLOCK_VARS (block), temps);
663 else
664 {
665 gimple_bind_set_vars (scope,
666 chainon (gimple_bind_vars (scope), temps));
667 BLOCK_VARS (block) = temps;
668 }
669 }
670 }
671 }
672
673 /* For VAR a VAR_DECL of variable size, try to find a constant upper bound
674 for the size and adjust DECL_SIZE/DECL_SIZE_UNIT accordingly. Abort if
675 no such upper bound can be obtained. */
676
677 static void
678 force_constant_size (tree var)
679 {
680 /* The only attempt we make is by querying the maximum size of objects
681 of the variable's type. */
682
683 HOST_WIDE_INT max_size;
684
685 gcc_assert (TREE_CODE (var) == VAR_DECL);
686
687 max_size = max_int_size_in_bytes (TREE_TYPE (var));
688
689 gcc_assert (max_size >= 0);
690
691 DECL_SIZE_UNIT (var)
692 = build_int_cst (TREE_TYPE (DECL_SIZE_UNIT (var)), max_size);
693 DECL_SIZE (var)
694 = build_int_cst (TREE_TYPE (DECL_SIZE (var)), max_size * BITS_PER_UNIT);
695 }
696
697 void
698 gimple_add_tmp_var (tree tmp)
699 {
700 gcc_assert (!TREE_CHAIN (tmp) && !DECL_SEEN_IN_BIND_EXPR_P (tmp));
701
702 /* Later processing assumes that the object size is constant, which might
703 not be true at this point. Force the use of a constant upper bound in
704 this case. */
705 if (!host_integerp (DECL_SIZE_UNIT (tmp), 1))
706 force_constant_size (tmp);
707
708 DECL_CONTEXT (tmp) = current_function_decl;
709 DECL_SEEN_IN_BIND_EXPR_P (tmp) = 1;
710
711 if (gimplify_ctxp)
712 {
713 TREE_CHAIN (tmp) = gimplify_ctxp->temps;
714 gimplify_ctxp->temps = tmp;
715
716 /* Mark temporaries local within the nearest enclosing parallel. */
717 if (gimplify_omp_ctxp)
718 {
719 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
720 while (ctx && ctx->region_type == ORT_WORKSHARE)
721 ctx = ctx->outer_context;
722 if (ctx)
723 omp_add_variable (ctx, tmp, GOVD_LOCAL | GOVD_SEEN);
724 }
725 }
726 else if (cfun)
727 record_vars (tmp);
728 else
729 {
730 gimple_seq body_seq;
731
732 /* This case is for nested functions. We need to expose the locals
733 they create. */
734 body_seq = gimple_body (current_function_decl);
735 declare_vars (tmp, gimple_seq_first_stmt (body_seq), false);
736 }
737 }
738
739 /* Determines whether to assign a location to the statement GS. */
740
741 static bool
742 should_carry_location_p (gimple gs)
743 {
744 /* Don't emit a line note for a label. We particularly don't want to
745 emit one for the break label, since it doesn't actually correspond
746 to the beginning of the loop/switch. */
747 if (gimple_code (gs) == GIMPLE_LABEL)
748 return false;
749
750 return true;
751 }
752
753
754 /* Return true if a location should not be emitted for this statement
755 by annotate_one_with_location. */
756
757 static inline bool
758 gimple_do_not_emit_location_p (gimple g)
759 {
760 return gimple_plf (g, GF_PLF_1);
761 }
762
763 /* Mark statement G so a location will not be emitted by
764 annotate_one_with_location. */
765
766 static inline void
767 gimple_set_do_not_emit_location (gimple g)
768 {
769 /* The PLF flags are initialized to 0 when a new tuple is created,
770 so no need to initialize it anywhere. */
771 gimple_set_plf (g, GF_PLF_1, true);
772 }
773
774 /* Set the location for gimple statement GS to LOCATION. */
775
776 static void
777 annotate_one_with_location (gimple gs, location_t location)
778 {
779 if (!gimple_has_location (gs)
780 && !gimple_do_not_emit_location_p (gs)
781 && should_carry_location_p (gs))
782 gimple_set_location (gs, location);
783 }
784
785
786 /* Set LOCATION for all the statements after iterator GSI in sequence
787 SEQ. If GSI is pointing to the end of the sequence, start with the
788 first statement in SEQ. */
789
790 static void
791 annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
792 location_t location)
793 {
794 if (gsi_end_p (gsi))
795 gsi = gsi_start (seq);
796 else
797 gsi_next (&gsi);
798
799 for (; !gsi_end_p (gsi); gsi_next (&gsi))
800 annotate_one_with_location (gsi_stmt (gsi), location);
801 }
802
803
804 /* Set the location for all the statements in a sequence STMT_P to LOCATION. */
805
806 void
807 annotate_all_with_location (gimple_seq stmt_p, location_t location)
808 {
809 gimple_stmt_iterator i;
810
811 if (gimple_seq_empty_p (stmt_p))
812 return;
813
814 for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
815 {
816 gimple gs = gsi_stmt (i);
817 annotate_one_with_location (gs, location);
818 }
819 }
820 \f
821 /* This page contains routines to unshare tree nodes, i.e. to duplicate tree
822 nodes that are referenced more than once in GENERIC functions. This is
823 necessary because gimplification (translation into GIMPLE) is performed
824 by modifying tree nodes in-place, so gimplication of a shared node in a
825 first context could generate an invalid GIMPLE form in a second context.
826
827 This is achieved with a simple mark/copy/unmark algorithm that walks the
828 GENERIC representation top-down, marks nodes with TREE_VISITED the first
829 time it encounters them, duplicates them if they already have TREE_VISITED
830 set, and finally removes the TREE_VISITED marks it has set.
831
832 The algorithm works only at the function level, i.e. it generates a GENERIC
833 representation of a function with no nodes shared within the function when
834 passed a GENERIC function (except for nodes that are allowed to be shared).
835
836 At the global level, it is also necessary to unshare tree nodes that are
837 referenced in more than one function, for the same aforementioned reason.
838 This requires some cooperation from the front-end. There are 2 strategies:
839
840 1. Manual unsharing. The front-end needs to call unshare_expr on every
841 expression that might end up being shared across functions.
842
843 2. Deep unsharing. This is an extension of regular unsharing. Instead
844 of calling unshare_expr on expressions that might be shared across
845 functions, the front-end pre-marks them with TREE_VISITED. This will
846 ensure that they are unshared on the first reference within functions
847 when the regular unsharing algorithm runs. The counterpart is that
848 this algorithm must look deeper than for manual unsharing, which is
849 specified by LANG_HOOKS_DEEP_UNSHARING.
850
851 If there are only few specific cases of node sharing across functions, it is
852 probably easier for a front-end to unshare the expressions manually. On the
853 contrary, if the expressions generated at the global level are as widespread
854 as expressions generated within functions, deep unsharing is very likely the
855 way to go. */
856
857 /* Similar to copy_tree_r but do not copy SAVE_EXPR or TARGET_EXPR nodes.
858 These nodes model computations that should only be done once. If we
859 were to unshare something like SAVE_EXPR(i++), the gimplification
860 process would create wrong code. */
861
862 static tree
863 mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
864 {
865 tree t = *tp;
866 enum tree_code code = TREE_CODE (t);
867
868 /* Do not copy SAVE_EXPR or TARGET_EXPR nodes themselves, but copy
869 their subtrees if we can make sure to do it only once. */
870 if (code == SAVE_EXPR || code == TARGET_EXPR)
871 {
872 if (data && !pointer_set_insert ((struct pointer_set_t *)data, t))
873 ;
874 else
875 *walk_subtrees = 0;
876 }
877
878 /* Stop at types, decls, constants like copy_tree_r. */
879 else if (TREE_CODE_CLASS (code) == tcc_type
880 || TREE_CODE_CLASS (code) == tcc_declaration
881 || TREE_CODE_CLASS (code) == tcc_constant
882 /* We can't do anything sensible with a BLOCK used as an
883 expression, but we also can't just die when we see it
884 because of non-expression uses. So we avert our eyes
885 and cross our fingers. Silly Java. */
886 || code == BLOCK)
887 *walk_subtrees = 0;
888
889 /* Cope with the statement expression extension. */
890 else if (code == STATEMENT_LIST)
891 ;
892
893 /* Leave the bulk of the work to copy_tree_r itself. */
894 else
895 {
896 gcc_assert (code != BIND_EXPR);
897 copy_tree_r (tp, walk_subtrees, NULL);
898 }
899
900 return NULL_TREE;
901 }
902
903 /* Callback for walk_tree to unshare most of the shared trees rooted at
904 *TP. If *TP has been visited already (i.e., TREE_VISITED (*TP) == 1),
905 then *TP is deep copied by calling mostly_copy_tree_r. */
906
907 static tree
908 copy_if_shared_r (tree *tp, int *walk_subtrees, void *data)
909 {
910 tree t = *tp;
911 enum tree_code code = TREE_CODE (t);
912
913 /* Skip types, decls, and constants. But we do want to look at their
914 types and the bounds of types. Mark them as visited so we properly
915 unmark their subtrees on the unmark pass. If we've already seen them,
916 don't look down further. */
917 if (TREE_CODE_CLASS (code) == tcc_type
918 || TREE_CODE_CLASS (code) == tcc_declaration
919 || TREE_CODE_CLASS (code) == tcc_constant)
920 {
921 if (TREE_VISITED (t))
922 *walk_subtrees = 0;
923 else
924 TREE_VISITED (t) = 1;
925 }
926
927 /* If this node has been visited already, unshare it and don't look
928 any deeper. */
929 else if (TREE_VISITED (t))
930 {
931 walk_tree (tp, mostly_copy_tree_r, data, NULL);
932 *walk_subtrees = 0;
933 }
934
935 /* Otherwise, mark the node as visited and keep looking. */
936 else
937 TREE_VISITED (t) = 1;
938
939 return NULL_TREE;
940 }
941
942 /* Unshare most of the shared trees rooted at *TP. */
943
944 static inline void
945 copy_if_shared (tree *tp)
946 {
947 /* If the language requires deep unsharing, we need a pointer set to make
948 sure we don't repeatedly unshare subtrees of unshareable nodes. */
949 struct pointer_set_t *visited
950 = lang_hooks.deep_unsharing ? pointer_set_create () : NULL;
951 walk_tree (tp, copy_if_shared_r, visited, NULL);
952 if (visited)
953 pointer_set_destroy (visited);
954 }
955
956 /* Unshare all the trees in BODY_P, a pointer into the body of FNDECL, and the
957 bodies of any nested functions if we are unsharing the entire body of
958 FNDECL. */
959
960 static void
961 unshare_body (tree *body_p, tree fndecl)
962 {
963 struct cgraph_node *cgn = cgraph_node (fndecl);
964
965 copy_if_shared (body_p);
966
967 if (body_p == &DECL_SAVED_TREE (fndecl))
968 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
969 unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
970 }
971
972 /* Callback for walk_tree to unmark the visited trees rooted at *TP.
973 Subtrees are walked until the first unvisited node is encountered. */
974
975 static tree
976 unmark_visited_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
977 {
978 tree t = *tp;
979
980 /* If this node has been visited, unmark it and keep looking. */
981 if (TREE_VISITED (t))
982 TREE_VISITED (t) = 0;
983
984 /* Otherwise, don't look any deeper. */
985 else
986 *walk_subtrees = 0;
987
988 return NULL_TREE;
989 }
990
991 /* Unmark the visited trees rooted at *TP. */
992
993 static inline void
994 unmark_visited (tree *tp)
995 {
996 walk_tree (tp, unmark_visited_r, NULL, NULL);
997 }
998
999 /* Likewise, but mark all trees as not visited. */
1000
1001 static void
1002 unvisit_body (tree *body_p, tree fndecl)
1003 {
1004 struct cgraph_node *cgn = cgraph_node (fndecl);
1005
1006 unmark_visited (body_p);
1007
1008 if (body_p == &DECL_SAVED_TREE (fndecl))
1009 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1010 unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
1011 }
1012
1013 /* Unconditionally make an unshared copy of EXPR. This is used when using
1014 stored expressions which span multiple functions, such as BINFO_VTABLE,
1015 as the normal unsharing process can't tell that they're shared. */
1016
1017 tree
1018 unshare_expr (tree expr)
1019 {
1020 walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
1021 return expr;
1022 }
1023 \f
1024 /* WRAPPER is a code such as BIND_EXPR or CLEANUP_POINT_EXPR which can both
1025 contain statements and have a value. Assign its value to a temporary
1026 and give it void_type_node. Returns the temporary, or NULL_TREE if
1027 WRAPPER was already void. */
1028
1029 tree
1030 voidify_wrapper_expr (tree wrapper, tree temp)
1031 {
1032 tree type = TREE_TYPE (wrapper);
1033 if (type && !VOID_TYPE_P (type))
1034 {
1035 tree *p;
1036
1037 /* Set p to point to the body of the wrapper. Loop until we find
1038 something that isn't a wrapper. */
1039 for (p = &wrapper; p && *p; )
1040 {
1041 switch (TREE_CODE (*p))
1042 {
1043 case BIND_EXPR:
1044 TREE_SIDE_EFFECTS (*p) = 1;
1045 TREE_TYPE (*p) = void_type_node;
1046 /* For a BIND_EXPR, the body is operand 1. */
1047 p = &BIND_EXPR_BODY (*p);
1048 break;
1049
1050 case CLEANUP_POINT_EXPR:
1051 case TRY_FINALLY_EXPR:
1052 case TRY_CATCH_EXPR:
1053 TREE_SIDE_EFFECTS (*p) = 1;
1054 TREE_TYPE (*p) = void_type_node;
1055 p = &TREE_OPERAND (*p, 0);
1056 break;
1057
1058 case STATEMENT_LIST:
1059 {
1060 tree_stmt_iterator i = tsi_last (*p);
1061 TREE_SIDE_EFFECTS (*p) = 1;
1062 TREE_TYPE (*p) = void_type_node;
1063 p = tsi_end_p (i) ? NULL : tsi_stmt_ptr (i);
1064 }
1065 break;
1066
1067 case COMPOUND_EXPR:
1068 /* Advance to the last statement. Set all container types to void. */
1069 for (; TREE_CODE (*p) == COMPOUND_EXPR; p = &TREE_OPERAND (*p, 1))
1070 {
1071 TREE_SIDE_EFFECTS (*p) = 1;
1072 TREE_TYPE (*p) = void_type_node;
1073 }
1074 break;
1075
1076 default:
1077 goto out;
1078 }
1079 }
1080
1081 out:
1082 if (p == NULL || IS_EMPTY_STMT (*p))
1083 temp = NULL_TREE;
1084 else if (temp)
1085 {
1086 /* The wrapper is on the RHS of an assignment that we're pushing
1087 down. */
1088 gcc_assert (TREE_CODE (temp) == INIT_EXPR
1089 || TREE_CODE (temp) == MODIFY_EXPR);
1090 TREE_OPERAND (temp, 1) = *p;
1091 *p = temp;
1092 }
1093 else
1094 {
1095 temp = create_tmp_var (type, "retval");
1096 *p = build2 (INIT_EXPR, type, temp, *p);
1097 }
1098
1099 return temp;
1100 }
1101
1102 return NULL_TREE;
1103 }
1104
1105 /* Prepare calls to builtins to SAVE and RESTORE the stack as well as
1106 a temporary through which they communicate. */
1107
1108 static void
1109 build_stack_save_restore (gimple *save, gimple *restore)
1110 {
1111 tree tmp_var;
1112
1113 *save = gimple_build_call (implicit_built_in_decls[BUILT_IN_STACK_SAVE], 0);
1114 tmp_var = create_tmp_var (ptr_type_node, "saved_stack");
1115 gimple_call_set_lhs (*save, tmp_var);
1116
1117 *restore = gimple_build_call (implicit_built_in_decls[BUILT_IN_STACK_RESTORE],
1118 1, tmp_var);
1119 }
1120
1121 /* Gimplify a BIND_EXPR. Just voidify and recurse. */
1122
1123 static enum gimplify_status
1124 gimplify_bind_expr (tree *expr_p, gimple_seq *pre_p)
1125 {
1126 tree bind_expr = *expr_p;
1127 bool old_save_stack = gimplify_ctxp->save_stack;
1128 tree t;
1129 gimple gimple_bind;
1130 gimple_seq body;
1131
1132 tree temp = voidify_wrapper_expr (bind_expr, NULL);
1133
1134 /* Mark variables seen in this bind expr. */
1135 for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t))
1136 {
1137 if (TREE_CODE (t) == VAR_DECL)
1138 {
1139 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
1140
1141 /* Mark variable as local. */
1142 if (ctx && !is_global_var (t)
1143 && (! DECL_SEEN_IN_BIND_EXPR_P (t)
1144 || splay_tree_lookup (ctx->variables,
1145 (splay_tree_key) t) == NULL))
1146 omp_add_variable (gimplify_omp_ctxp, t, GOVD_LOCAL | GOVD_SEEN);
1147
1148 DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
1149
1150 if (DECL_HARD_REGISTER (t) && !is_global_var (t) && cfun)
1151 cfun->has_local_explicit_reg_vars = true;
1152 }
1153
1154 /* Preliminarily mark non-addressed complex variables as eligible
1155 for promotion to gimple registers. We'll transform their uses
1156 as we find them. */
1157 if ((TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
1158 || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
1159 && !TREE_THIS_VOLATILE (t)
1160 && (TREE_CODE (t) == VAR_DECL && !DECL_HARD_REGISTER (t))
1161 && !needs_to_live_in_memory (t))
1162 DECL_GIMPLE_REG_P (t) = 1;
1163 }
1164
1165 gimple_bind = gimple_build_bind (BIND_EXPR_VARS (bind_expr), NULL,
1166 BIND_EXPR_BLOCK (bind_expr));
1167 gimple_push_bind_expr (gimple_bind);
1168
1169 gimplify_ctxp->save_stack = false;
1170
1171 /* Gimplify the body into the GIMPLE_BIND tuple's body. */
1172 body = NULL;
1173 gimplify_stmt (&BIND_EXPR_BODY (bind_expr), &body);
1174 gimple_bind_set_body (gimple_bind, body);
1175
1176 if (gimplify_ctxp->save_stack)
1177 {
1178 gimple stack_save, stack_restore, gs;
1179 gimple_seq cleanup, new_body;
1180
1181 /* Save stack on entry and restore it on exit. Add a try_finally
1182 block to achieve this. Note that mudflap depends on the
1183 format of the emitted code: see mx_register_decls(). */
1184 build_stack_save_restore (&stack_save, &stack_restore);
1185
1186 cleanup = new_body = NULL;
1187 gimplify_seq_add_stmt (&cleanup, stack_restore);
1188 gs = gimple_build_try (gimple_bind_body (gimple_bind), cleanup,
1189 GIMPLE_TRY_FINALLY);
1190
1191 gimplify_seq_add_stmt (&new_body, stack_save);
1192 gimplify_seq_add_stmt (&new_body, gs);
1193 gimple_bind_set_body (gimple_bind, new_body);
1194 }
1195
1196 gimplify_ctxp->save_stack = old_save_stack;
1197 gimple_pop_bind_expr ();
1198
1199 gimplify_seq_add_stmt (pre_p, gimple_bind);
1200
1201 if (temp)
1202 {
1203 *expr_p = temp;
1204 return GS_OK;
1205 }
1206
1207 *expr_p = NULL_TREE;
1208 return GS_ALL_DONE;
1209 }
1210
1211 /* Gimplify a RETURN_EXPR. If the expression to be returned is not a
1212 GIMPLE value, it is assigned to a new temporary and the statement is
1213 re-written to return the temporary.
1214
1215 PRE_P points to the sequence where side effects that must happen before
1216 STMT should be stored. */
1217
1218 static enum gimplify_status
1219 gimplify_return_expr (tree stmt, gimple_seq *pre_p)
1220 {
1221 gimple ret;
1222 tree ret_expr = TREE_OPERAND (stmt, 0);
1223 tree result_decl, result;
1224
1225 if (ret_expr == error_mark_node)
1226 return GS_ERROR;
1227
1228 if (!ret_expr
1229 || TREE_CODE (ret_expr) == RESULT_DECL
1230 || ret_expr == error_mark_node)
1231 {
1232 gimple ret = gimple_build_return (ret_expr);
1233 gimple_set_no_warning (ret, TREE_NO_WARNING (stmt));
1234 gimplify_seq_add_stmt (pre_p, ret);
1235 return GS_ALL_DONE;
1236 }
1237
1238 if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
1239 result_decl = NULL_TREE;
1240 else
1241 {
1242 result_decl = TREE_OPERAND (ret_expr, 0);
1243
1244 /* See through a return by reference. */
1245 if (TREE_CODE (result_decl) == INDIRECT_REF)
1246 result_decl = TREE_OPERAND (result_decl, 0);
1247
1248 gcc_assert ((TREE_CODE (ret_expr) == MODIFY_EXPR
1249 || TREE_CODE (ret_expr) == INIT_EXPR)
1250 && TREE_CODE (result_decl) == RESULT_DECL);
1251 }
1252
1253 /* If aggregate_value_p is true, then we can return the bare RESULT_DECL.
1254 Recall that aggregate_value_p is FALSE for any aggregate type that is
1255 returned in registers. If we're returning values in registers, then
1256 we don't want to extend the lifetime of the RESULT_DECL, particularly
1257 across another call. In addition, for those aggregates for which
1258 hard_function_value generates a PARALLEL, we'll die during normal
1259 expansion of structure assignments; there's special code in expand_return
1260 to handle this case that does not exist in expand_expr. */
1261 if (!result_decl)
1262 result = NULL_TREE;
1263 else if (aggregate_value_p (result_decl, TREE_TYPE (current_function_decl)))
1264 {
1265 if (TREE_CODE (DECL_SIZE (result_decl)) != INTEGER_CST)
1266 {
1267 if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (result_decl)))
1268 gimplify_type_sizes (TREE_TYPE (result_decl), pre_p);
1269 /* Note that we don't use gimplify_vla_decl because the RESULT_DECL
1270 should be effectively allocated by the caller, i.e. all calls to
1271 this function must be subject to the Return Slot Optimization. */
1272 gimplify_one_sizepos (&DECL_SIZE (result_decl), pre_p);
1273 gimplify_one_sizepos (&DECL_SIZE_UNIT (result_decl), pre_p);
1274 }
1275 result = result_decl;
1276 }
1277 else if (gimplify_ctxp->return_temp)
1278 result = gimplify_ctxp->return_temp;
1279 else
1280 {
1281 result = create_tmp_reg (TREE_TYPE (result_decl), NULL);
1282
1283 /* ??? With complex control flow (usually involving abnormal edges),
1284 we can wind up warning about an uninitialized value for this. Due
1285 to how this variable is constructed and initialized, this is never
1286 true. Give up and never warn. */
1287 TREE_NO_WARNING (result) = 1;
1288
1289 gimplify_ctxp->return_temp = result;
1290 }
1291
1292 /* Smash the lhs of the MODIFY_EXPR to the temporary we plan to use.
1293 Then gimplify the whole thing. */
1294 if (result != result_decl)
1295 TREE_OPERAND (ret_expr, 0) = result;
1296
1297 gimplify_and_add (TREE_OPERAND (stmt, 0), pre_p);
1298
1299 ret = gimple_build_return (result);
1300 gimple_set_no_warning (ret, TREE_NO_WARNING (stmt));
1301 gimplify_seq_add_stmt (pre_p, ret);
1302
1303 return GS_ALL_DONE;
1304 }
1305
1306 static void
1307 gimplify_vla_decl (tree decl, gimple_seq *seq_p)
1308 {
1309 /* This is a variable-sized decl. Simplify its size and mark it
1310 for deferred expansion. Note that mudflap depends on the format
1311 of the emitted code: see mx_register_decls(). */
1312 tree t, addr, ptr_type;
1313
1314 gimplify_one_sizepos (&DECL_SIZE (decl), seq_p);
1315 gimplify_one_sizepos (&DECL_SIZE_UNIT (decl), seq_p);
1316
1317 /* All occurrences of this decl in final gimplified code will be
1318 replaced by indirection. Setting DECL_VALUE_EXPR does two
1319 things: First, it lets the rest of the gimplifier know what
1320 replacement to use. Second, it lets the debug info know
1321 where to find the value. */
1322 ptr_type = build_pointer_type (TREE_TYPE (decl));
1323 addr = create_tmp_var (ptr_type, get_name (decl));
1324 DECL_IGNORED_P (addr) = 0;
1325 t = build_fold_indirect_ref (addr);
1326 SET_DECL_VALUE_EXPR (decl, t);
1327 DECL_HAS_VALUE_EXPR_P (decl) = 1;
1328
1329 t = built_in_decls[BUILT_IN_ALLOCA];
1330 t = build_call_expr (t, 1, DECL_SIZE_UNIT (decl));
1331 t = fold_convert (ptr_type, t);
1332 t = build2 (MODIFY_EXPR, TREE_TYPE (addr), addr, t);
1333
1334 gimplify_and_add (t, seq_p);
1335
1336 /* Indicate that we need to restore the stack level when the
1337 enclosing BIND_EXPR is exited. */
1338 gimplify_ctxp->save_stack = true;
1339 }
1340
1341
1342 /* Gimplifies a DECL_EXPR node *STMT_P by making any necessary allocation
1343 and initialization explicit. */
1344
1345 static enum gimplify_status
1346 gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p)
1347 {
1348 tree stmt = *stmt_p;
1349 tree decl = DECL_EXPR_DECL (stmt);
1350
1351 *stmt_p = NULL_TREE;
1352
1353 if (TREE_TYPE (decl) == error_mark_node)
1354 return GS_ERROR;
1355
1356 if ((TREE_CODE (decl) == TYPE_DECL
1357 || TREE_CODE (decl) == VAR_DECL)
1358 && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (decl)))
1359 gimplify_type_sizes (TREE_TYPE (decl), seq_p);
1360
1361 if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
1362 {
1363 tree init = DECL_INITIAL (decl);
1364
1365 if (TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST
1366 || (!TREE_STATIC (decl)
1367 && flag_stack_check == GENERIC_STACK_CHECK
1368 && compare_tree_int (DECL_SIZE_UNIT (decl),
1369 STACK_CHECK_MAX_VAR_SIZE) > 0))
1370 gimplify_vla_decl (decl, seq_p);
1371
1372 if (init && init != error_mark_node)
1373 {
1374 if (!TREE_STATIC (decl))
1375 {
1376 DECL_INITIAL (decl) = NULL_TREE;
1377 init = build2 (INIT_EXPR, void_type_node, decl, init);
1378 gimplify_and_add (init, seq_p);
1379 ggc_free (init);
1380 }
1381 else
1382 /* We must still examine initializers for static variables
1383 as they may contain a label address. */
1384 walk_tree (&init, force_labels_r, NULL, NULL);
1385 }
1386
1387 /* Some front ends do not explicitly declare all anonymous
1388 artificial variables. We compensate here by declaring the
1389 variables, though it would be better if the front ends would
1390 explicitly declare them. */
1391 if (!DECL_SEEN_IN_BIND_EXPR_P (decl)
1392 && DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
1393 gimple_add_tmp_var (decl);
1394 }
1395
1396 return GS_ALL_DONE;
1397 }
1398
1399 /* Gimplify a LOOP_EXPR. Normally this just involves gimplifying the body
1400 and replacing the LOOP_EXPR with goto, but if the loop contains an
1401 EXIT_EXPR, we need to append a label for it to jump to. */
1402
1403 static enum gimplify_status
1404 gimplify_loop_expr (tree *expr_p, gimple_seq *pre_p)
1405 {
1406 tree saved_label = gimplify_ctxp->exit_label;
1407 tree start_label = create_artificial_label (UNKNOWN_LOCATION);
1408
1409 gimplify_seq_add_stmt (pre_p, gimple_build_label (start_label));
1410
1411 gimplify_ctxp->exit_label = NULL_TREE;
1412
1413 gimplify_and_add (LOOP_EXPR_BODY (*expr_p), pre_p);
1414
1415 gimplify_seq_add_stmt (pre_p, gimple_build_goto (start_label));
1416
1417 if (gimplify_ctxp->exit_label)
1418 gimplify_seq_add_stmt (pre_p, gimple_build_label (gimplify_ctxp->exit_label));
1419
1420 gimplify_ctxp->exit_label = saved_label;
1421
1422 *expr_p = NULL;
1423 return GS_ALL_DONE;
1424 }
1425
1426 /* Gimplifies a statement list onto a sequence. These may be created either
1427 by an enlightened front-end, or by shortcut_cond_expr. */
1428
1429 static enum gimplify_status
1430 gimplify_statement_list (tree *expr_p, gimple_seq *pre_p)
1431 {
1432 tree temp = voidify_wrapper_expr (*expr_p, NULL);
1433
1434 tree_stmt_iterator i = tsi_start (*expr_p);
1435
1436 while (!tsi_end_p (i))
1437 {
1438 gimplify_stmt (tsi_stmt_ptr (i), pre_p);
1439 tsi_delink (&i);
1440 }
1441
1442 if (temp)
1443 {
1444 *expr_p = temp;
1445 return GS_OK;
1446 }
1447
1448 return GS_ALL_DONE;
1449 }
1450
1451 /* Compare two case labels. Because the front end should already have
1452 made sure that case ranges do not overlap, it is enough to only compare
1453 the CASE_LOW values of each case label. */
1454
1455 static int
1456 compare_case_labels (const void *p1, const void *p2)
1457 {
1458 const_tree const case1 = *(const_tree const*)p1;
1459 const_tree const case2 = *(const_tree const*)p2;
1460
1461 /* The 'default' case label always goes first. */
1462 if (!CASE_LOW (case1))
1463 return -1;
1464 else if (!CASE_LOW (case2))
1465 return 1;
1466 else
1467 return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
1468 }
1469
1470
1471 /* Sort the case labels in LABEL_VEC in place in ascending order. */
1472
1473 void
1474 sort_case_labels (VEC(tree,heap)* label_vec)
1475 {
1476 size_t len = VEC_length (tree, label_vec);
1477 qsort (VEC_address (tree, label_vec), len, sizeof (tree),
1478 compare_case_labels);
1479 }
1480
1481
1482 /* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
1483 branch to. */
1484
1485 static enum gimplify_status
1486 gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
1487 {
1488 tree switch_expr = *expr_p;
1489 gimple_seq switch_body_seq = NULL;
1490 enum gimplify_status ret;
1491
1492 ret = gimplify_expr (&SWITCH_COND (switch_expr), pre_p, NULL, is_gimple_val,
1493 fb_rvalue);
1494 if (ret == GS_ERROR || ret == GS_UNHANDLED)
1495 return ret;
1496
1497 if (SWITCH_BODY (switch_expr))
1498 {
1499 VEC (tree,heap) *labels;
1500 VEC (tree,heap) *saved_labels;
1501 tree default_case = NULL_TREE;
1502 size_t i, len;
1503 gimple gimple_switch;
1504
1505 /* If someone can be bothered to fill in the labels, they can
1506 be bothered to null out the body too. */
1507 gcc_assert (!SWITCH_LABELS (switch_expr));
1508
1509 /* save old labels, get new ones from body, then restore the old
1510 labels. Save all the things from the switch body to append after. */
1511 saved_labels = gimplify_ctxp->case_labels;
1512 gimplify_ctxp->case_labels = VEC_alloc (tree, heap, 8);
1513
1514 gimplify_stmt (&SWITCH_BODY (switch_expr), &switch_body_seq);
1515 labels = gimplify_ctxp->case_labels;
1516 gimplify_ctxp->case_labels = saved_labels;
1517
1518 i = 0;
1519 while (i < VEC_length (tree, labels))
1520 {
1521 tree elt = VEC_index (tree, labels, i);
1522 tree low = CASE_LOW (elt);
1523 bool remove_element = FALSE;
1524
1525 if (low)
1526 {
1527 /* Discard empty ranges. */
1528 tree high = CASE_HIGH (elt);
1529 if (high && tree_int_cst_lt (high, low))
1530 remove_element = TRUE;
1531 }
1532 else
1533 {
1534 /* The default case must be the last label in the list. */
1535 gcc_assert (!default_case);
1536 default_case = elt;
1537 remove_element = TRUE;
1538 }
1539
1540 if (remove_element)
1541 VEC_ordered_remove (tree, labels, i);
1542 else
1543 i++;
1544 }
1545 len = i;
1546
1547 if (!VEC_empty (tree, labels))
1548 sort_case_labels (labels);
1549
1550 if (!default_case)
1551 {
1552 tree type = TREE_TYPE (switch_expr);
1553
1554 /* If the switch has no default label, add one, so that we jump
1555 around the switch body. If the labels already cover the whole
1556 range of type, add the default label pointing to one of the
1557 existing labels. */
1558 if (type == void_type_node)
1559 type = TREE_TYPE (SWITCH_COND (switch_expr));
1560 if (len
1561 && INTEGRAL_TYPE_P (type)
1562 && TYPE_MIN_VALUE (type)
1563 && TYPE_MAX_VALUE (type)
1564 && tree_int_cst_equal (CASE_LOW (VEC_index (tree, labels, 0)),
1565 TYPE_MIN_VALUE (type)))
1566 {
1567 tree low, high = CASE_HIGH (VEC_index (tree, labels, len - 1));
1568 if (!high)
1569 high = CASE_LOW (VEC_index (tree, labels, len - 1));
1570 if (tree_int_cst_equal (high, TYPE_MAX_VALUE (type)))
1571 {
1572 for (i = 1; i < len; i++)
1573 {
1574 high = CASE_LOW (VEC_index (tree, labels, i));
1575 low = CASE_HIGH (VEC_index (tree, labels, i - 1));
1576 if (!low)
1577 low = CASE_LOW (VEC_index (tree, labels, i - 1));
1578 if ((TREE_INT_CST_LOW (low) + 1
1579 != TREE_INT_CST_LOW (high))
1580 || (TREE_INT_CST_HIGH (low)
1581 + (TREE_INT_CST_LOW (high) == 0)
1582 != TREE_INT_CST_HIGH (high)))
1583 break;
1584 }
1585 if (i == len)
1586 default_case = build3 (CASE_LABEL_EXPR, void_type_node,
1587 NULL_TREE, NULL_TREE,
1588 CASE_LABEL (VEC_index (tree,
1589 labels, 0)));
1590 }
1591 }
1592
1593 if (!default_case)
1594 {
1595 gimple new_default;
1596
1597 default_case
1598 = build3 (CASE_LABEL_EXPR, void_type_node,
1599 NULL_TREE, NULL_TREE,
1600 create_artificial_label (UNKNOWN_LOCATION));
1601 new_default = gimple_build_label (CASE_LABEL (default_case));
1602 gimplify_seq_add_stmt (&switch_body_seq, new_default);
1603 }
1604 }
1605
1606 gimple_switch = gimple_build_switch_vec (SWITCH_COND (switch_expr),
1607 default_case, labels);
1608 gimplify_seq_add_stmt (pre_p, gimple_switch);
1609 gimplify_seq_add_seq (pre_p, switch_body_seq);
1610 VEC_free(tree, heap, labels);
1611 }
1612 else
1613 gcc_assert (SWITCH_LABELS (switch_expr));
1614
1615 return GS_ALL_DONE;
1616 }
1617
1618
1619 static enum gimplify_status
1620 gimplify_case_label_expr (tree *expr_p, gimple_seq *pre_p)
1621 {
1622 struct gimplify_ctx *ctxp;
1623 gimple gimple_label;
1624
1625 /* Invalid OpenMP programs can play Duff's Device type games with
1626 #pragma omp parallel. At least in the C front end, we don't
1627 detect such invalid branches until after gimplification. */
1628 for (ctxp = gimplify_ctxp; ; ctxp = ctxp->prev_context)
1629 if (ctxp->case_labels)
1630 break;
1631
1632 gimple_label = gimple_build_label (CASE_LABEL (*expr_p));
1633 VEC_safe_push (tree, heap, ctxp->case_labels, *expr_p);
1634 gimplify_seq_add_stmt (pre_p, gimple_label);
1635
1636 return GS_ALL_DONE;
1637 }
1638
1639 /* Build a GOTO to the LABEL_DECL pointed to by LABEL_P, building it first
1640 if necessary. */
1641
1642 tree
1643 build_and_jump (tree *label_p)
1644 {
1645 if (label_p == NULL)
1646 /* If there's nowhere to jump, just fall through. */
1647 return NULL_TREE;
1648
1649 if (*label_p == NULL_TREE)
1650 {
1651 tree label = create_artificial_label (UNKNOWN_LOCATION);
1652 *label_p = label;
1653 }
1654
1655 return build1 (GOTO_EXPR, void_type_node, *label_p);
1656 }
1657
1658 /* Gimplify an EXIT_EXPR by converting to a GOTO_EXPR inside a COND_EXPR.
1659 This also involves building a label to jump to and communicating it to
1660 gimplify_loop_expr through gimplify_ctxp->exit_label. */
1661
1662 static enum gimplify_status
1663 gimplify_exit_expr (tree *expr_p)
1664 {
1665 tree cond = TREE_OPERAND (*expr_p, 0);
1666 tree expr;
1667
1668 expr = build_and_jump (&gimplify_ctxp->exit_label);
1669 expr = build3 (COND_EXPR, void_type_node, cond, expr, NULL_TREE);
1670 *expr_p = expr;
1671
1672 return GS_OK;
1673 }
1674
1675 /* A helper function to be called via walk_tree. Mark all labels under *TP
1676 as being forced. To be called for DECL_INITIAL of static variables. */
1677
1678 tree
1679 force_labels_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1680 {
1681 if (TYPE_P (*tp))
1682 *walk_subtrees = 0;
1683 if (TREE_CODE (*tp) == LABEL_DECL)
1684 FORCED_LABEL (*tp) = 1;
1685
1686 return NULL_TREE;
1687 }
1688
1689 /* *EXPR_P is a COMPONENT_REF being used as an rvalue. If its type is
1690 different from its canonical type, wrap the whole thing inside a
1691 NOP_EXPR and force the type of the COMPONENT_REF to be the canonical
1692 type.
1693
1694 The canonical type of a COMPONENT_REF is the type of the field being
1695 referenced--unless the field is a bit-field which can be read directly
1696 in a smaller mode, in which case the canonical type is the
1697 sign-appropriate type corresponding to that mode. */
1698
1699 static void
1700 canonicalize_component_ref (tree *expr_p)
1701 {
1702 tree expr = *expr_p;
1703 tree type;
1704
1705 gcc_assert (TREE_CODE (expr) == COMPONENT_REF);
1706
1707 if (INTEGRAL_TYPE_P (TREE_TYPE (expr)))
1708 type = TREE_TYPE (get_unwidened (expr, NULL_TREE));
1709 else
1710 type = TREE_TYPE (TREE_OPERAND (expr, 1));
1711
1712 /* One could argue that all the stuff below is not necessary for
1713 the non-bitfield case and declare it a FE error if type
1714 adjustment would be needed. */
1715 if (TREE_TYPE (expr) != type)
1716 {
1717 #ifdef ENABLE_TYPES_CHECKING
1718 tree old_type = TREE_TYPE (expr);
1719 #endif
1720 int type_quals;
1721
1722 /* We need to preserve qualifiers and propagate them from
1723 operand 0. */
1724 type_quals = TYPE_QUALS (type)
1725 | TYPE_QUALS (TREE_TYPE (TREE_OPERAND (expr, 0)));
1726 if (TYPE_QUALS (type) != type_quals)
1727 type = build_qualified_type (TYPE_MAIN_VARIANT (type), type_quals);
1728
1729 /* Set the type of the COMPONENT_REF to the underlying type. */
1730 TREE_TYPE (expr) = type;
1731
1732 #ifdef ENABLE_TYPES_CHECKING
1733 /* It is now a FE error, if the conversion from the canonical
1734 type to the original expression type is not useless. */
1735 gcc_assert (useless_type_conversion_p (old_type, type));
1736 #endif
1737 }
1738 }
1739
1740 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1741 to foo, embed that change in the ADDR_EXPR by converting
1742 T array[U];
1743 (T *)&array
1744 ==>
1745 &array[L]
1746 where L is the lower bound. For simplicity, only do this for constant
1747 lower bound.
1748 The constraint is that the type of &array[L] is trivially convertible
1749 to T *. */
1750
1751 static void
1752 canonicalize_addr_expr (tree *expr_p)
1753 {
1754 tree expr = *expr_p;
1755 tree addr_expr = TREE_OPERAND (expr, 0);
1756 tree datype, ddatype, pddatype;
1757
1758 /* We simplify only conversions from an ADDR_EXPR to a pointer type. */
1759 if (!POINTER_TYPE_P (TREE_TYPE (expr))
1760 || TREE_CODE (addr_expr) != ADDR_EXPR)
1761 return;
1762
1763 /* The addr_expr type should be a pointer to an array. */
1764 datype = TREE_TYPE (TREE_TYPE (addr_expr));
1765 if (TREE_CODE (datype) != ARRAY_TYPE)
1766 return;
1767
1768 /* The pointer to element type shall be trivially convertible to
1769 the expression pointer type. */
1770 ddatype = TREE_TYPE (datype);
1771 pddatype = build_pointer_type (ddatype);
1772 if (!useless_type_conversion_p (TYPE_MAIN_VARIANT (TREE_TYPE (expr)),
1773 pddatype))
1774 return;
1775
1776 /* The lower bound and element sizes must be constant. */
1777 if (!TYPE_SIZE_UNIT (ddatype)
1778 || TREE_CODE (TYPE_SIZE_UNIT (ddatype)) != INTEGER_CST
1779 || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1780 || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1781 return;
1782
1783 /* All checks succeeded. Build a new node to merge the cast. */
1784 *expr_p = build4 (ARRAY_REF, ddatype, TREE_OPERAND (addr_expr, 0),
1785 TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1786 NULL_TREE, NULL_TREE);
1787 *expr_p = build1 (ADDR_EXPR, pddatype, *expr_p);
1788
1789 /* We can have stripped a required restrict qualifier above. */
1790 if (!useless_type_conversion_p (TREE_TYPE (expr), TREE_TYPE (*expr_p)))
1791 *expr_p = fold_convert (TREE_TYPE (expr), *expr_p);
1792 }
1793
1794 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR. Remove it and/or other conversions
1795 underneath as appropriate. */
1796
1797 static enum gimplify_status
1798 gimplify_conversion (tree *expr_p)
1799 {
1800 tree tem;
1801 location_t loc = EXPR_LOCATION (*expr_p);
1802 gcc_assert (CONVERT_EXPR_P (*expr_p));
1803
1804 /* Then strip away all but the outermost conversion. */
1805 STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1806
1807 /* And remove the outermost conversion if it's useless. */
1808 if (tree_ssa_useless_type_conversion (*expr_p))
1809 *expr_p = TREE_OPERAND (*expr_p, 0);
1810
1811 /* Attempt to avoid NOP_EXPR by producing reference to a subtype.
1812 For example this fold (subclass *)&A into &A->subclass avoiding
1813 a need for statement. */
1814 if (CONVERT_EXPR_P (*expr_p)
1815 && POINTER_TYPE_P (TREE_TYPE (*expr_p))
1816 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 0)))
1817 && (tem = maybe_fold_offset_to_address
1818 (EXPR_LOCATION (*expr_p), TREE_OPERAND (*expr_p, 0),
1819 integer_zero_node, TREE_TYPE (*expr_p))) != NULL_TREE)
1820 *expr_p = tem;
1821
1822 /* If we still have a conversion at the toplevel,
1823 then canonicalize some constructs. */
1824 if (CONVERT_EXPR_P (*expr_p))
1825 {
1826 tree sub = TREE_OPERAND (*expr_p, 0);
1827
1828 /* If a NOP conversion is changing the type of a COMPONENT_REF
1829 expression, then canonicalize its type now in order to expose more
1830 redundant conversions. */
1831 if (TREE_CODE (sub) == COMPONENT_REF)
1832 canonicalize_component_ref (&TREE_OPERAND (*expr_p, 0));
1833
1834 /* If a NOP conversion is changing a pointer to array of foo
1835 to a pointer to foo, embed that change in the ADDR_EXPR. */
1836 else if (TREE_CODE (sub) == ADDR_EXPR)
1837 canonicalize_addr_expr (expr_p);
1838 }
1839
1840 /* If we have a conversion to a non-register type force the
1841 use of a VIEW_CONVERT_EXPR instead. */
1842 if (CONVERT_EXPR_P (*expr_p) && !is_gimple_reg_type (TREE_TYPE (*expr_p)))
1843 *expr_p = fold_build1_loc (loc, VIEW_CONVERT_EXPR, TREE_TYPE (*expr_p),
1844 TREE_OPERAND (*expr_p, 0));
1845
1846 return GS_OK;
1847 }
1848
1849 /* Nonlocal VLAs seen in the current function. */
1850 static struct pointer_set_t *nonlocal_vlas;
1851
1852 /* Gimplify a VAR_DECL or PARM_DECL. Returns GS_OK if we expanded a
1853 DECL_VALUE_EXPR, and it's worth re-examining things. */
1854
1855 static enum gimplify_status
1856 gimplify_var_or_parm_decl (tree *expr_p)
1857 {
1858 tree decl = *expr_p;
1859
1860 /* ??? If this is a local variable, and it has not been seen in any
1861 outer BIND_EXPR, then it's probably the result of a duplicate
1862 declaration, for which we've already issued an error. It would
1863 be really nice if the front end wouldn't leak these at all.
1864 Currently the only known culprit is C++ destructors, as seen
1865 in g++.old-deja/g++.jason/binding.C. */
1866 if (TREE_CODE (decl) == VAR_DECL
1867 && !DECL_SEEN_IN_BIND_EXPR_P (decl)
1868 && !TREE_STATIC (decl) && !DECL_EXTERNAL (decl)
1869 && decl_function_context (decl) == current_function_decl)
1870 {
1871 gcc_assert (seen_error ());
1872 return GS_ERROR;
1873 }
1874
1875 /* When within an OpenMP context, notice uses of variables. */
1876 if (gimplify_omp_ctxp && omp_notice_variable (gimplify_omp_ctxp, decl, true))
1877 return GS_ALL_DONE;
1878
1879 /* If the decl is an alias for another expression, substitute it now. */
1880 if (DECL_HAS_VALUE_EXPR_P (decl))
1881 {
1882 tree value_expr = DECL_VALUE_EXPR (decl);
1883
1884 /* For referenced nonlocal VLAs add a decl for debugging purposes
1885 to the current function. */
1886 if (TREE_CODE (decl) == VAR_DECL
1887 && TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST
1888 && nonlocal_vlas != NULL
1889 && TREE_CODE (value_expr) == INDIRECT_REF
1890 && TREE_CODE (TREE_OPERAND (value_expr, 0)) == VAR_DECL
1891 && decl_function_context (decl) != current_function_decl)
1892 {
1893 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
1894 while (ctx && ctx->region_type == ORT_WORKSHARE)
1895 ctx = ctx->outer_context;
1896 if (!ctx && !pointer_set_insert (nonlocal_vlas, decl))
1897 {
1898 tree copy = copy_node (decl), block;
1899
1900 lang_hooks.dup_lang_specific_decl (copy);
1901 SET_DECL_RTL (copy, 0);
1902 TREE_USED (copy) = 1;
1903 block = DECL_INITIAL (current_function_decl);
1904 TREE_CHAIN (copy) = BLOCK_VARS (block);
1905 BLOCK_VARS (block) = copy;
1906 SET_DECL_VALUE_EXPR (copy, unshare_expr (value_expr));
1907 DECL_HAS_VALUE_EXPR_P (copy) = 1;
1908 }
1909 }
1910
1911 *expr_p = unshare_expr (value_expr);
1912 return GS_OK;
1913 }
1914
1915 return GS_ALL_DONE;
1916 }
1917
1918
1919 /* Gimplify the COMPONENT_REF, ARRAY_REF, REALPART_EXPR or IMAGPART_EXPR
1920 node *EXPR_P.
1921
1922 compound_lval
1923 : min_lval '[' val ']'
1924 | min_lval '.' ID
1925 | compound_lval '[' val ']'
1926 | compound_lval '.' ID
1927
1928 This is not part of the original SIMPLE definition, which separates
1929 array and member references, but it seems reasonable to handle them
1930 together. Also, this way we don't run into problems with union
1931 aliasing; gcc requires that for accesses through a union to alias, the
1932 union reference must be explicit, which was not always the case when we
1933 were splitting up array and member refs.
1934
1935 PRE_P points to the sequence where side effects that must happen before
1936 *EXPR_P should be stored.
1937
1938 POST_P points to the sequence where side effects that must happen after
1939 *EXPR_P should be stored. */
1940
1941 static enum gimplify_status
1942 gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
1943 fallback_t fallback)
1944 {
1945 tree *p;
1946 VEC(tree,heap) *stack;
1947 enum gimplify_status ret = GS_ALL_DONE, tret;
1948 int i;
1949 location_t loc = EXPR_LOCATION (*expr_p);
1950 tree expr = *expr_p;
1951
1952 /* Create a stack of the subexpressions so later we can walk them in
1953 order from inner to outer. */
1954 stack = VEC_alloc (tree, heap, 10);
1955
1956 /* We can handle anything that get_inner_reference can deal with. */
1957 for (p = expr_p; ; p = &TREE_OPERAND (*p, 0))
1958 {
1959 restart:
1960 /* Fold INDIRECT_REFs now to turn them into ARRAY_REFs. */
1961 if (TREE_CODE (*p) == INDIRECT_REF)
1962 *p = fold_indirect_ref_loc (loc, *p);
1963
1964 if (handled_component_p (*p))
1965 ;
1966 /* Expand DECL_VALUE_EXPR now. In some cases that may expose
1967 additional COMPONENT_REFs. */
1968 else if ((TREE_CODE (*p) == VAR_DECL || TREE_CODE (*p) == PARM_DECL)
1969 && gimplify_var_or_parm_decl (p) == GS_OK)
1970 goto restart;
1971 else
1972 break;
1973
1974 VEC_safe_push (tree, heap, stack, *p);
1975 }
1976
1977 gcc_assert (VEC_length (tree, stack));
1978
1979 /* Now STACK is a stack of pointers to all the refs we've walked through
1980 and P points to the innermost expression.
1981
1982 Java requires that we elaborated nodes in source order. That
1983 means we must gimplify the inner expression followed by each of
1984 the indices, in order. But we can't gimplify the inner
1985 expression until we deal with any variable bounds, sizes, or
1986 positions in order to deal with PLACEHOLDER_EXPRs.
1987
1988 So we do this in three steps. First we deal with the annotations
1989 for any variables in the components, then we gimplify the base,
1990 then we gimplify any indices, from left to right. */
1991 for (i = VEC_length (tree, stack) - 1; i >= 0; i--)
1992 {
1993 tree t = VEC_index (tree, stack, i);
1994
1995 if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1996 {
1997 /* Gimplify the low bound and element type size and put them into
1998 the ARRAY_REF. If these values are set, they have already been
1999 gimplified. */
2000 if (TREE_OPERAND (t, 2) == NULL_TREE)
2001 {
2002 tree low = unshare_expr (array_ref_low_bound (t));
2003 if (!is_gimple_min_invariant (low))
2004 {
2005 TREE_OPERAND (t, 2) = low;
2006 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p,
2007 post_p, is_gimple_reg,
2008 fb_rvalue);
2009 ret = MIN (ret, tret);
2010 }
2011 }
2012
2013 if (!TREE_OPERAND (t, 3))
2014 {
2015 tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
2016 tree elmt_size = unshare_expr (array_ref_element_size (t));
2017 tree factor = size_int (TYPE_ALIGN_UNIT (elmt_type));
2018
2019 /* Divide the element size by the alignment of the element
2020 type (above). */
2021 elmt_size = size_binop_loc (loc, EXACT_DIV_EXPR, elmt_size, factor);
2022
2023 if (!is_gimple_min_invariant (elmt_size))
2024 {
2025 TREE_OPERAND (t, 3) = elmt_size;
2026 tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p,
2027 post_p, is_gimple_reg,
2028 fb_rvalue);
2029 ret = MIN (ret, tret);
2030 }
2031 }
2032 }
2033 else if (TREE_CODE (t) == COMPONENT_REF)
2034 {
2035 /* Set the field offset into T and gimplify it. */
2036 if (!TREE_OPERAND (t, 2))
2037 {
2038 tree offset = unshare_expr (component_ref_field_offset (t));
2039 tree field = TREE_OPERAND (t, 1);
2040 tree factor
2041 = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT);
2042
2043 /* Divide the offset by its alignment. */
2044 offset = size_binop_loc (loc, EXACT_DIV_EXPR, offset, factor);
2045
2046 if (!is_gimple_min_invariant (offset))
2047 {
2048 TREE_OPERAND (t, 2) = offset;
2049 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p,
2050 post_p, is_gimple_reg,
2051 fb_rvalue);
2052 ret = MIN (ret, tret);
2053 }
2054 }
2055 }
2056 }
2057
2058 /* Step 2 is to gimplify the base expression. Make sure lvalue is set
2059 so as to match the min_lval predicate. Failure to do so may result
2060 in the creation of large aggregate temporaries. */
2061 tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval,
2062 fallback | fb_lvalue);
2063 ret = MIN (ret, tret);
2064
2065 /* And finally, the indices and operands to BIT_FIELD_REF. During this
2066 loop we also remove any useless conversions. */
2067 for (; VEC_length (tree, stack) > 0; )
2068 {
2069 tree t = VEC_pop (tree, stack);
2070
2071 if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
2072 {
2073 /* Gimplify the dimension. */
2074 if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
2075 {
2076 tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
2077 is_gimple_val, fb_rvalue);
2078 ret = MIN (ret, tret);
2079 }
2080 }
2081 else if (TREE_CODE (t) == BIT_FIELD_REF)
2082 {
2083 tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
2084 is_gimple_val, fb_rvalue);
2085 ret = MIN (ret, tret);
2086 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
2087 is_gimple_val, fb_rvalue);
2088 ret = MIN (ret, tret);
2089 }
2090
2091 STRIP_USELESS_TYPE_CONVERSION (TREE_OPERAND (t, 0));
2092
2093 /* The innermost expression P may have originally had
2094 TREE_SIDE_EFFECTS set which would have caused all the outer
2095 expressions in *EXPR_P leading to P to also have had
2096 TREE_SIDE_EFFECTS set. */
2097 recalculate_side_effects (t);
2098 }
2099
2100 /* If the outermost expression is a COMPONENT_REF, canonicalize its type. */
2101 if ((fallback & fb_rvalue) && TREE_CODE (*expr_p) == COMPONENT_REF)
2102 {
2103 canonicalize_component_ref (expr_p);
2104 }
2105
2106 VEC_free (tree, heap, stack);
2107
2108 gcc_assert (*expr_p == expr || ret != GS_ALL_DONE);
2109
2110 return ret;
2111 }
2112
2113 /* Gimplify the self modifying expression pointed to by EXPR_P
2114 (++, --, +=, -=).
2115
2116 PRE_P points to the list where side effects that must happen before
2117 *EXPR_P should be stored.
2118
2119 POST_P points to the list where side effects that must happen after
2120 *EXPR_P should be stored.
2121
2122 WANT_VALUE is nonzero iff we want to use the value of this expression
2123 in another expression. */
2124
2125 static enum gimplify_status
2126 gimplify_self_mod_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
2127 bool want_value)
2128 {
2129 enum tree_code code;
2130 tree lhs, lvalue, rhs, t1;
2131 gimple_seq post = NULL, *orig_post_p = post_p;
2132 bool postfix;
2133 enum tree_code arith_code;
2134 enum gimplify_status ret;
2135 location_t loc = EXPR_LOCATION (*expr_p);
2136
2137 code = TREE_CODE (*expr_p);
2138
2139 gcc_assert (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR
2140 || code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR);
2141
2142 /* Prefix or postfix? */
2143 if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
2144 /* Faster to treat as prefix if result is not used. */
2145 postfix = want_value;
2146 else
2147 postfix = false;
2148
2149 /* For postfix, make sure the inner expression's post side effects
2150 are executed after side effects from this expression. */
2151 if (postfix)
2152 post_p = &post;
2153
2154 /* Add or subtract? */
2155 if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
2156 arith_code = PLUS_EXPR;
2157 else
2158 arith_code = MINUS_EXPR;
2159
2160 /* Gimplify the LHS into a GIMPLE lvalue. */
2161 lvalue = TREE_OPERAND (*expr_p, 0);
2162 ret = gimplify_expr (&lvalue, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
2163 if (ret == GS_ERROR)
2164 return ret;
2165
2166 /* Extract the operands to the arithmetic operation. */
2167 lhs = lvalue;
2168 rhs = TREE_OPERAND (*expr_p, 1);
2169
2170 /* For postfix operator, we evaluate the LHS to an rvalue and then use
2171 that as the result value and in the postqueue operation. We also
2172 make sure to make lvalue a minimal lval, see
2173 gcc.c-torture/execute/20040313-1.c for an example where this matters. */
2174 if (postfix)
2175 {
2176 if (!is_gimple_min_lval (lvalue))
2177 {
2178 mark_addressable (lvalue);
2179 lvalue = build_fold_addr_expr_loc (input_location, lvalue);
2180 gimplify_expr (&lvalue, pre_p, post_p, is_gimple_val, fb_rvalue);
2181 lvalue = build_fold_indirect_ref_loc (input_location, lvalue);
2182 }
2183 ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
2184 if (ret == GS_ERROR)
2185 return ret;
2186 }
2187
2188 /* For POINTERs increment, use POINTER_PLUS_EXPR. */
2189 if (POINTER_TYPE_P (TREE_TYPE (lhs)))
2190 {
2191 rhs = fold_convert_loc (loc, sizetype, rhs);
2192 if (arith_code == MINUS_EXPR)
2193 rhs = fold_build1_loc (loc, NEGATE_EXPR, TREE_TYPE (rhs), rhs);
2194 arith_code = POINTER_PLUS_EXPR;
2195 }
2196
2197 t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
2198
2199 if (postfix)
2200 {
2201 gimplify_assign (lvalue, t1, orig_post_p);
2202 gimplify_seq_add_seq (orig_post_p, post);
2203 *expr_p = lhs;
2204 return GS_ALL_DONE;
2205 }
2206 else
2207 {
2208 *expr_p = build2 (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
2209 return GS_OK;
2210 }
2211 }
2212
2213
2214 /* If *EXPR_P has a variable sized type, wrap it in a WITH_SIZE_EXPR. */
2215
2216 static void
2217 maybe_with_size_expr (tree *expr_p)
2218 {
2219 tree expr = *expr_p;
2220 tree type = TREE_TYPE (expr);
2221 tree size;
2222
2223 /* If we've already wrapped this or the type is error_mark_node, we can't do
2224 anything. */
2225 if (TREE_CODE (expr) == WITH_SIZE_EXPR
2226 || type == error_mark_node)
2227 return;
2228
2229 /* If the size isn't known or is a constant, we have nothing to do. */
2230 size = TYPE_SIZE_UNIT (type);
2231 if (!size || TREE_CODE (size) == INTEGER_CST)
2232 return;
2233
2234 /* Otherwise, make a WITH_SIZE_EXPR. */
2235 size = unshare_expr (size);
2236 size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, expr);
2237 *expr_p = build2 (WITH_SIZE_EXPR, type, expr, size);
2238 }
2239
2240
2241 /* Helper for gimplify_call_expr. Gimplify a single argument *ARG_P
2242 Store any side-effects in PRE_P. CALL_LOCATION is the location of
2243 the CALL_EXPR. */
2244
2245 static enum gimplify_status
2246 gimplify_arg (tree *arg_p, gimple_seq *pre_p, location_t call_location)
2247 {
2248 bool (*test) (tree);
2249 fallback_t fb;
2250
2251 /* In general, we allow lvalues for function arguments to avoid
2252 extra overhead of copying large aggregates out of even larger
2253 aggregates into temporaries only to copy the temporaries to
2254 the argument list. Make optimizers happy by pulling out to
2255 temporaries those types that fit in registers. */
2256 if (is_gimple_reg_type (TREE_TYPE (*arg_p)))
2257 test = is_gimple_val, fb = fb_rvalue;
2258 else
2259 test = is_gimple_lvalue, fb = fb_either;
2260
2261 /* If this is a variable sized type, we must remember the size. */
2262 maybe_with_size_expr (arg_p);
2263
2264 /* FIXME diagnostics: This will mess up gcc.dg/Warray-bounds.c. */
2265 /* Make sure arguments have the same location as the function call
2266 itself. */
2267 protected_set_expr_location (*arg_p, call_location);
2268
2269 /* There is a sequence point before a function call. Side effects in
2270 the argument list must occur before the actual call. So, when
2271 gimplifying arguments, force gimplify_expr to use an internal
2272 post queue which is then appended to the end of PRE_P. */
2273 return gimplify_expr (arg_p, pre_p, NULL, test, fb);
2274 }
2275
2276
2277 /* Gimplify the CALL_EXPR node *EXPR_P into the GIMPLE sequence PRE_P.
2278 WANT_VALUE is true if the result of the call is desired. */
2279
2280 static enum gimplify_status
2281 gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
2282 {
2283 tree fndecl, parms, p;
2284 enum gimplify_status ret;
2285 int i, nargs;
2286 gimple call;
2287 bool builtin_va_start_p = FALSE;
2288 location_t loc = EXPR_LOCATION (*expr_p);
2289
2290 gcc_assert (TREE_CODE (*expr_p) == CALL_EXPR);
2291
2292 /* For reliable diagnostics during inlining, it is necessary that
2293 every call_expr be annotated with file and line. */
2294 if (! EXPR_HAS_LOCATION (*expr_p))
2295 SET_EXPR_LOCATION (*expr_p, input_location);
2296
2297 /* This may be a call to a builtin function.
2298
2299 Builtin function calls may be transformed into different
2300 (and more efficient) builtin function calls under certain
2301 circumstances. Unfortunately, gimplification can muck things
2302 up enough that the builtin expanders are not aware that certain
2303 transformations are still valid.
2304
2305 So we attempt transformation/gimplification of the call before
2306 we gimplify the CALL_EXPR. At this time we do not manage to
2307 transform all calls in the same manner as the expanders do, but
2308 we do transform most of them. */
2309 fndecl = get_callee_fndecl (*expr_p);
2310 if (fndecl && DECL_BUILT_IN (fndecl))
2311 {
2312 tree new_tree = fold_call_expr (input_location, *expr_p, !want_value);
2313
2314 if (new_tree && new_tree != *expr_p)
2315 {
2316 /* There was a transformation of this call which computes the
2317 same value, but in a more efficient way. Return and try
2318 again. */
2319 *expr_p = new_tree;
2320 return GS_OK;
2321 }
2322
2323 if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
2324 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_VA_START)
2325 {
2326 builtin_va_start_p = TRUE;
2327 if (call_expr_nargs (*expr_p) < 2)
2328 {
2329 error ("too few arguments to function %<va_start%>");
2330 *expr_p = build_empty_stmt (EXPR_LOCATION (*expr_p));
2331 return GS_OK;
2332 }
2333
2334 if (fold_builtin_next_arg (*expr_p, true))
2335 {
2336 *expr_p = build_empty_stmt (EXPR_LOCATION (*expr_p));
2337 return GS_OK;
2338 }
2339 }
2340 }
2341
2342 /* There is a sequence point before the call, so any side effects in
2343 the calling expression must occur before the actual call. Force
2344 gimplify_expr to use an internal post queue. */
2345 ret = gimplify_expr (&CALL_EXPR_FN (*expr_p), pre_p, NULL,
2346 is_gimple_call_addr, fb_rvalue);
2347
2348 nargs = call_expr_nargs (*expr_p);
2349
2350 /* Get argument types for verification. */
2351 fndecl = get_callee_fndecl (*expr_p);
2352 parms = NULL_TREE;
2353 if (fndecl)
2354 parms = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
2355 else if (POINTER_TYPE_P (TREE_TYPE (CALL_EXPR_FN (*expr_p))))
2356 parms = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (*expr_p))));
2357
2358 if (fndecl && DECL_ARGUMENTS (fndecl))
2359 p = DECL_ARGUMENTS (fndecl);
2360 else if (parms)
2361 p = parms;
2362 else
2363 p = NULL_TREE;
2364 for (i = 0; i < nargs && p; i++, p = TREE_CHAIN (p))
2365 ;
2366
2367 /* If the last argument is __builtin_va_arg_pack () and it is not
2368 passed as a named argument, decrease the number of CALL_EXPR
2369 arguments and set instead the CALL_EXPR_VA_ARG_PACK flag. */
2370 if (!p
2371 && i < nargs
2372 && TREE_CODE (CALL_EXPR_ARG (*expr_p, nargs - 1)) == CALL_EXPR)
2373 {
2374 tree last_arg = CALL_EXPR_ARG (*expr_p, nargs - 1);
2375 tree last_arg_fndecl = get_callee_fndecl (last_arg);
2376
2377 if (last_arg_fndecl
2378 && TREE_CODE (last_arg_fndecl) == FUNCTION_DECL
2379 && DECL_BUILT_IN_CLASS (last_arg_fndecl) == BUILT_IN_NORMAL
2380 && DECL_FUNCTION_CODE (last_arg_fndecl) == BUILT_IN_VA_ARG_PACK)
2381 {
2382 tree call = *expr_p;
2383
2384 --nargs;
2385 *expr_p = build_call_array_loc (loc, TREE_TYPE (call),
2386 CALL_EXPR_FN (call),
2387 nargs, CALL_EXPR_ARGP (call));
2388
2389 /* Copy all CALL_EXPR flags, location and block, except
2390 CALL_EXPR_VA_ARG_PACK flag. */
2391 CALL_EXPR_STATIC_CHAIN (*expr_p) = CALL_EXPR_STATIC_CHAIN (call);
2392 CALL_EXPR_TAILCALL (*expr_p) = CALL_EXPR_TAILCALL (call);
2393 CALL_EXPR_RETURN_SLOT_OPT (*expr_p)
2394 = CALL_EXPR_RETURN_SLOT_OPT (call);
2395 CALL_FROM_THUNK_P (*expr_p) = CALL_FROM_THUNK_P (call);
2396 CALL_CANNOT_INLINE_P (*expr_p) = CALL_CANNOT_INLINE_P (call);
2397 SET_EXPR_LOCATION (*expr_p, EXPR_LOCATION (call));
2398 TREE_BLOCK (*expr_p) = TREE_BLOCK (call);
2399
2400 /* Set CALL_EXPR_VA_ARG_PACK. */
2401 CALL_EXPR_VA_ARG_PACK (*expr_p) = 1;
2402 }
2403 }
2404
2405 /* Finally, gimplify the function arguments. */
2406 if (nargs > 0)
2407 {
2408 for (i = (PUSH_ARGS_REVERSED ? nargs - 1 : 0);
2409 PUSH_ARGS_REVERSED ? i >= 0 : i < nargs;
2410 PUSH_ARGS_REVERSED ? i-- : i++)
2411 {
2412 enum gimplify_status t;
2413
2414 /* Avoid gimplifying the second argument to va_start, which needs to
2415 be the plain PARM_DECL. */
2416 if ((i != 1) || !builtin_va_start_p)
2417 {
2418 t = gimplify_arg (&CALL_EXPR_ARG (*expr_p, i), pre_p,
2419 EXPR_LOCATION (*expr_p));
2420
2421 if (t == GS_ERROR)
2422 ret = GS_ERROR;
2423 }
2424 }
2425 }
2426
2427 /* Verify the function result. */
2428 if (want_value && fndecl
2429 && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fndecl))))
2430 {
2431 error_at (loc, "using result of function returning %<void%>");
2432 ret = GS_ERROR;
2433 }
2434
2435 /* Try this again in case gimplification exposed something. */
2436 if (ret != GS_ERROR)
2437 {
2438 tree new_tree = fold_call_expr (input_location, *expr_p, !want_value);
2439
2440 if (new_tree && new_tree != *expr_p)
2441 {
2442 /* There was a transformation of this call which computes the
2443 same value, but in a more efficient way. Return and try
2444 again. */
2445 *expr_p = new_tree;
2446 return GS_OK;
2447 }
2448 }
2449 else
2450 {
2451 *expr_p = error_mark_node;
2452 return GS_ERROR;
2453 }
2454
2455 /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
2456 decl. This allows us to eliminate redundant or useless
2457 calls to "const" functions. */
2458 if (TREE_CODE (*expr_p) == CALL_EXPR)
2459 {
2460 int flags = call_expr_flags (*expr_p);
2461 if (flags & (ECF_CONST | ECF_PURE)
2462 /* An infinite loop is considered a side effect. */
2463 && !(flags & (ECF_LOOPING_CONST_OR_PURE)))
2464 TREE_SIDE_EFFECTS (*expr_p) = 0;
2465 }
2466
2467 /* If the value is not needed by the caller, emit a new GIMPLE_CALL
2468 and clear *EXPR_P. Otherwise, leave *EXPR_P in its gimplified
2469 form and delegate the creation of a GIMPLE_CALL to
2470 gimplify_modify_expr. This is always possible because when
2471 WANT_VALUE is true, the caller wants the result of this call into
2472 a temporary, which means that we will emit an INIT_EXPR in
2473 internal_get_tmp_var which will then be handled by
2474 gimplify_modify_expr. */
2475 if (!want_value)
2476 {
2477 /* The CALL_EXPR in *EXPR_P is already in GIMPLE form, so all we
2478 have to do is replicate it as a GIMPLE_CALL tuple. */
2479 call = gimple_build_call_from_tree (*expr_p);
2480 gimplify_seq_add_stmt (pre_p, call);
2481 *expr_p = NULL_TREE;
2482 }
2483
2484 return ret;
2485 }
2486
2487 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
2488 rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
2489
2490 TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
2491 condition is true or false, respectively. If null, we should generate
2492 our own to skip over the evaluation of this specific expression.
2493
2494 LOCUS is the source location of the COND_EXPR.
2495
2496 This function is the tree equivalent of do_jump.
2497
2498 shortcut_cond_r should only be called by shortcut_cond_expr. */
2499
2500 static tree
2501 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p,
2502 location_t locus)
2503 {
2504 tree local_label = NULL_TREE;
2505 tree t, expr = NULL;
2506
2507 /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
2508 retain the shortcut semantics. Just insert the gotos here;
2509 shortcut_cond_expr will append the real blocks later. */
2510 if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2511 {
2512 location_t new_locus;
2513
2514 /* Turn if (a && b) into
2515
2516 if (a); else goto no;
2517 if (b) goto yes; else goto no;
2518 (no:) */
2519
2520 if (false_label_p == NULL)
2521 false_label_p = &local_label;
2522
2523 /* Keep the original source location on the first 'if'. */
2524 t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p, locus);
2525 append_to_statement_list (t, &expr);
2526
2527 /* Set the source location of the && on the second 'if'. */
2528 new_locus = EXPR_HAS_LOCATION (pred) ? EXPR_LOCATION (pred) : locus;
2529 t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p, false_label_p,
2530 new_locus);
2531 append_to_statement_list (t, &expr);
2532 }
2533 else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2534 {
2535 location_t new_locus;
2536
2537 /* Turn if (a || b) into
2538
2539 if (a) goto yes;
2540 if (b) goto yes; else goto no;
2541 (yes:) */
2542
2543 if (true_label_p == NULL)
2544 true_label_p = &local_label;
2545
2546 /* Keep the original source location on the first 'if'. */
2547 t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL, locus);
2548 append_to_statement_list (t, &expr);
2549
2550 /* Set the source location of the || on the second 'if'. */
2551 new_locus = EXPR_HAS_LOCATION (pred) ? EXPR_LOCATION (pred) : locus;
2552 t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p, false_label_p,
2553 new_locus);
2554 append_to_statement_list (t, &expr);
2555 }
2556 else if (TREE_CODE (pred) == COND_EXPR)
2557 {
2558 location_t new_locus;
2559
2560 /* As long as we're messing with gotos, turn if (a ? b : c) into
2561 if (a)
2562 if (b) goto yes; else goto no;
2563 else
2564 if (c) goto yes; else goto no; */
2565
2566 /* Keep the original source location on the first 'if'. Set the source
2567 location of the ? on the second 'if'. */
2568 new_locus = EXPR_HAS_LOCATION (pred) ? EXPR_LOCATION (pred) : locus;
2569 expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
2570 shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2571 false_label_p, locus),
2572 shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
2573 false_label_p, new_locus));
2574 }
2575 else
2576 {
2577 expr = build3 (COND_EXPR, void_type_node, pred,
2578 build_and_jump (true_label_p),
2579 build_and_jump (false_label_p));
2580 SET_EXPR_LOCATION (expr, locus);
2581 }
2582
2583 if (local_label)
2584 {
2585 t = build1 (LABEL_EXPR, void_type_node, local_label);
2586 append_to_statement_list (t, &expr);
2587 }
2588
2589 return expr;
2590 }
2591
2592 /* Given a conditional expression EXPR with short-circuit boolean
2593 predicates using TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR, break the
2594 predicate appart into the equivalent sequence of conditionals. */
2595
2596 static tree
2597 shortcut_cond_expr (tree expr)
2598 {
2599 tree pred = TREE_OPERAND (expr, 0);
2600 tree then_ = TREE_OPERAND (expr, 1);
2601 tree else_ = TREE_OPERAND (expr, 2);
2602 tree true_label, false_label, end_label, t;
2603 tree *true_label_p;
2604 tree *false_label_p;
2605 bool emit_end, emit_false, jump_over_else;
2606 bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
2607 bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
2608
2609 /* First do simple transformations. */
2610 if (!else_se)
2611 {
2612 /* If there is no 'else', turn
2613 if (a && b) then c
2614 into
2615 if (a) if (b) then c. */
2616 while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2617 {
2618 /* Keep the original source location on the first 'if'. */
2619 location_t locus = EXPR_HAS_LOCATION (expr)
2620 ? EXPR_LOCATION (expr) : input_location;
2621 TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2622 /* Set the source location of the && on the second 'if'. */
2623 if (EXPR_HAS_LOCATION (pred))
2624 SET_EXPR_LOCATION (expr, EXPR_LOCATION (pred));
2625 then_ = shortcut_cond_expr (expr);
2626 then_se = then_ && TREE_SIDE_EFFECTS (then_);
2627 pred = TREE_OPERAND (pred, 0);
2628 expr = build3 (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
2629 SET_EXPR_LOCATION (expr, locus);
2630 }
2631 }
2632
2633 if (!then_se)
2634 {
2635 /* If there is no 'then', turn
2636 if (a || b); else d
2637 into
2638 if (a); else if (b); else d. */
2639 while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2640 {
2641 /* Keep the original source location on the first 'if'. */
2642 location_t locus = EXPR_HAS_LOCATION (expr)
2643 ? EXPR_LOCATION (expr) : input_location;
2644 TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2645 /* Set the source location of the || on the second 'if'. */
2646 if (EXPR_HAS_LOCATION (pred))
2647 SET_EXPR_LOCATION (expr, EXPR_LOCATION (pred));
2648 else_ = shortcut_cond_expr (expr);
2649 else_se = else_ && TREE_SIDE_EFFECTS (else_);
2650 pred = TREE_OPERAND (pred, 0);
2651 expr = build3 (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
2652 SET_EXPR_LOCATION (expr, locus);
2653 }
2654 }
2655
2656 /* If we're done, great. */
2657 if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
2658 && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
2659 return expr;
2660
2661 /* Otherwise we need to mess with gotos. Change
2662 if (a) c; else d;
2663 to
2664 if (a); else goto no;
2665 c; goto end;
2666 no: d; end:
2667 and recursively gimplify the condition. */
2668
2669 true_label = false_label = end_label = NULL_TREE;
2670
2671 /* If our arms just jump somewhere, hijack those labels so we don't
2672 generate jumps to jumps. */
2673
2674 if (then_
2675 && TREE_CODE (then_) == GOTO_EXPR
2676 && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
2677 {
2678 true_label = GOTO_DESTINATION (then_);
2679 then_ = NULL;
2680 then_se = false;
2681 }
2682
2683 if (else_
2684 && TREE_CODE (else_) == GOTO_EXPR
2685 && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
2686 {
2687 false_label = GOTO_DESTINATION (else_);
2688 else_ = NULL;
2689 else_se = false;
2690 }
2691
2692 /* If we aren't hijacking a label for the 'then' branch, it falls through. */
2693 if (true_label)
2694 true_label_p = &true_label;
2695 else
2696 true_label_p = NULL;
2697
2698 /* The 'else' branch also needs a label if it contains interesting code. */
2699 if (false_label || else_se)
2700 false_label_p = &false_label;
2701 else
2702 false_label_p = NULL;
2703
2704 /* If there was nothing else in our arms, just forward the label(s). */
2705 if (!then_se && !else_se)
2706 return shortcut_cond_r (pred, true_label_p, false_label_p,
2707 EXPR_HAS_LOCATION (expr)
2708 ? EXPR_LOCATION (expr) : input_location);
2709
2710 /* If our last subexpression already has a terminal label, reuse it. */
2711 if (else_se)
2712 t = expr_last (else_);
2713 else if (then_se)
2714 t = expr_last (then_);
2715 else
2716 t = NULL;
2717 if (t && TREE_CODE (t) == LABEL_EXPR)
2718 end_label = LABEL_EXPR_LABEL (t);
2719
2720 /* If we don't care about jumping to the 'else' branch, jump to the end
2721 if the condition is false. */
2722 if (!false_label_p)
2723 false_label_p = &end_label;
2724
2725 /* We only want to emit these labels if we aren't hijacking them. */
2726 emit_end = (end_label == NULL_TREE);
2727 emit_false = (false_label == NULL_TREE);
2728
2729 /* We only emit the jump over the else clause if we have to--if the
2730 then clause may fall through. Otherwise we can wind up with a
2731 useless jump and a useless label at the end of gimplified code,
2732 which will cause us to think that this conditional as a whole
2733 falls through even if it doesn't. If we then inline a function
2734 which ends with such a condition, that can cause us to issue an
2735 inappropriate warning about control reaching the end of a
2736 non-void function. */
2737 jump_over_else = block_may_fallthru (then_);
2738
2739 pred = shortcut_cond_r (pred, true_label_p, false_label_p,
2740 EXPR_HAS_LOCATION (expr)
2741 ? EXPR_LOCATION (expr) : input_location);
2742
2743 expr = NULL;
2744 append_to_statement_list (pred, &expr);
2745
2746 append_to_statement_list (then_, &expr);
2747 if (else_se)
2748 {
2749 if (jump_over_else)
2750 {
2751 tree last = expr_last (expr);
2752 t = build_and_jump (&end_label);
2753 if (EXPR_HAS_LOCATION (last))
2754 SET_EXPR_LOCATION (t, EXPR_LOCATION (last));
2755 append_to_statement_list (t, &expr);
2756 }
2757 if (emit_false)
2758 {
2759 t = build1 (LABEL_EXPR, void_type_node, false_label);
2760 append_to_statement_list (t, &expr);
2761 }
2762 append_to_statement_list (else_, &expr);
2763 }
2764 if (emit_end && end_label)
2765 {
2766 t = build1 (LABEL_EXPR, void_type_node, end_label);
2767 append_to_statement_list (t, &expr);
2768 }
2769
2770 return expr;
2771 }
2772
2773 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE. */
2774
2775 tree
2776 gimple_boolify (tree expr)
2777 {
2778 tree type = TREE_TYPE (expr);
2779 location_t loc = EXPR_LOCATION (expr);
2780
2781 if (TREE_CODE (expr) == NE_EXPR
2782 && TREE_CODE (TREE_OPERAND (expr, 0)) == CALL_EXPR
2783 && integer_zerop (TREE_OPERAND (expr, 1)))
2784 {
2785 tree call = TREE_OPERAND (expr, 0);
2786 tree fn = get_callee_fndecl (call);
2787
2788 /* For __builtin_expect ((long) (x), y) recurse into x as well
2789 if x is truth_value_p. */
2790 if (fn
2791 && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL
2792 && DECL_FUNCTION_CODE (fn) == BUILT_IN_EXPECT
2793 && call_expr_nargs (call) == 2)
2794 {
2795 tree arg = CALL_EXPR_ARG (call, 0);
2796 if (arg)
2797 {
2798 if (TREE_CODE (arg) == NOP_EXPR
2799 && TREE_TYPE (arg) == TREE_TYPE (call))
2800 arg = TREE_OPERAND (arg, 0);
2801 if (truth_value_p (TREE_CODE (arg)))
2802 {
2803 arg = gimple_boolify (arg);
2804 CALL_EXPR_ARG (call, 0)
2805 = fold_convert_loc (loc, TREE_TYPE (call), arg);
2806 }
2807 }
2808 }
2809 }
2810
2811 if (TREE_CODE (type) == BOOLEAN_TYPE)
2812 return expr;
2813
2814 switch (TREE_CODE (expr))
2815 {
2816 case TRUTH_AND_EXPR:
2817 case TRUTH_OR_EXPR:
2818 case TRUTH_XOR_EXPR:
2819 case TRUTH_ANDIF_EXPR:
2820 case TRUTH_ORIF_EXPR:
2821 /* Also boolify the arguments of truth exprs. */
2822 TREE_OPERAND (expr, 1) = gimple_boolify (TREE_OPERAND (expr, 1));
2823 /* FALLTHRU */
2824
2825 case TRUTH_NOT_EXPR:
2826 TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2827 /* FALLTHRU */
2828
2829 case EQ_EXPR: case NE_EXPR:
2830 case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2831 /* These expressions always produce boolean results. */
2832 TREE_TYPE (expr) = boolean_type_node;
2833 return expr;
2834
2835 default:
2836 /* Other expressions that get here must have boolean values, but
2837 might need to be converted to the appropriate mode. */
2838 return fold_convert_loc (loc, boolean_type_node, expr);
2839 }
2840 }
2841
2842 /* Given a conditional expression *EXPR_P without side effects, gimplify
2843 its operands. New statements are inserted to PRE_P. */
2844
2845 static enum gimplify_status
2846 gimplify_pure_cond_expr (tree *expr_p, gimple_seq *pre_p)
2847 {
2848 tree expr = *expr_p, cond;
2849 enum gimplify_status ret, tret;
2850 enum tree_code code;
2851
2852 cond = gimple_boolify (COND_EXPR_COND (expr));
2853
2854 /* We need to handle && and || specially, as their gimplification
2855 creates pure cond_expr, thus leading to an infinite cycle otherwise. */
2856 code = TREE_CODE (cond);
2857 if (code == TRUTH_ANDIF_EXPR)
2858 TREE_SET_CODE (cond, TRUTH_AND_EXPR);
2859 else if (code == TRUTH_ORIF_EXPR)
2860 TREE_SET_CODE (cond, TRUTH_OR_EXPR);
2861 ret = gimplify_expr (&cond, pre_p, NULL, is_gimple_condexpr, fb_rvalue);
2862 COND_EXPR_COND (*expr_p) = cond;
2863
2864 tret = gimplify_expr (&COND_EXPR_THEN (expr), pre_p, NULL,
2865 is_gimple_val, fb_rvalue);
2866 ret = MIN (ret, tret);
2867 tret = gimplify_expr (&COND_EXPR_ELSE (expr), pre_p, NULL,
2868 is_gimple_val, fb_rvalue);
2869
2870 return MIN (ret, tret);
2871 }
2872
2873 /* Returns true if evaluating EXPR could trap.
2874 EXPR is GENERIC, while tree_could_trap_p can be called
2875 only on GIMPLE. */
2876
2877 static bool
2878 generic_expr_could_trap_p (tree expr)
2879 {
2880 unsigned i, n;
2881
2882 if (!expr || is_gimple_val (expr))
2883 return false;
2884
2885 if (!EXPR_P (expr) || tree_could_trap_p (expr))
2886 return true;
2887
2888 n = TREE_OPERAND_LENGTH (expr);
2889 for (i = 0; i < n; i++)
2890 if (generic_expr_could_trap_p (TREE_OPERAND (expr, i)))
2891 return true;
2892
2893 return false;
2894 }
2895
2896 /* Convert the conditional expression pointed to by EXPR_P '(p) ? a : b;'
2897 into
2898
2899 if (p) if (p)
2900 t1 = a; a;
2901 else or else
2902 t1 = b; b;
2903 t1;
2904
2905 The second form is used when *EXPR_P is of type void.
2906
2907 PRE_P points to the list where side effects that must happen before
2908 *EXPR_P should be stored. */
2909
2910 static enum gimplify_status
2911 gimplify_cond_expr (tree *expr_p, gimple_seq *pre_p, fallback_t fallback)
2912 {
2913 tree expr = *expr_p;
2914 tree type = TREE_TYPE (expr);
2915 location_t loc = EXPR_LOCATION (expr);
2916 tree tmp, arm1, arm2;
2917 enum gimplify_status ret;
2918 tree label_true, label_false, label_cont;
2919 bool have_then_clause_p, have_else_clause_p;
2920 gimple gimple_cond;
2921 enum tree_code pred_code;
2922 gimple_seq seq = NULL;
2923
2924 /* If this COND_EXPR has a value, copy the values into a temporary within
2925 the arms. */
2926 if (!VOID_TYPE_P (type))
2927 {
2928 tree then_ = TREE_OPERAND (expr, 1), else_ = TREE_OPERAND (expr, 2);
2929 tree result;
2930
2931 /* If either an rvalue is ok or we do not require an lvalue, create the
2932 temporary. But we cannot do that if the type is addressable. */
2933 if (((fallback & fb_rvalue) || !(fallback & fb_lvalue))
2934 && !TREE_ADDRESSABLE (type))
2935 {
2936 if (gimplify_ctxp->allow_rhs_cond_expr
2937 /* If either branch has side effects or could trap, it can't be
2938 evaluated unconditionally. */
2939 && !TREE_SIDE_EFFECTS (then_)
2940 && !generic_expr_could_trap_p (then_)
2941 && !TREE_SIDE_EFFECTS (else_)
2942 && !generic_expr_could_trap_p (else_))
2943 return gimplify_pure_cond_expr (expr_p, pre_p);
2944
2945 tmp = create_tmp_var (type, "iftmp");
2946 result = tmp;
2947 }
2948
2949 /* Otherwise, only create and copy references to the values. */
2950 else
2951 {
2952 type = build_pointer_type (type);
2953
2954 if (!VOID_TYPE_P (TREE_TYPE (then_)))
2955 then_ = build_fold_addr_expr_loc (loc, then_);
2956
2957 if (!VOID_TYPE_P (TREE_TYPE (else_)))
2958 else_ = build_fold_addr_expr_loc (loc, else_);
2959
2960 expr
2961 = build3 (COND_EXPR, type, TREE_OPERAND (expr, 0), then_, else_);
2962
2963 tmp = create_tmp_var (type, "iftmp");
2964 result = build_fold_indirect_ref_loc (loc, tmp);
2965 }
2966
2967 /* Build the new then clause, `tmp = then_;'. But don't build the
2968 assignment if the value is void; in C++ it can be if it's a throw. */
2969 if (!VOID_TYPE_P (TREE_TYPE (then_)))
2970 TREE_OPERAND (expr, 1) = build2 (MODIFY_EXPR, type, tmp, then_);
2971
2972 /* Similarly, build the new else clause, `tmp = else_;'. */
2973 if (!VOID_TYPE_P (TREE_TYPE (else_)))
2974 TREE_OPERAND (expr, 2) = build2 (MODIFY_EXPR, type, tmp, else_);
2975
2976 TREE_TYPE (expr) = void_type_node;
2977 recalculate_side_effects (expr);
2978
2979 /* Move the COND_EXPR to the prequeue. */
2980 gimplify_stmt (&expr, pre_p);
2981
2982 *expr_p = result;
2983 return GS_ALL_DONE;
2984 }
2985
2986 /* Make sure the condition has BOOLEAN_TYPE. */
2987 TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2988
2989 /* Break apart && and || conditions. */
2990 if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
2991 || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
2992 {
2993 expr = shortcut_cond_expr (expr);
2994
2995 if (expr != *expr_p)
2996 {
2997 *expr_p = expr;
2998
2999 /* We can't rely on gimplify_expr to re-gimplify the expanded
3000 form properly, as cleanups might cause the target labels to be
3001 wrapped in a TRY_FINALLY_EXPR. To prevent that, we need to
3002 set up a conditional context. */
3003 gimple_push_condition ();
3004 gimplify_stmt (expr_p, &seq);
3005 gimple_pop_condition (pre_p);
3006 gimple_seq_add_seq (pre_p, seq);
3007
3008 return GS_ALL_DONE;
3009 }
3010 }
3011
3012 /* Now do the normal gimplification. */
3013
3014 /* Gimplify condition. */
3015 ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL, is_gimple_condexpr,
3016 fb_rvalue);
3017 if (ret == GS_ERROR)
3018 return GS_ERROR;
3019 gcc_assert (TREE_OPERAND (expr, 0) != NULL_TREE);
3020
3021 gimple_push_condition ();
3022
3023 have_then_clause_p = have_else_clause_p = false;
3024 if (TREE_OPERAND (expr, 1) != NULL
3025 && TREE_CODE (TREE_OPERAND (expr, 1)) == GOTO_EXPR
3026 && TREE_CODE (GOTO_DESTINATION (TREE_OPERAND (expr, 1))) == LABEL_DECL
3027 && (DECL_CONTEXT (GOTO_DESTINATION (TREE_OPERAND (expr, 1)))
3028 == current_function_decl)
3029 /* For -O0 avoid this optimization if the COND_EXPR and GOTO_EXPR
3030 have different locations, otherwise we end up with incorrect
3031 location information on the branches. */
3032 && (optimize
3033 || !EXPR_HAS_LOCATION (expr)
3034 || !EXPR_HAS_LOCATION (TREE_OPERAND (expr, 1))
3035 || EXPR_LOCATION (expr) == EXPR_LOCATION (TREE_OPERAND (expr, 1))))
3036 {
3037 label_true = GOTO_DESTINATION (TREE_OPERAND (expr, 1));
3038 have_then_clause_p = true;
3039 }
3040 else
3041 label_true = create_artificial_label (UNKNOWN_LOCATION);
3042 if (TREE_OPERAND (expr, 2) != NULL
3043 && TREE_CODE (TREE_OPERAND (expr, 2)) == GOTO_EXPR
3044 && TREE_CODE (GOTO_DESTINATION (TREE_OPERAND (expr, 2))) == LABEL_DECL
3045 && (DECL_CONTEXT (GOTO_DESTINATION (TREE_OPERAND (expr, 2)))
3046 == current_function_decl)
3047 /* For -O0 avoid this optimization if the COND_EXPR and GOTO_EXPR
3048 have different locations, otherwise we end up with incorrect
3049 location information on the branches. */
3050 && (optimize
3051 || !EXPR_HAS_LOCATION (expr)
3052 || !EXPR_HAS_LOCATION (TREE_OPERAND (expr, 2))
3053 || EXPR_LOCATION (expr) == EXPR_LOCATION (TREE_OPERAND (expr, 2))))
3054 {
3055 label_false = GOTO_DESTINATION (TREE_OPERAND (expr, 2));
3056 have_else_clause_p = true;
3057 }
3058 else
3059 label_false = create_artificial_label (UNKNOWN_LOCATION);
3060
3061 gimple_cond_get_ops_from_tree (COND_EXPR_COND (expr), &pred_code, &arm1,
3062 &arm2);
3063
3064 gimple_cond = gimple_build_cond (pred_code, arm1, arm2, label_true,
3065 label_false);
3066
3067 gimplify_seq_add_stmt (&seq, gimple_cond);
3068 label_cont = NULL_TREE;
3069 if (!have_then_clause_p)
3070 {
3071 /* For if (...) {} else { code; } put label_true after
3072 the else block. */
3073 if (TREE_OPERAND (expr, 1) == NULL_TREE
3074 && !have_else_clause_p
3075 && TREE_OPERAND (expr, 2) != NULL_TREE)
3076 label_cont = label_true;
3077 else
3078 {
3079 gimplify_seq_add_stmt (&seq, gimple_build_label (label_true));
3080 have_then_clause_p = gimplify_stmt (&TREE_OPERAND (expr, 1), &seq);
3081 /* For if (...) { code; } else {} or
3082 if (...) { code; } else goto label; or
3083 if (...) { code; return; } else { ... }
3084 label_cont isn't needed. */
3085 if (!have_else_clause_p
3086 && TREE_OPERAND (expr, 2) != NULL_TREE
3087 && gimple_seq_may_fallthru (seq))
3088 {
3089 gimple g;
3090 label_cont = create_artificial_label (UNKNOWN_LOCATION);
3091
3092 g = gimple_build_goto (label_cont);
3093
3094 /* GIMPLE_COND's are very low level; they have embedded
3095 gotos. This particular embedded goto should not be marked
3096 with the location of the original COND_EXPR, as it would
3097 correspond to the COND_EXPR's condition, not the ELSE or the
3098 THEN arms. To avoid marking it with the wrong location, flag
3099 it as "no location". */
3100 gimple_set_do_not_emit_location (g);
3101
3102 gimplify_seq_add_stmt (&seq, g);
3103 }
3104 }
3105 }
3106 if (!have_else_clause_p)
3107 {
3108 gimplify_seq_add_stmt (&seq, gimple_build_label (label_false));
3109 have_else_clause_p = gimplify_stmt (&TREE_OPERAND (expr, 2), &seq);
3110 }
3111 if (label_cont)
3112 gimplify_seq_add_stmt (&seq, gimple_build_label (label_cont));
3113
3114 gimple_pop_condition (pre_p);
3115 gimple_seq_add_seq (pre_p, seq);
3116
3117 if (ret == GS_ERROR)
3118 ; /* Do nothing. */
3119 else if (have_then_clause_p || have_else_clause_p)
3120 ret = GS_ALL_DONE;
3121 else
3122 {
3123 /* Both arms are empty; replace the COND_EXPR with its predicate. */
3124 expr = TREE_OPERAND (expr, 0);
3125 gimplify_stmt (&expr, pre_p);
3126 }
3127
3128 *expr_p = NULL;
3129 return ret;
3130 }
3131
3132 /* Prepare the node pointed to by EXPR_P, an is_gimple_addressable expression,
3133 to be marked addressable.
3134
3135 We cannot rely on such an expression being directly markable if a temporary
3136 has been created by the gimplification. In this case, we create another
3137 temporary and initialize it with a copy, which will become a store after we
3138 mark it addressable. This can happen if the front-end passed us something
3139 that it could not mark addressable yet, like a Fortran pass-by-reference
3140 parameter (int) floatvar. */
3141
3142 static void
3143 prepare_gimple_addressable (tree *expr_p, gimple_seq *seq_p)
3144 {
3145 while (handled_component_p (*expr_p))
3146 expr_p = &TREE_OPERAND (*expr_p, 0);
3147 if (is_gimple_reg (*expr_p))
3148 *expr_p = get_initialized_tmp_var (*expr_p, seq_p, NULL);
3149 }
3150
3151 /* A subroutine of gimplify_modify_expr. Replace a MODIFY_EXPR with
3152 a call to __builtin_memcpy. */
3153
3154 static enum gimplify_status
3155 gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value,
3156 gimple_seq *seq_p)
3157 {
3158 tree t, to, to_ptr, from, from_ptr;
3159 gimple gs;
3160 location_t loc = EXPR_LOCATION (*expr_p);
3161
3162 to = TREE_OPERAND (*expr_p, 0);
3163 from = TREE_OPERAND (*expr_p, 1);
3164
3165 /* Mark the RHS addressable. Beware that it may not be possible to do so
3166 directly if a temporary has been created by the gimplification. */
3167 prepare_gimple_addressable (&from, seq_p);
3168
3169 mark_addressable (from);
3170 from_ptr = build_fold_addr_expr_loc (loc, from);
3171 gimplify_arg (&from_ptr, seq_p, loc);
3172
3173 mark_addressable (to);
3174 to_ptr = build_fold_addr_expr_loc (loc, to);
3175 gimplify_arg (&to_ptr, seq_p, loc);
3176
3177 t = implicit_built_in_decls[BUILT_IN_MEMCPY];
3178
3179 gs = gimple_build_call (t, 3, to_ptr, from_ptr, size);
3180
3181 if (want_value)
3182 {
3183 /* tmp = memcpy() */
3184 t = create_tmp_var (TREE_TYPE (to_ptr), NULL);
3185 gimple_call_set_lhs (gs, t);
3186 gimplify_seq_add_stmt (seq_p, gs);
3187
3188 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (to), t);
3189 return GS_ALL_DONE;
3190 }
3191
3192 gimplify_seq_add_stmt (seq_p, gs);
3193 *expr_p = NULL;
3194 return GS_ALL_DONE;
3195 }
3196
3197 /* A subroutine of gimplify_modify_expr. Replace a MODIFY_EXPR with
3198 a call to __builtin_memset. In this case we know that the RHS is
3199 a CONSTRUCTOR with an empty element list. */
3200
3201 static enum gimplify_status
3202 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value,
3203 gimple_seq *seq_p)
3204 {
3205 tree t, from, to, to_ptr;
3206 gimple gs;
3207 location_t loc = EXPR_LOCATION (*expr_p);
3208
3209 /* Assert our assumptions, to abort instead of producing wrong code
3210 silently if they are not met. Beware that the RHS CONSTRUCTOR might
3211 not be immediately exposed. */
3212 from = TREE_OPERAND (*expr_p, 1);
3213 if (TREE_CODE (from) == WITH_SIZE_EXPR)
3214 from = TREE_OPERAND (from, 0);
3215
3216 gcc_assert (TREE_CODE (from) == CONSTRUCTOR
3217 && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (from)));
3218
3219 /* Now proceed. */
3220 to = TREE_OPERAND (*expr_p, 0);
3221
3222 to_ptr = build_fold_addr_expr_loc (loc, to);
3223 gimplify_arg (&to_ptr, seq_p, loc);
3224 t = implicit_built_in_decls[BUILT_IN_MEMSET];
3225
3226 gs = gimple_build_call (t, 3, to_ptr, integer_zero_node, size);
3227
3228 if (want_value)
3229 {
3230 /* tmp = memset() */
3231 t = create_tmp_var (TREE_TYPE (to_ptr), NULL);
3232 gimple_call_set_lhs (gs, t);
3233 gimplify_seq_add_stmt (seq_p, gs);
3234
3235 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (to), t);
3236 return GS_ALL_DONE;
3237 }
3238
3239 gimplify_seq_add_stmt (seq_p, gs);
3240 *expr_p = NULL;
3241 return GS_ALL_DONE;
3242 }
3243
3244 /* A subroutine of gimplify_init_ctor_preeval. Called via walk_tree,
3245 determine, cautiously, if a CONSTRUCTOR overlaps the lhs of an
3246 assignment. Returns non-null if we detect a potential overlap. */
3247
3248 struct gimplify_init_ctor_preeval_data
3249 {
3250 /* The base decl of the lhs object. May be NULL, in which case we
3251 have to assume the lhs is indirect. */
3252 tree lhs_base_decl;
3253
3254 /* The alias set of the lhs object. */
3255 alias_set_type lhs_alias_set;
3256 };
3257
3258 static tree
3259 gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
3260 {
3261 struct gimplify_init_ctor_preeval_data *data
3262 = (struct gimplify_init_ctor_preeval_data *) xdata;
3263 tree t = *tp;
3264
3265 /* If we find the base object, obviously we have overlap. */
3266 if (data->lhs_base_decl == t)
3267 return t;
3268
3269 /* If the constructor component is indirect, determine if we have a
3270 potential overlap with the lhs. The only bits of information we
3271 have to go on at this point are addressability and alias sets. */
3272 if (TREE_CODE (t) == INDIRECT_REF
3273 && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
3274 && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
3275 return t;
3276
3277 /* If the constructor component is a call, determine if it can hide a
3278 potential overlap with the lhs through an INDIRECT_REF like above. */
3279 if (TREE_CODE (t) == CALL_EXPR)
3280 {
3281 tree type, fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (t)));
3282
3283 for (type = TYPE_ARG_TYPES (fntype); type; type = TREE_CHAIN (type))
3284 if (POINTER_TYPE_P (TREE_VALUE (type))
3285 && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
3286 && alias_sets_conflict_p (data->lhs_alias_set,
3287 get_alias_set
3288 (TREE_TYPE (TREE_VALUE (type)))))
3289 return t;
3290 }
3291
3292 if (IS_TYPE_OR_DECL_P (t))
3293 *walk_subtrees = 0;
3294 return NULL;
3295 }
3296
3297 /* A subroutine of gimplify_init_constructor. Pre-evaluate EXPR,
3298 force values that overlap with the lhs (as described by *DATA)
3299 into temporaries. */
3300
3301 static void
3302 gimplify_init_ctor_preeval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
3303 struct gimplify_init_ctor_preeval_data *data)
3304 {
3305 enum gimplify_status one;
3306
3307 /* If the value is constant, then there's nothing to pre-evaluate. */
3308 if (TREE_CONSTANT (*expr_p))
3309 {
3310 /* Ensure it does not have side effects, it might contain a reference to
3311 the object we're initializing. */
3312 gcc_assert (!TREE_SIDE_EFFECTS (*expr_p));
3313 return;
3314 }
3315
3316 /* If the type has non-trivial constructors, we can't pre-evaluate. */
3317 if (TREE_ADDRESSABLE (TREE_TYPE (*expr_p)))
3318 return;
3319
3320 /* Recurse for nested constructors. */
3321 if (TREE_CODE (*expr_p) == CONSTRUCTOR)
3322 {
3323 unsigned HOST_WIDE_INT ix;
3324 constructor_elt *ce;
3325 VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (*expr_p);
3326
3327 for (ix = 0; VEC_iterate (constructor_elt, v, ix, ce); ix++)
3328 gimplify_init_ctor_preeval (&ce->value, pre_p, post_p, data);
3329
3330 return;
3331 }
3332
3333 /* If this is a variable sized type, we must remember the size. */
3334 maybe_with_size_expr (expr_p);
3335
3336 /* Gimplify the constructor element to something appropriate for the rhs
3337 of a MODIFY_EXPR. Given that we know the LHS is an aggregate, we know
3338 the gimplifier will consider this a store to memory. Doing this
3339 gimplification now means that we won't have to deal with complicated
3340 language-specific trees, nor trees like SAVE_EXPR that can induce
3341 exponential search behavior. */
3342 one = gimplify_expr (expr_p, pre_p, post_p, is_gimple_mem_rhs, fb_rvalue);
3343 if (one == GS_ERROR)
3344 {
3345 *expr_p = NULL;
3346 return;
3347 }
3348
3349 /* If we gimplified to a bare decl, we can be sure that it doesn't overlap
3350 with the lhs, since "a = { .x=a }" doesn't make sense. This will
3351 always be true for all scalars, since is_gimple_mem_rhs insists on a
3352 temporary variable for them. */
3353 if (DECL_P (*expr_p))
3354 return;
3355
3356 /* If this is of variable size, we have no choice but to assume it doesn't
3357 overlap since we can't make a temporary for it. */
3358 if (TREE_CODE (TYPE_SIZE (TREE_TYPE (*expr_p))) != INTEGER_CST)
3359 return;
3360
3361 /* Otherwise, we must search for overlap ... */
3362 if (!walk_tree (expr_p, gimplify_init_ctor_preeval_1, data, NULL))
3363 return;
3364
3365 /* ... and if found, force the value into a temporary. */
3366 *expr_p = get_formal_tmp_var (*expr_p, pre_p);
3367 }
3368
3369 /* A subroutine of gimplify_init_ctor_eval. Create a loop for
3370 a RANGE_EXPR in a CONSTRUCTOR for an array.
3371
3372 var = lower;
3373 loop_entry:
3374 object[var] = value;
3375 if (var == upper)
3376 goto loop_exit;
3377 var = var + 1;
3378 goto loop_entry;
3379 loop_exit:
3380
3381 We increment var _after_ the loop exit check because we might otherwise
3382 fail if upper == TYPE_MAX_VALUE (type for upper).
3383
3384 Note that we never have to deal with SAVE_EXPRs here, because this has
3385 already been taken care of for us, in gimplify_init_ctor_preeval(). */
3386
3387 static void gimplify_init_ctor_eval (tree, VEC(constructor_elt,gc) *,
3388 gimple_seq *, bool);
3389
3390 static void
3391 gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
3392 tree value, tree array_elt_type,
3393 gimple_seq *pre_p, bool cleared)
3394 {
3395 tree loop_entry_label, loop_exit_label, fall_thru_label;
3396 tree var, var_type, cref, tmp;
3397
3398 loop_entry_label = create_artificial_label (UNKNOWN_LOCATION);
3399 loop_exit_label = create_artificial_label (UNKNOWN_LOCATION);
3400 fall_thru_label = create_artificial_label (UNKNOWN_LOCATION);
3401
3402 /* Create and initialize the index variable. */
3403 var_type = TREE_TYPE (upper);
3404 var = create_tmp_var (var_type, NULL);
3405 gimplify_seq_add_stmt (pre_p, gimple_build_assign (var, lower));
3406
3407 /* Add the loop entry label. */
3408 gimplify_seq_add_stmt (pre_p, gimple_build_label (loop_entry_label));
3409
3410 /* Build the reference. */
3411 cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3412 var, NULL_TREE, NULL_TREE);
3413
3414 /* If we are a constructor, just call gimplify_init_ctor_eval to do
3415 the store. Otherwise just assign value to the reference. */
3416
3417 if (TREE_CODE (value) == CONSTRUCTOR)
3418 /* NB we might have to call ourself recursively through
3419 gimplify_init_ctor_eval if the value is a constructor. */
3420 gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3421 pre_p, cleared);
3422 else
3423 gimplify_seq_add_stmt (pre_p, gimple_build_assign (cref, value));
3424
3425 /* We exit the loop when the index var is equal to the upper bound. */
3426 gimplify_seq_add_stmt (pre_p,
3427 gimple_build_cond (EQ_EXPR, var, upper,
3428 loop_exit_label, fall_thru_label));
3429
3430 gimplify_seq_add_stmt (pre_p, gimple_build_label (fall_thru_label));
3431
3432 /* Otherwise, increment the index var... */
3433 tmp = build2 (PLUS_EXPR, var_type, var,
3434 fold_convert (var_type, integer_one_node));
3435 gimplify_seq_add_stmt (pre_p, gimple_build_assign (var, tmp));
3436
3437 /* ...and jump back to the loop entry. */
3438 gimplify_seq_add_stmt (pre_p, gimple_build_goto (loop_entry_label));
3439
3440 /* Add the loop exit label. */
3441 gimplify_seq_add_stmt (pre_p, gimple_build_label (loop_exit_label));
3442 }
3443
3444 /* Return true if FDECL is accessing a field that is zero sized. */
3445
3446 static bool
3447 zero_sized_field_decl (const_tree fdecl)
3448 {
3449 if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl)
3450 && integer_zerop (DECL_SIZE (fdecl)))
3451 return true;
3452 return false;
3453 }
3454
3455 /* Return true if TYPE is zero sized. */
3456
3457 static bool
3458 zero_sized_type (const_tree type)
3459 {
3460 if (AGGREGATE_TYPE_P (type) && TYPE_SIZE (type)
3461 && integer_zerop (TYPE_SIZE (type)))
3462 return true;
3463 return false;
3464 }
3465
3466 /* A subroutine of gimplify_init_constructor. Generate individual
3467 MODIFY_EXPRs for a CONSTRUCTOR. OBJECT is the LHS against which the
3468 assignments should happen. ELTS is the CONSTRUCTOR_ELTS of the
3469 CONSTRUCTOR. CLEARED is true if the entire LHS object has been
3470 zeroed first. */
3471
3472 static void
3473 gimplify_init_ctor_eval (tree object, VEC(constructor_elt,gc) *elts,
3474 gimple_seq *pre_p, bool cleared)
3475 {
3476 tree array_elt_type = NULL;
3477 unsigned HOST_WIDE_INT ix;
3478 tree purpose, value;
3479
3480 if (TREE_CODE (TREE_TYPE (object)) == ARRAY_TYPE)
3481 array_elt_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
3482
3483 FOR_EACH_CONSTRUCTOR_ELT (elts, ix, purpose, value)
3484 {
3485 tree cref;
3486
3487 /* NULL values are created above for gimplification errors. */
3488 if (value == NULL)
3489 continue;
3490
3491 if (cleared && initializer_zerop (value))
3492 continue;
3493
3494 /* ??? Here's to hoping the front end fills in all of the indices,
3495 so we don't have to figure out what's missing ourselves. */
3496 gcc_assert (purpose);
3497
3498 /* Skip zero-sized fields, unless value has side-effects. This can
3499 happen with calls to functions returning a zero-sized type, which
3500 we shouldn't discard. As a number of downstream passes don't
3501 expect sets of zero-sized fields, we rely on the gimplification of
3502 the MODIFY_EXPR we make below to drop the assignment statement. */
3503 if (! TREE_SIDE_EFFECTS (value) && zero_sized_field_decl (purpose))
3504 continue;
3505
3506 /* If we have a RANGE_EXPR, we have to build a loop to assign the
3507 whole range. */
3508 if (TREE_CODE (purpose) == RANGE_EXPR)
3509 {
3510 tree lower = TREE_OPERAND (purpose, 0);
3511 tree upper = TREE_OPERAND (purpose, 1);
3512
3513 /* If the lower bound is equal to upper, just treat it as if
3514 upper was the index. */
3515 if (simple_cst_equal (lower, upper))
3516 purpose = upper;
3517 else
3518 {
3519 gimplify_init_ctor_eval_range (object, lower, upper, value,
3520 array_elt_type, pre_p, cleared);
3521 continue;
3522 }
3523 }
3524
3525 if (array_elt_type)
3526 {
3527 /* Do not use bitsizetype for ARRAY_REF indices. */
3528 if (TYPE_DOMAIN (TREE_TYPE (object)))
3529 purpose = fold_convert (TREE_TYPE (TYPE_DOMAIN (TREE_TYPE (object))),
3530 purpose);
3531 cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3532 purpose, NULL_TREE, NULL_TREE);
3533 }
3534 else
3535 {
3536 gcc_assert (TREE_CODE (purpose) == FIELD_DECL);
3537 cref = build3 (COMPONENT_REF, TREE_TYPE (purpose),
3538 unshare_expr (object), purpose, NULL_TREE);
3539 }
3540
3541 if (TREE_CODE (value) == CONSTRUCTOR
3542 && TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE)
3543 gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3544 pre_p, cleared);
3545 else
3546 {
3547 tree init = build2 (INIT_EXPR, TREE_TYPE (cref), cref, value);
3548 gimplify_and_add (init, pre_p);
3549 ggc_free (init);
3550 }
3551 }
3552 }
3553
3554
3555 /* Returns the appropriate RHS predicate for this LHS. */
3556
3557 gimple_predicate
3558 rhs_predicate_for (tree lhs)
3559 {
3560 if (is_gimple_reg (lhs))
3561 return is_gimple_reg_rhs_or_call;
3562 else
3563 return is_gimple_mem_rhs_or_call;
3564 }
3565
3566 /* Gimplify a C99 compound literal expression. This just means adding
3567 the DECL_EXPR before the current statement and using its anonymous
3568 decl instead. */
3569
3570 static enum gimplify_status
3571 gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p)
3572 {
3573 tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (*expr_p);
3574 tree decl = DECL_EXPR_DECL (decl_s);
3575 /* Mark the decl as addressable if the compound literal
3576 expression is addressable now, otherwise it is marked too late
3577 after we gimplify the initialization expression. */
3578 if (TREE_ADDRESSABLE (*expr_p))
3579 TREE_ADDRESSABLE (decl) = 1;
3580
3581 /* Preliminarily mark non-addressed complex variables as eligible
3582 for promotion to gimple registers. We'll transform their uses
3583 as we find them. */
3584 if ((TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE
3585 || TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE)
3586 && !TREE_THIS_VOLATILE (decl)
3587 && !needs_to_live_in_memory (decl))
3588 DECL_GIMPLE_REG_P (decl) = 1;
3589
3590 /* This decl isn't mentioned in the enclosing block, so add it to the
3591 list of temps. FIXME it seems a bit of a kludge to say that
3592 anonymous artificial vars aren't pushed, but everything else is. */
3593 if (DECL_NAME (decl) == NULL_TREE && !DECL_SEEN_IN_BIND_EXPR_P (decl))
3594 gimple_add_tmp_var (decl);
3595
3596 gimplify_and_add (decl_s, pre_p);
3597 *expr_p = decl;
3598 return GS_OK;
3599 }
3600
3601 /* Optimize embedded COMPOUND_LITERAL_EXPRs within a CONSTRUCTOR,
3602 return a new CONSTRUCTOR if something changed. */
3603
3604 static tree
3605 optimize_compound_literals_in_ctor (tree orig_ctor)
3606 {
3607 tree ctor = orig_ctor;
3608 VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (ctor);
3609 unsigned int idx, num = VEC_length (constructor_elt, elts);
3610
3611 for (idx = 0; idx < num; idx++)
3612 {
3613 tree value = VEC_index (constructor_elt, elts, idx)->value;
3614 tree newval = value;
3615 if (TREE_CODE (value) == CONSTRUCTOR)
3616 newval = optimize_compound_literals_in_ctor (value);
3617 else if (TREE_CODE (value) == COMPOUND_LITERAL_EXPR)
3618 {
3619 tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (value);
3620 tree decl = DECL_EXPR_DECL (decl_s);
3621 tree init = DECL_INITIAL (decl);
3622
3623 if (!TREE_ADDRESSABLE (value)
3624 && !TREE_ADDRESSABLE (decl)
3625 && init)
3626 newval = optimize_compound_literals_in_ctor (init);
3627 }
3628 if (newval == value)
3629 continue;
3630
3631 if (ctor == orig_ctor)
3632 {
3633 ctor = copy_node (orig_ctor);
3634 CONSTRUCTOR_ELTS (ctor) = VEC_copy (constructor_elt, gc, elts);
3635 elts = CONSTRUCTOR_ELTS (ctor);
3636 }
3637 VEC_index (constructor_elt, elts, idx)->value = newval;
3638 }
3639 return ctor;
3640 }
3641
3642
3643
3644 /* A subroutine of gimplify_modify_expr. Break out elements of a
3645 CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
3646
3647 Note that we still need to clear any elements that don't have explicit
3648 initializers, so if not all elements are initialized we keep the
3649 original MODIFY_EXPR, we just remove all of the constructor elements.
3650
3651 If NOTIFY_TEMP_CREATION is true, do not gimplify, just return
3652 GS_ERROR if we would have to create a temporary when gimplifying
3653 this constructor. Otherwise, return GS_OK.
3654
3655 If NOTIFY_TEMP_CREATION is false, just do the gimplification. */
3656
3657 static enum gimplify_status
3658 gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
3659 bool want_value, bool notify_temp_creation)
3660 {
3661 tree object, ctor, type;
3662 enum gimplify_status ret;
3663 VEC(constructor_elt,gc) *elts;
3664
3665 gcc_assert (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == CONSTRUCTOR);
3666
3667 if (!notify_temp_creation)
3668 {
3669 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3670 is_gimple_lvalue, fb_lvalue);
3671 if (ret == GS_ERROR)
3672 return ret;
3673 }
3674
3675 object = TREE_OPERAND (*expr_p, 0);
3676 ctor = TREE_OPERAND (*expr_p, 1) =
3677 optimize_compound_literals_in_ctor (TREE_OPERAND (*expr_p, 1));
3678 type = TREE_TYPE (ctor);
3679 elts = CONSTRUCTOR_ELTS (ctor);
3680 ret = GS_ALL_DONE;
3681
3682 switch (TREE_CODE (type))
3683 {
3684 case RECORD_TYPE:
3685 case UNION_TYPE:
3686 case QUAL_UNION_TYPE:
3687 case ARRAY_TYPE:
3688 {
3689 struct gimplify_init_ctor_preeval_data preeval_data;
3690 HOST_WIDE_INT num_type_elements, num_ctor_elements;
3691 HOST_WIDE_INT num_nonzero_elements;
3692 bool cleared, valid_const_initializer;
3693
3694 /* Aggregate types must lower constructors to initialization of
3695 individual elements. The exception is that a CONSTRUCTOR node
3696 with no elements indicates zero-initialization of the whole. */
3697 if (VEC_empty (constructor_elt, elts))
3698 {
3699 if (notify_temp_creation)
3700 return GS_OK;
3701 break;
3702 }
3703
3704 /* Fetch information about the constructor to direct later processing.
3705 We might want to make static versions of it in various cases, and
3706 can only do so if it known to be a valid constant initializer. */
3707 valid_const_initializer
3708 = categorize_ctor_elements (ctor, &num_nonzero_elements,
3709 &num_ctor_elements, &cleared);
3710
3711 /* If a const aggregate variable is being initialized, then it
3712 should never be a lose to promote the variable to be static. */
3713 if (valid_const_initializer
3714 && num_nonzero_elements > 1
3715 && TREE_READONLY (object)
3716 && TREE_CODE (object) == VAR_DECL
3717 && (flag_merge_constants >= 2 || !TREE_ADDRESSABLE (object)))
3718 {
3719 if (notify_temp_creation)
3720 return GS_ERROR;
3721 DECL_INITIAL (object) = ctor;
3722 TREE_STATIC (object) = 1;
3723 if (!DECL_NAME (object))
3724 DECL_NAME (object) = create_tmp_var_name ("C");
3725 walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
3726
3727 /* ??? C++ doesn't automatically append a .<number> to the
3728 assembler name, and even when it does, it looks a FE private
3729 data structures to figure out what that number should be,
3730 which are not set for this variable. I suppose this is
3731 important for local statics for inline functions, which aren't
3732 "local" in the object file sense. So in order to get a unique
3733 TU-local symbol, we must invoke the lhd version now. */
3734 lhd_set_decl_assembler_name (object);
3735
3736 *expr_p = NULL_TREE;
3737 break;
3738 }
3739
3740 /* If there are "lots" of initialized elements, even discounting
3741 those that are not address constants (and thus *must* be
3742 computed at runtime), then partition the constructor into
3743 constant and non-constant parts. Block copy the constant
3744 parts in, then generate code for the non-constant parts. */
3745 /* TODO. There's code in cp/typeck.c to do this. */
3746
3747 num_type_elements = count_type_elements (type, true);
3748
3749 /* If count_type_elements could not determine number of type elements
3750 for a constant-sized object, assume clearing is needed.
3751 Don't do this for variable-sized objects, as store_constructor
3752 will ignore the clearing of variable-sized objects. */
3753 if (num_type_elements < 0 && int_size_in_bytes (type) >= 0)
3754 cleared = true;
3755 /* If there are "lots" of zeros, then block clear the object first. */
3756 else if (num_type_elements - num_nonzero_elements
3757 > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
3758 && num_nonzero_elements < num_type_elements/4)
3759 cleared = true;
3760 /* ??? This bit ought not be needed. For any element not present
3761 in the initializer, we should simply set them to zero. Except
3762 we'd need to *find* the elements that are not present, and that
3763 requires trickery to avoid quadratic compile-time behavior in
3764 large cases or excessive memory use in small cases. */
3765 else if (num_ctor_elements < num_type_elements)
3766 cleared = true;
3767
3768 /* If there are "lots" of initialized elements, and all of them
3769 are valid address constants, then the entire initializer can
3770 be dropped to memory, and then memcpy'd out. Don't do this
3771 for sparse arrays, though, as it's more efficient to follow
3772 the standard CONSTRUCTOR behavior of memset followed by
3773 individual element initialization. Also don't do this for small
3774 all-zero initializers (which aren't big enough to merit
3775 clearing), and don't try to make bitwise copies of
3776 TREE_ADDRESSABLE types. */
3777 if (valid_const_initializer
3778 && !(cleared || num_nonzero_elements == 0)
3779 && !TREE_ADDRESSABLE (type))
3780 {
3781 HOST_WIDE_INT size = int_size_in_bytes (type);
3782 unsigned int align;
3783
3784 /* ??? We can still get unbounded array types, at least
3785 from the C++ front end. This seems wrong, but attempt
3786 to work around it for now. */
3787 if (size < 0)
3788 {
3789 size = int_size_in_bytes (TREE_TYPE (object));
3790 if (size >= 0)
3791 TREE_TYPE (ctor) = type = TREE_TYPE (object);
3792 }
3793
3794 /* Find the maximum alignment we can assume for the object. */
3795 /* ??? Make use of DECL_OFFSET_ALIGN. */
3796 if (DECL_P (object))
3797 align = DECL_ALIGN (object);
3798 else
3799 align = TYPE_ALIGN (type);
3800
3801 if (size > 0
3802 && num_nonzero_elements > 1
3803 && !can_move_by_pieces (size, align))
3804 {
3805 if (notify_temp_creation)
3806 return GS_ERROR;
3807
3808 walk_tree (&ctor, force_labels_r, NULL, NULL);
3809 ctor = tree_output_constant_def (ctor);
3810 if (!useless_type_conversion_p (type, TREE_TYPE (ctor)))
3811 ctor = build1 (VIEW_CONVERT_EXPR, type, ctor);
3812 TREE_OPERAND (*expr_p, 1) = ctor;
3813
3814 /* This is no longer an assignment of a CONSTRUCTOR, but
3815 we still may have processing to do on the LHS. So
3816 pretend we didn't do anything here to let that happen. */
3817 return GS_UNHANDLED;
3818 }
3819 }
3820
3821 /* If the target is volatile and we have non-zero elements
3822 initialize the target from a temporary. */
3823 if (TREE_THIS_VOLATILE (object)
3824 && !TREE_ADDRESSABLE (type)
3825 && num_nonzero_elements > 0)
3826 {
3827 tree temp = create_tmp_var (TYPE_MAIN_VARIANT (type), NULL);
3828 TREE_OPERAND (*expr_p, 0) = temp;
3829 *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p),
3830 *expr_p,
3831 build2 (MODIFY_EXPR, void_type_node,
3832 object, temp));
3833 return GS_OK;
3834 }
3835
3836 if (notify_temp_creation)
3837 return GS_OK;
3838
3839 /* If there are nonzero elements and if needed, pre-evaluate to capture
3840 elements overlapping with the lhs into temporaries. We must do this
3841 before clearing to fetch the values before they are zeroed-out. */
3842 if (num_nonzero_elements > 0 && TREE_CODE (*expr_p) != INIT_EXPR)
3843 {
3844 preeval_data.lhs_base_decl = get_base_address (object);
3845 if (!DECL_P (preeval_data.lhs_base_decl))
3846 preeval_data.lhs_base_decl = NULL;
3847 preeval_data.lhs_alias_set = get_alias_set (object);
3848
3849 gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
3850 pre_p, post_p, &preeval_data);
3851 }
3852
3853 if (cleared)
3854 {
3855 /* Zap the CONSTRUCTOR element list, which simplifies this case.
3856 Note that we still have to gimplify, in order to handle the
3857 case of variable sized types. Avoid shared tree structures. */
3858 CONSTRUCTOR_ELTS (ctor) = NULL;
3859 TREE_SIDE_EFFECTS (ctor) = 0;
3860 object = unshare_expr (object);
3861 gimplify_stmt (expr_p, pre_p);
3862 }
3863
3864 /* If we have not block cleared the object, or if there are nonzero
3865 elements in the constructor, add assignments to the individual
3866 scalar fields of the object. */
3867 if (!cleared || num_nonzero_elements > 0)
3868 gimplify_init_ctor_eval (object, elts, pre_p, cleared);
3869
3870 *expr_p = NULL_TREE;
3871 }
3872 break;
3873
3874 case COMPLEX_TYPE:
3875 {
3876 tree r, i;
3877
3878 if (notify_temp_creation)
3879 return GS_OK;
3880
3881 /* Extract the real and imaginary parts out of the ctor. */
3882 gcc_assert (VEC_length (constructor_elt, elts) == 2);
3883 r = VEC_index (constructor_elt, elts, 0)->value;
3884 i = VEC_index (constructor_elt, elts, 1)->value;
3885 if (r == NULL || i == NULL)
3886 {
3887 tree zero = fold_convert (TREE_TYPE (type), integer_zero_node);
3888 if (r == NULL)
3889 r = zero;
3890 if (i == NULL)
3891 i = zero;
3892 }
3893
3894 /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
3895 represent creation of a complex value. */
3896 if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
3897 {
3898 ctor = build_complex (type, r, i);
3899 TREE_OPERAND (*expr_p, 1) = ctor;
3900 }
3901 else
3902 {
3903 ctor = build2 (COMPLEX_EXPR, type, r, i);
3904 TREE_OPERAND (*expr_p, 1) = ctor;
3905 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1),
3906 pre_p,
3907 post_p,
3908 rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
3909 fb_rvalue);
3910 }
3911 }
3912 break;
3913
3914 case VECTOR_TYPE:
3915 {
3916 unsigned HOST_WIDE_INT ix;
3917 constructor_elt *ce;
3918
3919 if (notify_temp_creation)
3920 return GS_OK;
3921
3922 /* Go ahead and simplify constant constructors to VECTOR_CST. */
3923 if (TREE_CONSTANT (ctor))
3924 {
3925 bool constant_p = true;
3926 tree value;
3927
3928 /* Even when ctor is constant, it might contain non-*_CST
3929 elements, such as addresses or trapping values like
3930 1.0/0.0 - 1.0/0.0. Such expressions don't belong
3931 in VECTOR_CST nodes. */
3932 FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
3933 if (!CONSTANT_CLASS_P (value))
3934 {
3935 constant_p = false;
3936 break;
3937 }
3938
3939 if (constant_p)
3940 {
3941 TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts);
3942 break;
3943 }
3944
3945 /* Don't reduce an initializer constant even if we can't
3946 make a VECTOR_CST. It won't do anything for us, and it'll
3947 prevent us from representing it as a single constant. */
3948 if (initializer_constant_valid_p (ctor, type))
3949 break;
3950
3951 TREE_CONSTANT (ctor) = 0;
3952 }
3953
3954 /* Vector types use CONSTRUCTOR all the way through gimple
3955 compilation as a general initializer. */
3956 for (ix = 0; VEC_iterate (constructor_elt, elts, ix, ce); ix++)
3957 {
3958 enum gimplify_status tret;
3959 tret = gimplify_expr (&ce->value, pre_p, post_p, is_gimple_val,
3960 fb_rvalue);
3961 if (tret == GS_ERROR)
3962 ret = GS_ERROR;
3963 }
3964 if (!is_gimple_reg (TREE_OPERAND (*expr_p, 0)))
3965 TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (ctor, pre_p);
3966 }
3967 break;
3968
3969 default:
3970 /* So how did we get a CONSTRUCTOR for a scalar type? */
3971 gcc_unreachable ();
3972 }
3973
3974 if (ret == GS_ERROR)
3975 return GS_ERROR;
3976 else if (want_value)
3977 {
3978 *expr_p = object;
3979 return GS_OK;
3980 }
3981 else
3982 {
3983 /* If we have gimplified both sides of the initializer but have
3984 not emitted an assignment, do so now. */
3985 if (*expr_p)
3986 {
3987 tree lhs = TREE_OPERAND (*expr_p, 0);
3988 tree rhs = TREE_OPERAND (*expr_p, 1);
3989 gimple init = gimple_build_assign (lhs, rhs);
3990 gimplify_seq_add_stmt (pre_p, init);
3991 *expr_p = NULL;
3992 }
3993
3994 return GS_ALL_DONE;
3995 }
3996 }
3997
3998 /* Given a pointer value OP0, return a simplified version of an
3999 indirection through OP0, or NULL_TREE if no simplification is
4000 possible. Note that the resulting type may be different from
4001 the type pointed to in the sense that it is still compatible
4002 from the langhooks point of view. */
4003
4004 tree
4005 gimple_fold_indirect_ref (tree t)
4006 {
4007 tree type = TREE_TYPE (TREE_TYPE (t));
4008 tree sub = t;
4009 tree subtype;
4010
4011 STRIP_NOPS (sub);
4012 subtype = TREE_TYPE (sub);
4013 if (!POINTER_TYPE_P (subtype))
4014 return NULL_TREE;
4015
4016 if (TREE_CODE (sub) == ADDR_EXPR)
4017 {
4018 tree op = TREE_OPERAND (sub, 0);
4019 tree optype = TREE_TYPE (op);
4020 /* *&p => p */
4021 if (useless_type_conversion_p (type, optype))
4022 return op;
4023
4024 /* *(foo *)&fooarray => fooarray[0] */
4025 if (TREE_CODE (optype) == ARRAY_TYPE
4026 && TREE_CODE (TYPE_SIZE (TREE_TYPE (optype))) == INTEGER_CST
4027 && useless_type_conversion_p (type, TREE_TYPE (optype)))
4028 {
4029 tree type_domain = TYPE_DOMAIN (optype);
4030 tree min_val = size_zero_node;
4031 if (type_domain && TYPE_MIN_VALUE (type_domain))
4032 min_val = TYPE_MIN_VALUE (type_domain);
4033 if (TREE_CODE (min_val) == INTEGER_CST)
4034 return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
4035 }
4036 /* *(foo *)&complexfoo => __real__ complexfoo */
4037 else if (TREE_CODE (optype) == COMPLEX_TYPE
4038 && useless_type_conversion_p (type, TREE_TYPE (optype)))
4039 return fold_build1 (REALPART_EXPR, type, op);
4040 /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
4041 else if (TREE_CODE (optype) == VECTOR_TYPE
4042 && useless_type_conversion_p (type, TREE_TYPE (optype)))
4043 {
4044 tree part_width = TYPE_SIZE (type);
4045 tree index = bitsize_int (0);
4046 return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
4047 }
4048 }
4049
4050 /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
4051 if (TREE_CODE (sub) == POINTER_PLUS_EXPR
4052 && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
4053 {
4054 tree op00 = TREE_OPERAND (sub, 0);
4055 tree op01 = TREE_OPERAND (sub, 1);
4056 tree op00type;
4057
4058 STRIP_NOPS (op00);
4059 op00type = TREE_TYPE (op00);
4060 if (TREE_CODE (op00) == ADDR_EXPR
4061 && TREE_CODE (TREE_TYPE (op00type)) == VECTOR_TYPE
4062 && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (op00type))))
4063 {
4064 HOST_WIDE_INT offset = tree_low_cst (op01, 0);
4065 tree part_width = TYPE_SIZE (type);
4066 unsigned HOST_WIDE_INT part_widthi
4067 = tree_low_cst (part_width, 0) / BITS_PER_UNIT;
4068 unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
4069 tree index = bitsize_int (indexi);
4070 if (offset / part_widthi
4071 <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (op00type)))
4072 return fold_build3 (BIT_FIELD_REF, type, TREE_OPERAND (op00, 0),
4073 part_width, index);
4074 }
4075 }
4076
4077 /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
4078 if (TREE_CODE (sub) == POINTER_PLUS_EXPR
4079 && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
4080 {
4081 tree op00 = TREE_OPERAND (sub, 0);
4082 tree op01 = TREE_OPERAND (sub, 1);
4083 tree op00type;
4084
4085 STRIP_NOPS (op00);
4086 op00type = TREE_TYPE (op00);
4087 if (TREE_CODE (op00) == ADDR_EXPR
4088 && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
4089 && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (op00type))))
4090 {
4091 tree size = TYPE_SIZE_UNIT (type);
4092 if (tree_int_cst_equal (size, op01))
4093 return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
4094 }
4095 }
4096
4097 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
4098 if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
4099 && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (subtype)))) == INTEGER_CST
4100 && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (subtype))))
4101 {
4102 tree type_domain;
4103 tree min_val = size_zero_node;
4104 tree osub = sub;
4105 sub = gimple_fold_indirect_ref (sub);
4106 if (! sub)
4107 sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), osub);
4108 type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
4109 if (type_domain && TYPE_MIN_VALUE (type_domain))
4110 min_val = TYPE_MIN_VALUE (type_domain);
4111 if (TREE_CODE (min_val) == INTEGER_CST)
4112 return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
4113 }
4114
4115 return NULL_TREE;
4116 }
4117
4118 /* Given a pointer value OP0, return a simplified version of an
4119 indirection through OP0, or NULL_TREE if no simplification is
4120 possible. This may only be applied to a rhs of an expression.
4121 Note that the resulting type may be different from the type pointed
4122 to in the sense that it is still compatible from the langhooks
4123 point of view. */
4124
4125 static tree
4126 gimple_fold_indirect_ref_rhs (tree t)
4127 {
4128 return gimple_fold_indirect_ref (t);
4129 }
4130
4131 /* Subroutine of gimplify_modify_expr to do simplifications of
4132 MODIFY_EXPRs based on the code of the RHS. We loop for as long as
4133 something changes. */
4134
4135 static enum gimplify_status
4136 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
4137 gimple_seq *pre_p, gimple_seq *post_p,
4138 bool want_value)
4139 {
4140 enum gimplify_status ret = GS_UNHANDLED;
4141 bool changed;
4142
4143 do
4144 {
4145 changed = false;
4146 switch (TREE_CODE (*from_p))
4147 {
4148 case VAR_DECL:
4149 /* If we're assigning from a read-only variable initialized with
4150 a constructor, do the direct assignment from the constructor,
4151 but only if neither source nor target are volatile since this
4152 latter assignment might end up being done on a per-field basis. */
4153 if (DECL_INITIAL (*from_p)
4154 && TREE_READONLY (*from_p)
4155 && !TREE_THIS_VOLATILE (*from_p)
4156 && !TREE_THIS_VOLATILE (*to_p)
4157 && TREE_CODE (DECL_INITIAL (*from_p)) == CONSTRUCTOR)
4158 {
4159 tree old_from = *from_p;
4160 enum gimplify_status subret;
4161
4162 /* Move the constructor into the RHS. */
4163 *from_p = unshare_expr (DECL_INITIAL (*from_p));
4164
4165 /* Let's see if gimplify_init_constructor will need to put
4166 it in memory. */
4167 subret = gimplify_init_constructor (expr_p, NULL, NULL,
4168 false, true);
4169 if (subret == GS_ERROR)
4170 {
4171 /* If so, revert the change. */
4172 *from_p = old_from;
4173 }
4174 else
4175 {
4176 ret = GS_OK;
4177 changed = true;
4178 }
4179 }
4180 break;
4181 case INDIRECT_REF:
4182 {
4183 /* If we have code like
4184
4185 *(const A*)(A*)&x
4186
4187 where the type of "x" is a (possibly cv-qualified variant
4188 of "A"), treat the entire expression as identical to "x".
4189 This kind of code arises in C++ when an object is bound
4190 to a const reference, and if "x" is a TARGET_EXPR we want
4191 to take advantage of the optimization below. */
4192 tree t = gimple_fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
4193 if (t)
4194 {
4195 *from_p = t;
4196 ret = GS_OK;
4197 changed = true;
4198 }
4199 break;
4200 }
4201
4202 case TARGET_EXPR:
4203 {
4204 /* If we are initializing something from a TARGET_EXPR, strip the
4205 TARGET_EXPR and initialize it directly, if possible. This can't
4206 be done if the initializer is void, since that implies that the
4207 temporary is set in some non-trivial way.
4208
4209 ??? What about code that pulls out the temp and uses it
4210 elsewhere? I think that such code never uses the TARGET_EXPR as
4211 an initializer. If I'm wrong, we'll die because the temp won't
4212 have any RTL. In that case, I guess we'll need to replace
4213 references somehow. */
4214 tree init = TARGET_EXPR_INITIAL (*from_p);
4215
4216 if (init
4217 && !VOID_TYPE_P (TREE_TYPE (init)))
4218 {
4219 *from_p = init;
4220 ret = GS_OK;
4221 changed = true;
4222 }
4223 }
4224 break;
4225
4226 case COMPOUND_EXPR:
4227 /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
4228 caught. */
4229 gimplify_compound_expr (from_p, pre_p, true);
4230 ret = GS_OK;
4231 changed = true;
4232 break;
4233
4234 case CONSTRUCTOR:
4235 /* If we're initializing from a CONSTRUCTOR, break this into
4236 individual MODIFY_EXPRs. */
4237 return gimplify_init_constructor (expr_p, pre_p, post_p, want_value,
4238 false);
4239
4240 case COND_EXPR:
4241 /* If we're assigning to a non-register type, push the assignment
4242 down into the branches. This is mandatory for ADDRESSABLE types,
4243 since we cannot generate temporaries for such, but it saves a
4244 copy in other cases as well. */
4245 if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
4246 {
4247 /* This code should mirror the code in gimplify_cond_expr. */
4248 enum tree_code code = TREE_CODE (*expr_p);
4249 tree cond = *from_p;
4250 tree result = *to_p;
4251
4252 ret = gimplify_expr (&result, pre_p, post_p,
4253 is_gimple_lvalue, fb_lvalue);
4254 if (ret != GS_ERROR)
4255 ret = GS_OK;
4256
4257 if (TREE_TYPE (TREE_OPERAND (cond, 1)) != void_type_node)
4258 TREE_OPERAND (cond, 1)
4259 = build2 (code, void_type_node, result,
4260 TREE_OPERAND (cond, 1));
4261 if (TREE_TYPE (TREE_OPERAND (cond, 2)) != void_type_node)
4262 TREE_OPERAND (cond, 2)
4263 = build2 (code, void_type_node, unshare_expr (result),
4264 TREE_OPERAND (cond, 2));
4265
4266 TREE_TYPE (cond) = void_type_node;
4267 recalculate_side_effects (cond);
4268
4269 if (want_value)
4270 {
4271 gimplify_and_add (cond, pre_p);
4272 *expr_p = unshare_expr (result);
4273 }
4274 else
4275 *expr_p = cond;
4276 return ret;
4277 }
4278 break;
4279
4280 case CALL_EXPR:
4281 /* For calls that return in memory, give *to_p as the CALL_EXPR's
4282 return slot so that we don't generate a temporary. */
4283 if (!CALL_EXPR_RETURN_SLOT_OPT (*from_p)
4284 && aggregate_value_p (*from_p, *from_p))
4285 {
4286 bool use_target;
4287
4288 if (!(rhs_predicate_for (*to_p))(*from_p))
4289 /* If we need a temporary, *to_p isn't accurate. */
4290 use_target = false;
4291 else if (TREE_CODE (*to_p) == RESULT_DECL
4292 && DECL_NAME (*to_p) == NULL_TREE
4293 && needs_to_live_in_memory (*to_p))
4294 /* It's OK to use the return slot directly unless it's an NRV. */
4295 use_target = true;
4296 else if (is_gimple_reg_type (TREE_TYPE (*to_p))
4297 || (DECL_P (*to_p) && DECL_REGISTER (*to_p)))
4298 /* Don't force regs into memory. */
4299 use_target = false;
4300 else if (TREE_CODE (*expr_p) == INIT_EXPR)
4301 /* It's OK to use the target directly if it's being
4302 initialized. */
4303 use_target = true;
4304 else if (!is_gimple_non_addressable (*to_p))
4305 /* Don't use the original target if it's already addressable;
4306 if its address escapes, and the called function uses the
4307 NRV optimization, a conforming program could see *to_p
4308 change before the called function returns; see c++/19317.
4309 When optimizing, the return_slot pass marks more functions
4310 as safe after we have escape info. */
4311 use_target = false;
4312 else
4313 use_target = true;
4314
4315 if (use_target)
4316 {
4317 CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
4318 mark_addressable (*to_p);
4319 }
4320 }
4321 break;
4322
4323 case WITH_SIZE_EXPR:
4324 /* Likewise for calls that return an aggregate of non-constant size,
4325 since we would not be able to generate a temporary at all. */
4326 if (TREE_CODE (TREE_OPERAND (*from_p, 0)) == CALL_EXPR)
4327 {
4328 *from_p = TREE_OPERAND (*from_p, 0);
4329 /* We don't change ret in this case because the
4330 WITH_SIZE_EXPR might have been added in
4331 gimplify_modify_expr, so returning GS_OK would lead to an
4332 infinite loop. */
4333 changed = true;
4334 }
4335 break;
4336
4337 /* If we're initializing from a container, push the initialization
4338 inside it. */
4339 case CLEANUP_POINT_EXPR:
4340 case BIND_EXPR:
4341 case STATEMENT_LIST:
4342 {
4343 tree wrap = *from_p;
4344 tree t;
4345
4346 ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_min_lval,
4347 fb_lvalue);
4348 if (ret != GS_ERROR)
4349 ret = GS_OK;
4350
4351 t = voidify_wrapper_expr (wrap, *expr_p);
4352 gcc_assert (t == *expr_p);
4353
4354 if (want_value)
4355 {
4356 gimplify_and_add (wrap, pre_p);
4357 *expr_p = unshare_expr (*to_p);
4358 }
4359 else
4360 *expr_p = wrap;
4361 return GS_OK;
4362 }
4363
4364 case COMPOUND_LITERAL_EXPR:
4365 {
4366 tree complit = TREE_OPERAND (*expr_p, 1);
4367 tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (complit);
4368 tree decl = DECL_EXPR_DECL (decl_s);
4369 tree init = DECL_INITIAL (decl);
4370
4371 /* struct T x = (struct T) { 0, 1, 2 } can be optimized
4372 into struct T x = { 0, 1, 2 } if the address of the
4373 compound literal has never been taken. */
4374 if (!TREE_ADDRESSABLE (complit)
4375 && !TREE_ADDRESSABLE (decl)
4376 && init)
4377 {
4378 *expr_p = copy_node (*expr_p);
4379 TREE_OPERAND (*expr_p, 1) = init;
4380 return GS_OK;
4381 }
4382 }
4383
4384 default:
4385 break;
4386 }
4387 }
4388 while (changed);
4389
4390 return ret;
4391 }
4392
4393
4394 /* Promote partial stores to COMPLEX variables to total stores. *EXPR_P is
4395 a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
4396 DECL_GIMPLE_REG_P set.
4397
4398 IMPORTANT NOTE: This promotion is performed by introducing a load of the
4399 other, unmodified part of the complex object just before the total store.
4400 As a consequence, if the object is still uninitialized, an undefined value
4401 will be loaded into a register, which may result in a spurious exception
4402 if the register is floating-point and the value happens to be a signaling
4403 NaN for example. Then the fully-fledged complex operations lowering pass
4404 followed by a DCE pass are necessary in order to fix things up. */
4405
4406 static enum gimplify_status
4407 gimplify_modify_expr_complex_part (tree *expr_p, gimple_seq *pre_p,
4408 bool want_value)
4409 {
4410 enum tree_code code, ocode;
4411 tree lhs, rhs, new_rhs, other, realpart, imagpart;
4412
4413 lhs = TREE_OPERAND (*expr_p, 0);
4414 rhs = TREE_OPERAND (*expr_p, 1);
4415 code = TREE_CODE (lhs);
4416 lhs = TREE_OPERAND (lhs, 0);
4417
4418 ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
4419 other = build1 (ocode, TREE_TYPE (rhs), lhs);
4420 other = get_formal_tmp_var (other, pre_p);
4421
4422 realpart = code == REALPART_EXPR ? rhs : other;
4423 imagpart = code == REALPART_EXPR ? other : rhs;
4424
4425 if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
4426 new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
4427 else
4428 new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
4429
4430 gimplify_seq_add_stmt (pre_p, gimple_build_assign (lhs, new_rhs));
4431 *expr_p = (want_value) ? rhs : NULL_TREE;
4432
4433 return GS_ALL_DONE;
4434 }
4435
4436
4437 /* Gimplify the MODIFY_EXPR node pointed to by EXPR_P.
4438
4439 modify_expr
4440 : varname '=' rhs
4441 | '*' ID '=' rhs
4442
4443 PRE_P points to the list where side effects that must happen before
4444 *EXPR_P should be stored.
4445
4446 POST_P points to the list where side effects that must happen after
4447 *EXPR_P should be stored.
4448
4449 WANT_VALUE is nonzero iff we want to use the value of this expression
4450 in another expression. */
4451
4452 static enum gimplify_status
4453 gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
4454 bool want_value)
4455 {
4456 tree *from_p = &TREE_OPERAND (*expr_p, 1);
4457 tree *to_p = &TREE_OPERAND (*expr_p, 0);
4458 enum gimplify_status ret = GS_UNHANDLED;
4459 gimple assign;
4460 location_t loc = EXPR_LOCATION (*expr_p);
4461
4462 gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
4463 || TREE_CODE (*expr_p) == INIT_EXPR);
4464
4465 /* Insert pointer conversions required by the middle-end that are not
4466 required by the frontend. This fixes middle-end type checking for
4467 for example gcc.dg/redecl-6.c. */
4468 if (POINTER_TYPE_P (TREE_TYPE (*to_p)))
4469 {
4470 STRIP_USELESS_TYPE_CONVERSION (*from_p);
4471 if (!useless_type_conversion_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p)))
4472 *from_p = fold_convert_loc (loc, TREE_TYPE (*to_p), *from_p);
4473 }
4474
4475 /* See if any simplifications can be done based on what the RHS is. */
4476 ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4477 want_value);
4478 if (ret != GS_UNHANDLED)
4479 return ret;
4480
4481 /* For zero sized types only gimplify the left hand side and right hand
4482 side as statements and throw away the assignment. Do this after
4483 gimplify_modify_expr_rhs so we handle TARGET_EXPRs of addressable
4484 types properly. */
4485 if (zero_sized_type (TREE_TYPE (*from_p)) && !want_value)
4486 {
4487 gimplify_stmt (from_p, pre_p);
4488 gimplify_stmt (to_p, pre_p);
4489 *expr_p = NULL_TREE;
4490 return GS_ALL_DONE;
4491 }
4492
4493 /* If the value being copied is of variable width, compute the length
4494 of the copy into a WITH_SIZE_EXPR. Note that we need to do this
4495 before gimplifying any of the operands so that we can resolve any
4496 PLACEHOLDER_EXPRs in the size. Also note that the RTL expander uses
4497 the size of the expression to be copied, not of the destination, so
4498 that is what we must do here. */
4499 maybe_with_size_expr (from_p);
4500
4501 ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
4502 if (ret == GS_ERROR)
4503 return ret;
4504
4505 /* As a special case, we have to temporarily allow for assignments
4506 with a CALL_EXPR on the RHS. Since in GIMPLE a function call is
4507 a toplevel statement, when gimplifying the GENERIC expression
4508 MODIFY_EXPR <a, CALL_EXPR <foo>>, we cannot create the tuple
4509 GIMPLE_ASSIGN <a, GIMPLE_CALL <foo>>.
4510
4511 Instead, we need to create the tuple GIMPLE_CALL <a, foo>. To
4512 prevent gimplify_expr from trying to create a new temporary for
4513 foo's LHS, we tell it that it should only gimplify until it
4514 reaches the CALL_EXPR. On return from gimplify_expr, the newly
4515 created GIMPLE_CALL <foo> will be the last statement in *PRE_P
4516 and all we need to do here is set 'a' to be its LHS. */
4517 ret = gimplify_expr (from_p, pre_p, post_p, rhs_predicate_for (*to_p),
4518 fb_rvalue);
4519 if (ret == GS_ERROR)
4520 return ret;
4521
4522 /* Now see if the above changed *from_p to something we handle specially. */
4523 ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4524 want_value);
4525 if (ret != GS_UNHANDLED)
4526 return ret;
4527
4528 /* If we've got a variable sized assignment between two lvalues (i.e. does
4529 not involve a call), then we can make things a bit more straightforward
4530 by converting the assignment to memcpy or memset. */
4531 if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
4532 {
4533 tree from = TREE_OPERAND (*from_p, 0);
4534 tree size = TREE_OPERAND (*from_p, 1);
4535
4536 if (TREE_CODE (from) == CONSTRUCTOR)
4537 return gimplify_modify_expr_to_memset (expr_p, size, want_value, pre_p);
4538
4539 if (is_gimple_addressable (from))
4540 {
4541 *from_p = from;
4542 return gimplify_modify_expr_to_memcpy (expr_p, size, want_value,
4543 pre_p);
4544 }
4545 }
4546
4547 /* Transform partial stores to non-addressable complex variables into
4548 total stores. This allows us to use real instead of virtual operands
4549 for these variables, which improves optimization. */
4550 if ((TREE_CODE (*to_p) == REALPART_EXPR
4551 || TREE_CODE (*to_p) == IMAGPART_EXPR)
4552 && is_gimple_reg (TREE_OPERAND (*to_p, 0)))
4553 return gimplify_modify_expr_complex_part (expr_p, pre_p, want_value);
4554
4555 /* Try to alleviate the effects of the gimplification creating artificial
4556 temporaries (see for example is_gimple_reg_rhs) on the debug info. */
4557 if (!gimplify_ctxp->into_ssa
4558 && DECL_P (*from_p)
4559 && DECL_IGNORED_P (*from_p)
4560 && DECL_P (*to_p)
4561 && !DECL_IGNORED_P (*to_p))
4562 {
4563 if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
4564 DECL_NAME (*from_p)
4565 = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
4566 DECL_DEBUG_EXPR_IS_FROM (*from_p) = 1;
4567 SET_DECL_DEBUG_EXPR (*from_p, *to_p);
4568 }
4569
4570 if (TREE_CODE (*from_p) == CALL_EXPR)
4571 {
4572 /* Since the RHS is a CALL_EXPR, we need to create a GIMPLE_CALL
4573 instead of a GIMPLE_ASSIGN. */
4574 assign = gimple_build_call_from_tree (*from_p);
4575 if (!gimple_call_noreturn_p (assign))
4576 gimple_call_set_lhs (assign, *to_p);
4577 }
4578 else
4579 {
4580 assign = gimple_build_assign (*to_p, *from_p);
4581 gimple_set_location (assign, EXPR_LOCATION (*expr_p));
4582 }
4583
4584 gimplify_seq_add_stmt (pre_p, assign);
4585
4586 if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
4587 {
4588 /* If we've somehow already got an SSA_NAME on the LHS, then
4589 we've probably modified it twice. Not good. */
4590 gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
4591 *to_p = make_ssa_name (*to_p, assign);
4592 gimple_set_lhs (assign, *to_p);
4593 }
4594
4595 if (want_value)
4596 {
4597 *expr_p = unshare_expr (*to_p);
4598 return GS_OK;
4599 }
4600 else
4601 *expr_p = NULL;
4602
4603 return GS_ALL_DONE;
4604 }
4605
4606 /* Gimplify a comparison between two variable-sized objects. Do this
4607 with a call to BUILT_IN_MEMCMP. */
4608
4609 static enum gimplify_status
4610 gimplify_variable_sized_compare (tree *expr_p)
4611 {
4612 tree op0 = TREE_OPERAND (*expr_p, 0);
4613 tree op1 = TREE_OPERAND (*expr_p, 1);
4614 tree t, arg, dest, src;
4615 location_t loc = EXPR_LOCATION (*expr_p);
4616
4617 arg = TYPE_SIZE_UNIT (TREE_TYPE (op0));
4618 arg = unshare_expr (arg);
4619 arg = SUBSTITUTE_PLACEHOLDER_IN_EXPR (arg, op0);
4620 src = build_fold_addr_expr_loc (loc, op1);
4621 dest = build_fold_addr_expr_loc (loc, op0);
4622 t = implicit_built_in_decls[BUILT_IN_MEMCMP];
4623 t = build_call_expr_loc (loc, t, 3, dest, src, arg);
4624 *expr_p
4625 = build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
4626
4627 return GS_OK;
4628 }
4629
4630 /* Gimplify a comparison between two aggregate objects of integral scalar
4631 mode as a comparison between the bitwise equivalent scalar values. */
4632
4633 static enum gimplify_status
4634 gimplify_scalar_mode_aggregate_compare (tree *expr_p)
4635 {
4636 location_t loc = EXPR_LOCATION (*expr_p);
4637 tree op0 = TREE_OPERAND (*expr_p, 0);
4638 tree op1 = TREE_OPERAND (*expr_p, 1);
4639
4640 tree type = TREE_TYPE (op0);
4641 tree scalar_type = lang_hooks.types.type_for_mode (TYPE_MODE (type), 1);
4642
4643 op0 = fold_build1_loc (loc, VIEW_CONVERT_EXPR, scalar_type, op0);
4644 op1 = fold_build1_loc (loc, VIEW_CONVERT_EXPR, scalar_type, op1);
4645
4646 *expr_p
4647 = fold_build2_loc (loc, TREE_CODE (*expr_p), TREE_TYPE (*expr_p), op0, op1);
4648
4649 return GS_OK;
4650 }
4651
4652 /* Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions. EXPR_P
4653 points to the expression to gimplify.
4654
4655 Expressions of the form 'a && b' are gimplified to:
4656
4657 a && b ? true : false
4658
4659 LOCUS is the source location to be put on the generated COND_EXPR.
4660 gimplify_cond_expr will do the rest. */
4661
4662 static enum gimplify_status
4663 gimplify_boolean_expr (tree *expr_p, location_t locus)
4664 {
4665 /* Preserve the original type of the expression. */
4666 tree type = TREE_TYPE (*expr_p);
4667
4668 *expr_p = build3 (COND_EXPR, type, *expr_p,
4669 fold_convert_loc (locus, type, boolean_true_node),
4670 fold_convert_loc (locus, type, boolean_false_node));
4671
4672 SET_EXPR_LOCATION (*expr_p, locus);
4673
4674 return GS_OK;
4675 }
4676
4677 /* Gimplifies an expression sequence. This function gimplifies each
4678 expression and re-writes the original expression with the last
4679 expression of the sequence in GIMPLE form.
4680
4681 PRE_P points to the list where the side effects for all the
4682 expressions in the sequence will be emitted.
4683
4684 WANT_VALUE is true when the result of the last COMPOUND_EXPR is used. */
4685
4686 static enum gimplify_status
4687 gimplify_compound_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
4688 {
4689 tree t = *expr_p;
4690
4691 do
4692 {
4693 tree *sub_p = &TREE_OPERAND (t, 0);
4694
4695 if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
4696 gimplify_compound_expr (sub_p, pre_p, false);
4697 else
4698 gimplify_stmt (sub_p, pre_p);
4699
4700 t = TREE_OPERAND (t, 1);
4701 }
4702 while (TREE_CODE (t) == COMPOUND_EXPR);
4703
4704 *expr_p = t;
4705 if (want_value)
4706 return GS_OK;
4707 else
4708 {
4709 gimplify_stmt (expr_p, pre_p);
4710 return GS_ALL_DONE;
4711 }
4712 }
4713
4714
4715 /* Gimplify a SAVE_EXPR node. EXPR_P points to the expression to
4716 gimplify. After gimplification, EXPR_P will point to a new temporary
4717 that holds the original value of the SAVE_EXPR node.
4718
4719 PRE_P points to the list where side effects that must happen before
4720 *EXPR_P should be stored. */
4721
4722 static enum gimplify_status
4723 gimplify_save_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4724 {
4725 enum gimplify_status ret = GS_ALL_DONE;
4726 tree val;
4727
4728 gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
4729 val = TREE_OPERAND (*expr_p, 0);
4730
4731 /* If the SAVE_EXPR has not been resolved, then evaluate it once. */
4732 if (!SAVE_EXPR_RESOLVED_P (*expr_p))
4733 {
4734 /* The operand may be a void-valued expression such as SAVE_EXPRs
4735 generated by the Java frontend for class initialization. It is
4736 being executed only for its side-effects. */
4737 if (TREE_TYPE (val) == void_type_node)
4738 {
4739 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4740 is_gimple_stmt, fb_none);
4741 val = NULL;
4742 }
4743 else
4744 val = get_initialized_tmp_var (val, pre_p, post_p);
4745
4746 TREE_OPERAND (*expr_p, 0) = val;
4747 SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
4748 }
4749
4750 *expr_p = val;
4751
4752 return ret;
4753 }
4754
4755 /* Re-write the ADDR_EXPR node pointed to by EXPR_P
4756
4757 unary_expr
4758 : ...
4759 | '&' varname
4760 ...
4761
4762 PRE_P points to the list where side effects that must happen before
4763 *EXPR_P should be stored.
4764
4765 POST_P points to the list where side effects that must happen after
4766 *EXPR_P should be stored. */
4767
4768 static enum gimplify_status
4769 gimplify_addr_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4770 {
4771 tree expr = *expr_p;
4772 tree op0 = TREE_OPERAND (expr, 0);
4773 enum gimplify_status ret;
4774 location_t loc = EXPR_LOCATION (*expr_p);
4775
4776 switch (TREE_CODE (op0))
4777 {
4778 case INDIRECT_REF:
4779 case MISALIGNED_INDIRECT_REF:
4780 do_indirect_ref:
4781 /* Check if we are dealing with an expression of the form '&*ptr'.
4782 While the front end folds away '&*ptr' into 'ptr', these
4783 expressions may be generated internally by the compiler (e.g.,
4784 builtins like __builtin_va_end). */
4785 /* Caution: the silent array decomposition semantics we allow for
4786 ADDR_EXPR means we can't always discard the pair. */
4787 /* Gimplification of the ADDR_EXPR operand may drop
4788 cv-qualification conversions, so make sure we add them if
4789 needed. */
4790 {
4791 tree op00 = TREE_OPERAND (op0, 0);
4792 tree t_expr = TREE_TYPE (expr);
4793 tree t_op00 = TREE_TYPE (op00);
4794
4795 if (!useless_type_conversion_p (t_expr, t_op00))
4796 op00 = fold_convert_loc (loc, TREE_TYPE (expr), op00);
4797 *expr_p = op00;
4798 ret = GS_OK;
4799 }
4800 break;
4801
4802 case VIEW_CONVERT_EXPR:
4803 /* Take the address of our operand and then convert it to the type of
4804 this ADDR_EXPR.
4805
4806 ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
4807 all clear. The impact of this transformation is even less clear. */
4808
4809 /* If the operand is a useless conversion, look through it. Doing so
4810 guarantees that the ADDR_EXPR and its operand will remain of the
4811 same type. */
4812 if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
4813 op0 = TREE_OPERAND (op0, 0);
4814
4815 *expr_p = fold_convert_loc (loc, TREE_TYPE (expr),
4816 build_fold_addr_expr_loc (loc,
4817 TREE_OPERAND (op0, 0)));
4818 ret = GS_OK;
4819 break;
4820
4821 default:
4822 /* We use fb_either here because the C frontend sometimes takes
4823 the address of a call that returns a struct; see
4824 gcc.dg/c99-array-lval-1.c. The gimplifier will correctly make
4825 the implied temporary explicit. */
4826
4827 /* Make the operand addressable. */
4828 ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
4829 is_gimple_addressable, fb_either);
4830 if (ret == GS_ERROR)
4831 break;
4832
4833 /* Then mark it. Beware that it may not be possible to do so directly
4834 if a temporary has been created by the gimplification. */
4835 prepare_gimple_addressable (&TREE_OPERAND (expr, 0), pre_p);
4836
4837 op0 = TREE_OPERAND (expr, 0);
4838
4839 /* For various reasons, the gimplification of the expression
4840 may have made a new INDIRECT_REF. */
4841 if (TREE_CODE (op0) == INDIRECT_REF)
4842 goto do_indirect_ref;
4843
4844 mark_addressable (TREE_OPERAND (expr, 0));
4845
4846 /* The FEs may end up building ADDR_EXPRs early on a decl with
4847 an incomplete type. Re-build ADDR_EXPRs in canonical form
4848 here. */
4849 if (!types_compatible_p (TREE_TYPE (op0), TREE_TYPE (TREE_TYPE (expr))))
4850 *expr_p = build_fold_addr_expr (op0);
4851
4852 /* Make sure TREE_CONSTANT and TREE_SIDE_EFFECTS are set properly. */
4853 recompute_tree_invariant_for_addr_expr (*expr_p);
4854
4855 /* If we re-built the ADDR_EXPR add a conversion to the original type
4856 if required. */
4857 if (!useless_type_conversion_p (TREE_TYPE (expr), TREE_TYPE (*expr_p)))
4858 *expr_p = fold_convert (TREE_TYPE (expr), *expr_p);
4859
4860 break;
4861 }
4862
4863 return ret;
4864 }
4865
4866 /* Gimplify the operands of an ASM_EXPR. Input operands should be a gimple
4867 value; output operands should be a gimple lvalue. */
4868
4869 static enum gimplify_status
4870 gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4871 {
4872 tree expr;
4873 int noutputs;
4874 const char **oconstraints;
4875 int i;
4876 tree link;
4877 const char *constraint;
4878 bool allows_mem, allows_reg, is_inout;
4879 enum gimplify_status ret, tret;
4880 gimple stmt;
4881 VEC(tree, gc) *inputs;
4882 VEC(tree, gc) *outputs;
4883 VEC(tree, gc) *clobbers;
4884 VEC(tree, gc) *labels;
4885 tree link_next;
4886
4887 expr = *expr_p;
4888 noutputs = list_length (ASM_OUTPUTS (expr));
4889 oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
4890
4891 inputs = outputs = clobbers = labels = NULL;
4892
4893 ret = GS_ALL_DONE;
4894 link_next = NULL_TREE;
4895 for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = link_next)
4896 {
4897 bool ok;
4898 size_t constraint_len;
4899
4900 link_next = TREE_CHAIN (link);
4901
4902 oconstraints[i]
4903 = constraint
4904 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4905 constraint_len = strlen (constraint);
4906 if (constraint_len == 0)
4907 continue;
4908
4909 ok = parse_output_constraint (&constraint, i, 0, 0,
4910 &allows_mem, &allows_reg, &is_inout);
4911 if (!ok)
4912 {
4913 ret = GS_ERROR;
4914 is_inout = false;
4915 }
4916
4917 if (!allows_reg && allows_mem)
4918 mark_addressable (TREE_VALUE (link));
4919
4920 tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4921 is_inout ? is_gimple_min_lval : is_gimple_lvalue,
4922 fb_lvalue | fb_mayfail);
4923 if (tret == GS_ERROR)
4924 {
4925 error ("invalid lvalue in asm output %d", i);
4926 ret = tret;
4927 }
4928
4929 VEC_safe_push (tree, gc, outputs, link);
4930 TREE_CHAIN (link) = NULL_TREE;
4931
4932 if (is_inout)
4933 {
4934 /* An input/output operand. To give the optimizers more
4935 flexibility, split it into separate input and output
4936 operands. */
4937 tree input;
4938 char buf[10];
4939
4940 /* Turn the in/out constraint into an output constraint. */
4941 char *p = xstrdup (constraint);
4942 p[0] = '=';
4943 TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
4944
4945 /* And add a matching input constraint. */
4946 if (allows_reg)
4947 {
4948 sprintf (buf, "%d", i);
4949
4950 /* If there are multiple alternatives in the constraint,
4951 handle each of them individually. Those that allow register
4952 will be replaced with operand number, the others will stay
4953 unchanged. */
4954 if (strchr (p, ',') != NULL)
4955 {
4956 size_t len = 0, buflen = strlen (buf);
4957 char *beg, *end, *str, *dst;
4958
4959 for (beg = p + 1;;)
4960 {
4961 end = strchr (beg, ',');
4962 if (end == NULL)
4963 end = strchr (beg, '\0');
4964 if ((size_t) (end - beg) < buflen)
4965 len += buflen + 1;
4966 else
4967 len += end - beg + 1;
4968 if (*end)
4969 beg = end + 1;
4970 else
4971 break;
4972 }
4973
4974 str = (char *) alloca (len);
4975 for (beg = p + 1, dst = str;;)
4976 {
4977 const char *tem;
4978 bool mem_p, reg_p, inout_p;
4979
4980 end = strchr (beg, ',');
4981 if (end)
4982 *end = '\0';
4983 beg[-1] = '=';
4984 tem = beg - 1;
4985 parse_output_constraint (&tem, i, 0, 0,
4986 &mem_p, &reg_p, &inout_p);
4987 if (dst != str)
4988 *dst++ = ',';
4989 if (reg_p)
4990 {
4991 memcpy (dst, buf, buflen);
4992 dst += buflen;
4993 }
4994 else
4995 {
4996 if (end)
4997 len = end - beg;
4998 else
4999 len = strlen (beg);
5000 memcpy (dst, beg, len);
5001 dst += len;
5002 }
5003 if (end)
5004 beg = end + 1;
5005 else
5006 break;
5007 }
5008 *dst = '\0';
5009 input = build_string (dst - str, str);
5010 }
5011 else
5012 input = build_string (strlen (buf), buf);
5013 }
5014 else
5015 input = build_string (constraint_len - 1, constraint + 1);
5016
5017 free (p);
5018
5019 input = build_tree_list (build_tree_list (NULL_TREE, input),
5020 unshare_expr (TREE_VALUE (link)));
5021 ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
5022 }
5023 }
5024
5025 link_next = NULL_TREE;
5026 for (link = ASM_INPUTS (expr); link; ++i, link = link_next)
5027 {
5028 link_next = TREE_CHAIN (link);
5029 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
5030 parse_input_constraint (&constraint, 0, 0, noutputs, 0,
5031 oconstraints, &allows_mem, &allows_reg);
5032
5033 /* If we can't make copies, we can only accept memory. */
5034 if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
5035 {
5036 if (allows_mem)
5037 allows_reg = 0;
5038 else
5039 {
5040 error ("impossible constraint in %<asm%>");
5041 error ("non-memory input %d must stay in memory", i);
5042 return GS_ERROR;
5043 }
5044 }
5045
5046 /* If the operand is a memory input, it should be an lvalue. */
5047 if (!allows_reg && allows_mem)
5048 {
5049 tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
5050 is_gimple_lvalue, fb_lvalue | fb_mayfail);
5051 mark_addressable (TREE_VALUE (link));
5052 if (tret == GS_ERROR)
5053 {
5054 if (EXPR_HAS_LOCATION (TREE_VALUE (link)))
5055 input_location = EXPR_LOCATION (TREE_VALUE (link));
5056 error ("memory input %d is not directly addressable", i);
5057 ret = tret;
5058 }
5059 }
5060 else
5061 {
5062 tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
5063 is_gimple_asm_val, fb_rvalue);
5064 if (tret == GS_ERROR)
5065 ret = tret;
5066 }
5067
5068 TREE_CHAIN (link) = NULL_TREE;
5069 VEC_safe_push (tree, gc, inputs, link);
5070 }
5071
5072 for (link = ASM_CLOBBERS (expr); link; ++i, link = TREE_CHAIN (link))
5073 VEC_safe_push (tree, gc, clobbers, link);
5074
5075 for (link = ASM_LABELS (expr); link; ++i, link = TREE_CHAIN (link))
5076 VEC_safe_push (tree, gc, labels, link);
5077
5078 /* Do not add ASMs with errors to the gimple IL stream. */
5079 if (ret != GS_ERROR)
5080 {
5081 stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
5082 inputs, outputs, clobbers, labels);
5083
5084 gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr));
5085 gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
5086
5087 gimplify_seq_add_stmt (pre_p, stmt);
5088 }
5089
5090 return ret;
5091 }
5092
5093 /* Gimplify a CLEANUP_POINT_EXPR. Currently this works by adding
5094 GIMPLE_WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
5095 gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
5096 return to this function.
5097
5098 FIXME should we complexify the prequeue handling instead? Or use flags
5099 for all the cleanups and let the optimizer tighten them up? The current
5100 code seems pretty fragile; it will break on a cleanup within any
5101 non-conditional nesting. But any such nesting would be broken, anyway;
5102 we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
5103 and continues out of it. We can do that at the RTL level, though, so
5104 having an optimizer to tighten up try/finally regions would be a Good
5105 Thing. */
5106
5107 static enum gimplify_status
5108 gimplify_cleanup_point_expr (tree *expr_p, gimple_seq *pre_p)
5109 {
5110 gimple_stmt_iterator iter;
5111 gimple_seq body_sequence = NULL;
5112
5113 tree temp = voidify_wrapper_expr (*expr_p, NULL);
5114
5115 /* We only care about the number of conditions between the innermost
5116 CLEANUP_POINT_EXPR and the cleanup. So save and reset the count and
5117 any cleanups collected outside the CLEANUP_POINT_EXPR. */
5118 int old_conds = gimplify_ctxp->conditions;
5119 gimple_seq old_cleanups = gimplify_ctxp->conditional_cleanups;
5120 gimplify_ctxp->conditions = 0;
5121 gimplify_ctxp->conditional_cleanups = NULL;
5122
5123 gimplify_stmt (&TREE_OPERAND (*expr_p, 0), &body_sequence);
5124
5125 gimplify_ctxp->conditions = old_conds;
5126 gimplify_ctxp->conditional_cleanups = old_cleanups;
5127
5128 for (iter = gsi_start (body_sequence); !gsi_end_p (iter); )
5129 {
5130 gimple wce = gsi_stmt (iter);
5131
5132 if (gimple_code (wce) == GIMPLE_WITH_CLEANUP_EXPR)
5133 {
5134 if (gsi_one_before_end_p (iter))
5135 {
5136 /* Note that gsi_insert_seq_before and gsi_remove do not
5137 scan operands, unlike some other sequence mutators. */
5138 if (!gimple_wce_cleanup_eh_only (wce))
5139 gsi_insert_seq_before_without_update (&iter,
5140 gimple_wce_cleanup (wce),
5141 GSI_SAME_STMT);
5142 gsi_remove (&iter, true);
5143 break;
5144 }
5145 else
5146 {
5147 gimple gtry;
5148 gimple_seq seq;
5149 enum gimple_try_flags kind;
5150
5151 if (gimple_wce_cleanup_eh_only (wce))
5152 kind = GIMPLE_TRY_CATCH;
5153 else
5154 kind = GIMPLE_TRY_FINALLY;
5155 seq = gsi_split_seq_after (iter);
5156
5157 gtry = gimple_build_try (seq, gimple_wce_cleanup (wce), kind);
5158 /* Do not use gsi_replace here, as it may scan operands.
5159 We want to do a simple structural modification only. */
5160 *gsi_stmt_ptr (&iter) = gtry;
5161 iter = gsi_start (seq);
5162 }
5163 }
5164 else
5165 gsi_next (&iter);
5166 }
5167
5168 gimplify_seq_add_seq (pre_p, body_sequence);
5169 if (temp)
5170 {
5171 *expr_p = temp;
5172 return GS_OK;
5173 }
5174 else
5175 {
5176 *expr_p = NULL;
5177 return GS_ALL_DONE;
5178 }
5179 }
5180
5181 /* Insert a cleanup marker for gimplify_cleanup_point_expr. CLEANUP
5182 is the cleanup action required. EH_ONLY is true if the cleanup should
5183 only be executed if an exception is thrown, not on normal exit. */
5184
5185 static void
5186 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p)
5187 {
5188 gimple wce;
5189 gimple_seq cleanup_stmts = NULL;
5190
5191 /* Errors can result in improperly nested cleanups. Which results in
5192 confusion when trying to resolve the GIMPLE_WITH_CLEANUP_EXPR. */
5193 if (seen_error ())
5194 return;
5195
5196 if (gimple_conditional_context ())
5197 {
5198 /* If we're in a conditional context, this is more complex. We only
5199 want to run the cleanup if we actually ran the initialization that
5200 necessitates it, but we want to run it after the end of the
5201 conditional context. So we wrap the try/finally around the
5202 condition and use a flag to determine whether or not to actually
5203 run the destructor. Thus
5204
5205 test ? f(A()) : 0
5206
5207 becomes (approximately)
5208
5209 flag = 0;
5210 try {
5211 if (test) { A::A(temp); flag = 1; val = f(temp); }
5212 else { val = 0; }
5213 } finally {
5214 if (flag) A::~A(temp);
5215 }
5216 val
5217 */
5218 tree flag = create_tmp_var (boolean_type_node, "cleanup");
5219 gimple ffalse = gimple_build_assign (flag, boolean_false_node);
5220 gimple ftrue = gimple_build_assign (flag, boolean_true_node);
5221
5222 cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
5223 gimplify_stmt (&cleanup, &cleanup_stmts);
5224 wce = gimple_build_wce (cleanup_stmts);
5225
5226 gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, ffalse);
5227 gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
5228 gimplify_seq_add_stmt (pre_p, ftrue);
5229
5230 /* Because of this manipulation, and the EH edges that jump
5231 threading cannot redirect, the temporary (VAR) will appear
5232 to be used uninitialized. Don't warn. */
5233 TREE_NO_WARNING (var) = 1;
5234 }
5235 else
5236 {
5237 gimplify_stmt (&cleanup, &cleanup_stmts);
5238 wce = gimple_build_wce (cleanup_stmts);
5239 gimple_wce_set_cleanup_eh_only (wce, eh_only);
5240 gimplify_seq_add_stmt (pre_p, wce);
5241 }
5242 }
5243
5244 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR. */
5245
5246 static enum gimplify_status
5247 gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
5248 {
5249 tree targ = *expr_p;
5250 tree temp = TARGET_EXPR_SLOT (targ);
5251 tree init = TARGET_EXPR_INITIAL (targ);
5252 enum gimplify_status ret;
5253
5254 if (init)
5255 {
5256 /* TARGET_EXPR temps aren't part of the enclosing block, so add it
5257 to the temps list. Handle also variable length TARGET_EXPRs. */
5258 if (TREE_CODE (DECL_SIZE (temp)) != INTEGER_CST)
5259 {
5260 if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (temp)))
5261 gimplify_type_sizes (TREE_TYPE (temp), pre_p);
5262 gimplify_vla_decl (temp, pre_p);
5263 }
5264 else
5265 gimple_add_tmp_var (temp);
5266
5267 /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
5268 expression is supposed to initialize the slot. */
5269 if (VOID_TYPE_P (TREE_TYPE (init)))
5270 ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5271 else
5272 {
5273 tree init_expr = build2 (INIT_EXPR, void_type_node, temp, init);
5274 init = init_expr;
5275 ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5276 init = NULL;
5277 ggc_free (init_expr);
5278 }
5279 if (ret == GS_ERROR)
5280 {
5281 /* PR c++/28266 Make sure this is expanded only once. */
5282 TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5283 return GS_ERROR;
5284 }
5285 if (init)
5286 gimplify_and_add (init, pre_p);
5287
5288 /* If needed, push the cleanup for the temp. */
5289 if (TARGET_EXPR_CLEANUP (targ))
5290 gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
5291 CLEANUP_EH_ONLY (targ), pre_p);
5292
5293 /* Only expand this once. */
5294 TREE_OPERAND (targ, 3) = init;
5295 TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5296 }
5297 else
5298 /* We should have expanded this before. */
5299 gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
5300
5301 *expr_p = temp;
5302 return GS_OK;
5303 }
5304
5305 /* Gimplification of expression trees. */
5306
5307 /* Gimplify an expression which appears at statement context. The
5308 corresponding GIMPLE statements are added to *SEQ_P. If *SEQ_P is
5309 NULL, a new sequence is allocated.
5310
5311 Return true if we actually added a statement to the queue. */
5312
5313 bool
5314 gimplify_stmt (tree *stmt_p, gimple_seq *seq_p)
5315 {
5316 gimple_seq_node last;
5317
5318 if (!*seq_p)
5319 *seq_p = gimple_seq_alloc ();
5320
5321 last = gimple_seq_last (*seq_p);
5322 gimplify_expr (stmt_p, seq_p, NULL, is_gimple_stmt, fb_none);
5323 return last != gimple_seq_last (*seq_p);
5324 }
5325
5326
5327 /* Add FIRSTPRIVATE entries for DECL in the OpenMP the surrounding parallels
5328 to CTX. If entries already exist, force them to be some flavor of private.
5329 If there is no enclosing parallel, do nothing. */
5330
5331 void
5332 omp_firstprivatize_variable (struct gimplify_omp_ctx *ctx, tree decl)
5333 {
5334 splay_tree_node n;
5335
5336 if (decl == NULL || !DECL_P (decl))
5337 return;
5338
5339 do
5340 {
5341 n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5342 if (n != NULL)
5343 {
5344 if (n->value & GOVD_SHARED)
5345 n->value = GOVD_FIRSTPRIVATE | (n->value & GOVD_SEEN);
5346 else
5347 return;
5348 }
5349 else if (ctx->region_type != ORT_WORKSHARE)
5350 omp_add_variable (ctx, decl, GOVD_FIRSTPRIVATE);
5351
5352 ctx = ctx->outer_context;
5353 }
5354 while (ctx);
5355 }
5356
5357 /* Similarly for each of the type sizes of TYPE. */
5358
5359 static void
5360 omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *ctx, tree type)
5361 {
5362 if (type == NULL || type == error_mark_node)
5363 return;
5364 type = TYPE_MAIN_VARIANT (type);
5365
5366 if (pointer_set_insert (ctx->privatized_types, type))
5367 return;
5368
5369 switch (TREE_CODE (type))
5370 {
5371 case INTEGER_TYPE:
5372 case ENUMERAL_TYPE:
5373 case BOOLEAN_TYPE:
5374 case REAL_TYPE:
5375 case FIXED_POINT_TYPE:
5376 omp_firstprivatize_variable (ctx, TYPE_MIN_VALUE (type));
5377 omp_firstprivatize_variable (ctx, TYPE_MAX_VALUE (type));
5378 break;
5379
5380 case ARRAY_TYPE:
5381 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5382 omp_firstprivatize_type_sizes (ctx, TYPE_DOMAIN (type));
5383 break;
5384
5385 case RECORD_TYPE:
5386 case UNION_TYPE:
5387 case QUAL_UNION_TYPE:
5388 {
5389 tree field;
5390 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5391 if (TREE_CODE (field) == FIELD_DECL)
5392 {
5393 omp_firstprivatize_variable (ctx, DECL_FIELD_OFFSET (field));
5394 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (field));
5395 }
5396 }
5397 break;
5398
5399 case POINTER_TYPE:
5400 case REFERENCE_TYPE:
5401 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5402 break;
5403
5404 default:
5405 break;
5406 }
5407
5408 omp_firstprivatize_variable (ctx, TYPE_SIZE (type));
5409 omp_firstprivatize_variable (ctx, TYPE_SIZE_UNIT (type));
5410 lang_hooks.types.omp_firstprivatize_type_sizes (ctx, type);
5411 }
5412
5413 /* Add an entry for DECL in the OpenMP context CTX with FLAGS. */
5414
5415 static void
5416 omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
5417 {
5418 splay_tree_node n;
5419 unsigned int nflags;
5420 tree t;
5421
5422 if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5423 return;
5424
5425 /* Never elide decls whose type has TREE_ADDRESSABLE set. This means
5426 there are constructors involved somewhere. */
5427 if (TREE_ADDRESSABLE (TREE_TYPE (decl))
5428 || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
5429 flags |= GOVD_SEEN;
5430
5431 n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5432 if (n != NULL)
5433 {
5434 /* We shouldn't be re-adding the decl with the same data
5435 sharing class. */
5436 gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
5437 /* The only combination of data sharing classes we should see is
5438 FIRSTPRIVATE and LASTPRIVATE. */
5439 nflags = n->value | flags;
5440 gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
5441 == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE));
5442 n->value = nflags;
5443 return;
5444 }
5445
5446 /* When adding a variable-sized variable, we have to handle all sorts
5447 of additional bits of data: the pointer replacement variable, and
5448 the parameters of the type. */
5449 if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5450 {
5451 /* Add the pointer replacement variable as PRIVATE if the variable
5452 replacement is private, else FIRSTPRIVATE since we'll need the
5453 address of the original variable either for SHARED, or for the
5454 copy into or out of the context. */
5455 if (!(flags & GOVD_LOCAL))
5456 {
5457 nflags = flags & GOVD_PRIVATE ? GOVD_PRIVATE : GOVD_FIRSTPRIVATE;
5458 nflags |= flags & GOVD_SEEN;
5459 t = DECL_VALUE_EXPR (decl);
5460 gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5461 t = TREE_OPERAND (t, 0);
5462 gcc_assert (DECL_P (t));
5463 omp_add_variable (ctx, t, nflags);
5464 }
5465
5466 /* Add all of the variable and type parameters (which should have
5467 been gimplified to a formal temporary) as FIRSTPRIVATE. */
5468 omp_firstprivatize_variable (ctx, DECL_SIZE_UNIT (decl));
5469 omp_firstprivatize_variable (ctx, DECL_SIZE (decl));
5470 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5471
5472 /* The variable-sized variable itself is never SHARED, only some form
5473 of PRIVATE. The sharing would take place via the pointer variable
5474 which we remapped above. */
5475 if (flags & GOVD_SHARED)
5476 flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
5477 | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
5478
5479 /* We're going to make use of the TYPE_SIZE_UNIT at least in the
5480 alloca statement we generate for the variable, so make sure it
5481 is available. This isn't automatically needed for the SHARED
5482 case, since we won't be allocating local storage then.
5483 For local variables TYPE_SIZE_UNIT might not be gimplified yet,
5484 in this case omp_notice_variable will be called later
5485 on when it is gimplified. */
5486 else if (! (flags & GOVD_LOCAL))
5487 omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
5488 }
5489 else if (lang_hooks.decls.omp_privatize_by_reference (decl))
5490 {
5491 gcc_assert ((flags & GOVD_LOCAL) == 0);
5492 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5493
5494 /* Similar to the direct variable sized case above, we'll need the
5495 size of references being privatized. */
5496 if ((flags & GOVD_SHARED) == 0)
5497 {
5498 t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
5499 if (TREE_CODE (t) != INTEGER_CST)
5500 omp_notice_variable (ctx, t, true);
5501 }
5502 }
5503
5504 splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
5505 }
5506
5507 /* Notice a threadprivate variable DECL used in OpenMP context CTX.
5508 This just prints out diagnostics about threadprivate variable uses
5509 in untied tasks. If DECL2 is non-NULL, prevent this warning
5510 on that variable. */
5511
5512 static bool
5513 omp_notice_threadprivate_variable (struct gimplify_omp_ctx *ctx, tree decl,
5514 tree decl2)
5515 {
5516 splay_tree_node n;
5517
5518 if (ctx->region_type != ORT_UNTIED_TASK)
5519 return false;
5520 n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5521 if (n == NULL)
5522 {
5523 error ("threadprivate variable %qE used in untied task", DECL_NAME (decl));
5524 error_at (ctx->location, "enclosing task");
5525 splay_tree_insert (ctx->variables, (splay_tree_key)decl, 0);
5526 }
5527 if (decl2)
5528 splay_tree_insert (ctx->variables, (splay_tree_key)decl2, 0);
5529 return false;
5530 }
5531
5532 /* Record the fact that DECL was used within the OpenMP context CTX.
5533 IN_CODE is true when real code uses DECL, and false when we should
5534 merely emit default(none) errors. Return true if DECL is going to
5535 be remapped and thus DECL shouldn't be gimplified into its
5536 DECL_VALUE_EXPR (if any). */
5537
5538 static bool
5539 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
5540 {
5541 splay_tree_node n;
5542 unsigned flags = in_code ? GOVD_SEEN : 0;
5543 bool ret = false, shared;
5544
5545 if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5546 return false;
5547
5548 /* Threadprivate variables are predetermined. */
5549 if (is_global_var (decl))
5550 {
5551 if (DECL_THREAD_LOCAL_P (decl))
5552 return omp_notice_threadprivate_variable (ctx, decl, NULL_TREE);
5553
5554 if (DECL_HAS_VALUE_EXPR_P (decl))
5555 {
5556 tree value = get_base_address (DECL_VALUE_EXPR (decl));
5557
5558 if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
5559 return omp_notice_threadprivate_variable (ctx, decl, value);
5560 }
5561 }
5562
5563 n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5564 if (n == NULL)
5565 {
5566 enum omp_clause_default_kind default_kind, kind;
5567 struct gimplify_omp_ctx *octx;
5568
5569 if (ctx->region_type == ORT_WORKSHARE)
5570 goto do_outer;
5571
5572 /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
5573 remapped firstprivate instead of shared. To some extent this is
5574 addressed in omp_firstprivatize_type_sizes, but not effectively. */
5575 default_kind = ctx->default_kind;
5576 kind = lang_hooks.decls.omp_predetermined_sharing (decl);
5577 if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
5578 default_kind = kind;
5579
5580 switch (default_kind)
5581 {
5582 case OMP_CLAUSE_DEFAULT_NONE:
5583 error ("%qE not specified in enclosing parallel",
5584 DECL_NAME (lang_hooks.decls.omp_report_decl (decl)));
5585 if ((ctx->region_type & ORT_TASK) != 0)
5586 error_at (ctx->location, "enclosing task");
5587 else
5588 error_at (ctx->location, "enclosing parallel");
5589 /* FALLTHRU */
5590 case OMP_CLAUSE_DEFAULT_SHARED:
5591 flags |= GOVD_SHARED;
5592 break;
5593 case OMP_CLAUSE_DEFAULT_PRIVATE:
5594 flags |= GOVD_PRIVATE;
5595 break;
5596 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
5597 flags |= GOVD_FIRSTPRIVATE;
5598 break;
5599 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
5600 /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED. */
5601 gcc_assert ((ctx->region_type & ORT_TASK) != 0);
5602 if (ctx->outer_context)
5603 omp_notice_variable (ctx->outer_context, decl, in_code);
5604 for (octx = ctx->outer_context; octx; octx = octx->outer_context)
5605 {
5606 splay_tree_node n2;
5607
5608 n2 = splay_tree_lookup (octx->variables, (splay_tree_key) decl);
5609 if (n2 && (n2->value & GOVD_DATA_SHARE_CLASS) != GOVD_SHARED)
5610 {
5611 flags |= GOVD_FIRSTPRIVATE;
5612 break;
5613 }
5614 if ((octx->region_type & ORT_PARALLEL) != 0)
5615 break;
5616 }
5617 if (flags & GOVD_FIRSTPRIVATE)
5618 break;
5619 if (octx == NULL
5620 && (TREE_CODE (decl) == PARM_DECL
5621 || (!is_global_var (decl)
5622 && DECL_CONTEXT (decl) == current_function_decl)))
5623 {
5624 flags |= GOVD_FIRSTPRIVATE;
5625 break;
5626 }
5627 flags |= GOVD_SHARED;
5628 break;
5629 default:
5630 gcc_unreachable ();
5631 }
5632
5633 if ((flags & GOVD_PRIVATE)
5634 && lang_hooks.decls.omp_private_outer_ref (decl))
5635 flags |= GOVD_PRIVATE_OUTER_REF;
5636
5637 omp_add_variable (ctx, decl, flags);
5638
5639 shared = (flags & GOVD_SHARED) != 0;
5640 ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5641 goto do_outer;
5642 }
5643
5644 if ((n->value & (GOVD_SEEN | GOVD_LOCAL)) == 0
5645 && (flags & (GOVD_SEEN | GOVD_LOCAL)) == GOVD_SEEN
5646 && DECL_SIZE (decl)
5647 && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5648 {
5649 splay_tree_node n2;
5650 tree t = DECL_VALUE_EXPR (decl);
5651 gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5652 t = TREE_OPERAND (t, 0);
5653 gcc_assert (DECL_P (t));
5654 n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
5655 n2->value |= GOVD_SEEN;
5656 }
5657
5658 shared = ((flags | n->value) & GOVD_SHARED) != 0;
5659 ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5660
5661 /* If nothing changed, there's nothing left to do. */
5662 if ((n->value & flags) == flags)
5663 return ret;
5664 flags |= n->value;
5665 n->value = flags;
5666
5667 do_outer:
5668 /* If the variable is private in the current context, then we don't
5669 need to propagate anything to an outer context. */
5670 if ((flags & GOVD_PRIVATE) && !(flags & GOVD_PRIVATE_OUTER_REF))
5671 return ret;
5672 if (ctx->outer_context
5673 && omp_notice_variable (ctx->outer_context, decl, in_code))
5674 return true;
5675 return ret;
5676 }
5677
5678 /* Verify that DECL is private within CTX. If there's specific information
5679 to the contrary in the innermost scope, generate an error. */
5680
5681 static bool
5682 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
5683 {
5684 splay_tree_node n;
5685
5686 n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5687 if (n != NULL)
5688 {
5689 if (n->value & GOVD_SHARED)
5690 {
5691 if (ctx == gimplify_omp_ctxp)
5692 {
5693 error ("iteration variable %qE should be private",
5694 DECL_NAME (decl));
5695 n->value = GOVD_PRIVATE;
5696 return true;
5697 }
5698 else
5699 return false;
5700 }
5701 else if ((n->value & GOVD_EXPLICIT) != 0
5702 && (ctx == gimplify_omp_ctxp
5703 || (ctx->region_type == ORT_COMBINED_PARALLEL
5704 && gimplify_omp_ctxp->outer_context == ctx)))
5705 {
5706 if ((n->value & GOVD_FIRSTPRIVATE) != 0)
5707 error ("iteration variable %qE should not be firstprivate",
5708 DECL_NAME (decl));
5709 else if ((n->value & GOVD_REDUCTION) != 0)
5710 error ("iteration variable %qE should not be reduction",
5711 DECL_NAME (decl));
5712 }
5713 return (ctx == gimplify_omp_ctxp
5714 || (ctx->region_type == ORT_COMBINED_PARALLEL
5715 && gimplify_omp_ctxp->outer_context == ctx));
5716 }
5717
5718 if (ctx->region_type != ORT_WORKSHARE)
5719 return false;
5720 else if (ctx->outer_context)
5721 return omp_is_private (ctx->outer_context, decl);
5722 return false;
5723 }
5724
5725 /* Return true if DECL is private within a parallel region
5726 that binds to the current construct's context or in parallel
5727 region's REDUCTION clause. */
5728
5729 static bool
5730 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
5731 {
5732 splay_tree_node n;
5733
5734 do
5735 {
5736 ctx = ctx->outer_context;
5737 if (ctx == NULL)
5738 return !(is_global_var (decl)
5739 /* References might be private, but might be shared too. */
5740 || lang_hooks.decls.omp_privatize_by_reference (decl));
5741
5742 n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5743 if (n != NULL)
5744 return (n->value & GOVD_SHARED) == 0;
5745 }
5746 while (ctx->region_type == ORT_WORKSHARE);
5747 return false;
5748 }
5749
5750 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
5751 and previous omp contexts. */
5752
5753 static void
5754 gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
5755 enum omp_region_type region_type)
5756 {
5757 struct gimplify_omp_ctx *ctx, *outer_ctx;
5758 struct gimplify_ctx gctx;
5759 tree c;
5760
5761 ctx = new_omp_context (region_type);
5762 outer_ctx = ctx->outer_context;
5763
5764 while ((c = *list_p) != NULL)
5765 {
5766 bool remove = false;
5767 bool notice_outer = true;
5768 const char *check_non_private = NULL;
5769 unsigned int flags;
5770 tree decl;
5771
5772 switch (OMP_CLAUSE_CODE (c))
5773 {
5774 case OMP_CLAUSE_PRIVATE:
5775 flags = GOVD_PRIVATE | GOVD_EXPLICIT;
5776 if (lang_hooks.decls.omp_private_outer_ref (OMP_CLAUSE_DECL (c)))
5777 {
5778 flags |= GOVD_PRIVATE_OUTER_REF;
5779 OMP_CLAUSE_PRIVATE_OUTER_REF (c) = 1;
5780 }
5781 else
5782 notice_outer = false;
5783 goto do_add;
5784 case OMP_CLAUSE_SHARED:
5785 flags = GOVD_SHARED | GOVD_EXPLICIT;
5786 goto do_add;
5787 case OMP_CLAUSE_FIRSTPRIVATE:
5788 flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
5789 check_non_private = "firstprivate";
5790 goto do_add;
5791 case OMP_CLAUSE_LASTPRIVATE:
5792 flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
5793 check_non_private = "lastprivate";
5794 goto do_add;
5795 case OMP_CLAUSE_REDUCTION:
5796 flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
5797 check_non_private = "reduction";
5798 goto do_add;
5799
5800 do_add:
5801 decl = OMP_CLAUSE_DECL (c);
5802 if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5803 {
5804 remove = true;
5805 break;
5806 }
5807 omp_add_variable (ctx, decl, flags);
5808 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5809 && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
5810 {
5811 omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
5812 GOVD_LOCAL | GOVD_SEEN);
5813 gimplify_omp_ctxp = ctx;
5814 push_gimplify_context (&gctx);
5815
5816 OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c) = gimple_seq_alloc ();
5817 OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c) = gimple_seq_alloc ();
5818
5819 gimplify_and_add (OMP_CLAUSE_REDUCTION_INIT (c),
5820 &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c));
5821 pop_gimplify_context
5822 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c)));
5823 push_gimplify_context (&gctx);
5824 gimplify_and_add (OMP_CLAUSE_REDUCTION_MERGE (c),
5825 &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c));
5826 pop_gimplify_context
5827 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c)));
5828 OMP_CLAUSE_REDUCTION_INIT (c) = NULL_TREE;
5829 OMP_CLAUSE_REDUCTION_MERGE (c) = NULL_TREE;
5830
5831 gimplify_omp_ctxp = outer_ctx;
5832 }
5833 else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
5834 && OMP_CLAUSE_LASTPRIVATE_STMT (c))
5835 {
5836 gimplify_omp_ctxp = ctx;
5837 push_gimplify_context (&gctx);
5838 if (TREE_CODE (OMP_CLAUSE_LASTPRIVATE_STMT (c)) != BIND_EXPR)
5839 {
5840 tree bind = build3 (BIND_EXPR, void_type_node, NULL,
5841 NULL, NULL);
5842 TREE_SIDE_EFFECTS (bind) = 1;
5843 BIND_EXPR_BODY (bind) = OMP_CLAUSE_LASTPRIVATE_STMT (c);
5844 OMP_CLAUSE_LASTPRIVATE_STMT (c) = bind;
5845 }
5846 gimplify_and_add (OMP_CLAUSE_LASTPRIVATE_STMT (c),
5847 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
5848 pop_gimplify_context
5849 (gimple_seq_first_stmt (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)));
5850 OMP_CLAUSE_LASTPRIVATE_STMT (c) = NULL_TREE;
5851
5852 gimplify_omp_ctxp = outer_ctx;
5853 }
5854 if (notice_outer)
5855 goto do_notice;
5856 break;
5857
5858 case OMP_CLAUSE_COPYIN:
5859 case OMP_CLAUSE_COPYPRIVATE:
5860 decl = OMP_CLAUSE_DECL (c);
5861 if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5862 {
5863 remove = true;
5864 break;
5865 }
5866 do_notice:
5867 if (outer_ctx)
5868 omp_notice_variable (outer_ctx, decl, true);
5869 if (check_non_private
5870 && region_type == ORT_WORKSHARE
5871 && omp_check_private (ctx, decl))
5872 {
5873 error ("%s variable %qE is private in outer context",
5874 check_non_private, DECL_NAME (decl));
5875 remove = true;
5876 }
5877 break;
5878
5879 case OMP_CLAUSE_IF:
5880 OMP_CLAUSE_OPERAND (c, 0)
5881 = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
5882 /* Fall through. */
5883
5884 case OMP_CLAUSE_SCHEDULE:
5885 case OMP_CLAUSE_NUM_THREADS:
5886 if (gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
5887 is_gimple_val, fb_rvalue) == GS_ERROR)
5888 remove = true;
5889 break;
5890
5891 case OMP_CLAUSE_NOWAIT:
5892 case OMP_CLAUSE_ORDERED:
5893 case OMP_CLAUSE_UNTIED:
5894 case OMP_CLAUSE_COLLAPSE:
5895 break;
5896
5897 case OMP_CLAUSE_DEFAULT:
5898 ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
5899 break;
5900
5901 default:
5902 gcc_unreachable ();
5903 }
5904
5905 if (remove)
5906 *list_p = OMP_CLAUSE_CHAIN (c);
5907 else
5908 list_p = &OMP_CLAUSE_CHAIN (c);
5909 }
5910
5911 gimplify_omp_ctxp = ctx;
5912 }
5913
5914 /* For all variables that were not actually used within the context,
5915 remove PRIVATE, SHARED, and FIRSTPRIVATE clauses. */
5916
5917 static int
5918 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
5919 {
5920 tree *list_p = (tree *) data;
5921 tree decl = (tree) n->key;
5922 unsigned flags = n->value;
5923 enum omp_clause_code code;
5924 tree clause;
5925 bool private_debug;
5926
5927 if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
5928 return 0;
5929 if ((flags & GOVD_SEEN) == 0)
5930 return 0;
5931 if (flags & GOVD_DEBUG_PRIVATE)
5932 {
5933 gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
5934 private_debug = true;
5935 }
5936 else
5937 private_debug
5938 = lang_hooks.decls.omp_private_debug_clause (decl,
5939 !!(flags & GOVD_SHARED));
5940 if (private_debug)
5941 code = OMP_CLAUSE_PRIVATE;
5942 else if (flags & GOVD_SHARED)
5943 {
5944 if (is_global_var (decl))
5945 {
5946 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
5947 while (ctx != NULL)
5948 {
5949 splay_tree_node on
5950 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5951 if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
5952 | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
5953 break;
5954 ctx = ctx->outer_context;
5955 }
5956 if (ctx == NULL)
5957 return 0;
5958 }
5959 code = OMP_CLAUSE_SHARED;
5960 }
5961 else if (flags & GOVD_PRIVATE)
5962 code = OMP_CLAUSE_PRIVATE;
5963 else if (flags & GOVD_FIRSTPRIVATE)
5964 code = OMP_CLAUSE_FIRSTPRIVATE;
5965 else
5966 gcc_unreachable ();
5967
5968 clause = build_omp_clause (input_location, code);
5969 OMP_CLAUSE_DECL (clause) = decl;
5970 OMP_CLAUSE_CHAIN (clause) = *list_p;
5971 if (private_debug)
5972 OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
5973 else if (code == OMP_CLAUSE_PRIVATE && (flags & GOVD_PRIVATE_OUTER_REF))
5974 OMP_CLAUSE_PRIVATE_OUTER_REF (clause) = 1;
5975 *list_p = clause;
5976 lang_hooks.decls.omp_finish_clause (clause);
5977
5978 return 0;
5979 }
5980
5981 static void
5982 gimplify_adjust_omp_clauses (tree *list_p)
5983 {
5984 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
5985 tree c, decl;
5986
5987 while ((c = *list_p) != NULL)
5988 {
5989 splay_tree_node n;
5990 bool remove = false;
5991
5992 switch (OMP_CLAUSE_CODE (c))
5993 {
5994 case OMP_CLAUSE_PRIVATE:
5995 case OMP_CLAUSE_SHARED:
5996 case OMP_CLAUSE_FIRSTPRIVATE:
5997 decl = OMP_CLAUSE_DECL (c);
5998 n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5999 remove = !(n->value & GOVD_SEEN);
6000 if (! remove)
6001 {
6002 bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
6003 if ((n->value & GOVD_DEBUG_PRIVATE)
6004 || lang_hooks.decls.omp_private_debug_clause (decl, shared))
6005 {
6006 gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
6007 || ((n->value & GOVD_DATA_SHARE_CLASS)
6008 == GOVD_PRIVATE));
6009 OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
6010 OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
6011 }
6012 }
6013 break;
6014
6015 case OMP_CLAUSE_LASTPRIVATE:
6016 /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
6017 accurately reflect the presence of a FIRSTPRIVATE clause. */
6018 decl = OMP_CLAUSE_DECL (c);
6019 n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
6020 OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
6021 = (n->value & GOVD_FIRSTPRIVATE) != 0;
6022 break;
6023
6024 case OMP_CLAUSE_REDUCTION:
6025 case OMP_CLAUSE_COPYIN:
6026 case OMP_CLAUSE_COPYPRIVATE:
6027 case OMP_CLAUSE_IF:
6028 case OMP_CLAUSE_NUM_THREADS:
6029 case OMP_CLAUSE_SCHEDULE:
6030 case OMP_CLAUSE_NOWAIT:
6031 case OMP_CLAUSE_ORDERED:
6032 case OMP_CLAUSE_DEFAULT:
6033 case OMP_CLAUSE_UNTIED:
6034 case OMP_CLAUSE_COLLAPSE:
6035 break;
6036
6037 default:
6038 gcc_unreachable ();
6039 }
6040
6041 if (remove)
6042 *list_p = OMP_CLAUSE_CHAIN (c);
6043 else
6044 list_p = &OMP_CLAUSE_CHAIN (c);
6045 }
6046
6047 /* Add in any implicit data sharing. */
6048 splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
6049
6050 gimplify_omp_ctxp = ctx->outer_context;
6051 delete_omp_context (ctx);
6052 }
6053
6054 /* Gimplify the contents of an OMP_PARALLEL statement. This involves
6055 gimplification of the body, as well as scanning the body for used
6056 variables. We need to do this scan now, because variable-sized
6057 decls will be decomposed during gimplification. */
6058
6059 static void
6060 gimplify_omp_parallel (tree *expr_p, gimple_seq *pre_p)
6061 {
6062 tree expr = *expr_p;
6063 gimple g;
6064 gimple_seq body = NULL;
6065 struct gimplify_ctx gctx;
6066
6067 gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p,
6068 OMP_PARALLEL_COMBINED (expr)
6069 ? ORT_COMBINED_PARALLEL
6070 : ORT_PARALLEL);
6071
6072 push_gimplify_context (&gctx);
6073
6074 g = gimplify_and_return_first (OMP_PARALLEL_BODY (expr), &body);
6075 if (gimple_code (g) == GIMPLE_BIND)
6076 pop_gimplify_context (g);
6077 else
6078 pop_gimplify_context (NULL);
6079
6080 gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
6081
6082 g = gimple_build_omp_parallel (body,
6083 OMP_PARALLEL_CLAUSES (expr),
6084 NULL_TREE, NULL_TREE);
6085 if (OMP_PARALLEL_COMBINED (expr))
6086 gimple_omp_set_subcode (g, GF_OMP_PARALLEL_COMBINED);
6087 gimplify_seq_add_stmt (pre_p, g);
6088 *expr_p = NULL_TREE;
6089 }
6090
6091 /* Gimplify the contents of an OMP_TASK statement. This involves
6092 gimplification of the body, as well as scanning the body for used
6093 variables. We need to do this scan now, because variable-sized
6094 decls will be decomposed during gimplification. */
6095
6096 static void
6097 gimplify_omp_task (tree *expr_p, gimple_seq *pre_p)
6098 {
6099 tree expr = *expr_p;
6100 gimple g;
6101 gimple_seq body = NULL;
6102 struct gimplify_ctx gctx;
6103
6104 gimplify_scan_omp_clauses (&OMP_TASK_CLAUSES (expr), pre_p,
6105 find_omp_clause (OMP_TASK_CLAUSES (expr),
6106 OMP_CLAUSE_UNTIED)
6107 ? ORT_UNTIED_TASK : ORT_TASK);
6108
6109 push_gimplify_context (&gctx);
6110
6111 g = gimplify_and_return_first (OMP_TASK_BODY (expr), &body);
6112 if (gimple_code (g) == GIMPLE_BIND)
6113 pop_gimplify_context (g);
6114 else
6115 pop_gimplify_context (NULL);
6116
6117 gimplify_adjust_omp_clauses (&OMP_TASK_CLAUSES (expr));
6118
6119 g = gimple_build_omp_task (body,
6120 OMP_TASK_CLAUSES (expr),
6121 NULL_TREE, NULL_TREE,
6122 NULL_TREE, NULL_TREE, NULL_TREE);
6123 gimplify_seq_add_stmt (pre_p, g);
6124 *expr_p = NULL_TREE;
6125 }
6126
6127 /* Gimplify the gross structure of an OMP_FOR statement. */
6128
6129 static enum gimplify_status
6130 gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
6131 {
6132 tree for_stmt, decl, var, t;
6133 enum gimplify_status ret = GS_ALL_DONE;
6134 enum gimplify_status tret;
6135 gimple gfor;
6136 gimple_seq for_body, for_pre_body;
6137 int i;
6138
6139 for_stmt = *expr_p;
6140
6141 gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
6142 ORT_WORKSHARE);
6143
6144 /* Handle OMP_FOR_INIT. */
6145 for_pre_body = NULL;
6146 gimplify_and_add (OMP_FOR_PRE_BODY (for_stmt), &for_pre_body);
6147 OMP_FOR_PRE_BODY (for_stmt) = NULL_TREE;
6148
6149 for_body = gimple_seq_alloc ();
6150 gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
6151 == TREE_VEC_LENGTH (OMP_FOR_COND (for_stmt)));
6152 gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
6153 == TREE_VEC_LENGTH (OMP_FOR_INCR (for_stmt)));
6154 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6155 {
6156 t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6157 gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6158 decl = TREE_OPERAND (t, 0);
6159 gcc_assert (DECL_P (decl));
6160 gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl))
6161 || POINTER_TYPE_P (TREE_TYPE (decl)));
6162
6163 /* Make sure the iteration variable is private. */
6164 if (omp_is_private (gimplify_omp_ctxp, decl))
6165 omp_notice_variable (gimplify_omp_ctxp, decl, true);
6166 else
6167 omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
6168
6169 /* If DECL is not a gimple register, create a temporary variable to act
6170 as an iteration counter. This is valid, since DECL cannot be
6171 modified in the body of the loop. */
6172 if (!is_gimple_reg (decl))
6173 {
6174 var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
6175 TREE_OPERAND (t, 0) = var;
6176
6177 gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var));
6178
6179 omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
6180 }
6181 else
6182 var = decl;
6183
6184 tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6185 is_gimple_val, fb_rvalue);
6186 ret = MIN (ret, tret);
6187 if (ret == GS_ERROR)
6188 return ret;
6189
6190 /* Handle OMP_FOR_COND. */
6191 t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6192 gcc_assert (COMPARISON_CLASS_P (t));
6193 gcc_assert (TREE_OPERAND (t, 0) == decl);
6194
6195 tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6196 is_gimple_val, fb_rvalue);
6197 ret = MIN (ret, tret);
6198
6199 /* Handle OMP_FOR_INCR. */
6200 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6201 switch (TREE_CODE (t))
6202 {
6203 case PREINCREMENT_EXPR:
6204 case POSTINCREMENT_EXPR:
6205 t = build_int_cst (TREE_TYPE (decl), 1);
6206 t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6207 t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6208 TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6209 break;
6210
6211 case PREDECREMENT_EXPR:
6212 case POSTDECREMENT_EXPR:
6213 t = build_int_cst (TREE_TYPE (decl), -1);
6214 t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6215 t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6216 TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6217 break;
6218
6219 case MODIFY_EXPR:
6220 gcc_assert (TREE_OPERAND (t, 0) == decl);
6221 TREE_OPERAND (t, 0) = var;
6222
6223 t = TREE_OPERAND (t, 1);
6224 switch (TREE_CODE (t))
6225 {
6226 case PLUS_EXPR:
6227 if (TREE_OPERAND (t, 1) == decl)
6228 {
6229 TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
6230 TREE_OPERAND (t, 0) = var;
6231 break;
6232 }
6233
6234 /* Fallthru. */
6235 case MINUS_EXPR:
6236 case POINTER_PLUS_EXPR:
6237 gcc_assert (TREE_OPERAND (t, 0) == decl);
6238 TREE_OPERAND (t, 0) = var;
6239 break;
6240 default:
6241 gcc_unreachable ();
6242 }
6243
6244 tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6245 is_gimple_val, fb_rvalue);
6246 ret = MIN (ret, tret);
6247 break;
6248
6249 default:
6250 gcc_unreachable ();
6251 }
6252
6253 if (var != decl || TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1)
6254 {
6255 tree c;
6256 for (c = OMP_FOR_CLAUSES (for_stmt); c ; c = OMP_CLAUSE_CHAIN (c))
6257 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
6258 && OMP_CLAUSE_DECL (c) == decl
6259 && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL)
6260 {
6261 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6262 gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6263 gcc_assert (TREE_OPERAND (t, 0) == var);
6264 t = TREE_OPERAND (t, 1);
6265 gcc_assert (TREE_CODE (t) == PLUS_EXPR
6266 || TREE_CODE (t) == MINUS_EXPR
6267 || TREE_CODE (t) == POINTER_PLUS_EXPR);
6268 gcc_assert (TREE_OPERAND (t, 0) == var);
6269 t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl,
6270 TREE_OPERAND (t, 1));
6271 gimplify_assign (decl, t,
6272 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
6273 }
6274 }
6275 }
6276
6277 gimplify_and_add (OMP_FOR_BODY (for_stmt), &for_body);
6278
6279 gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
6280
6281 gfor = gimple_build_omp_for (for_body, OMP_FOR_CLAUSES (for_stmt),
6282 TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)),
6283 for_pre_body);
6284
6285 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6286 {
6287 t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6288 gimple_omp_for_set_index (gfor, i, TREE_OPERAND (t, 0));
6289 gimple_omp_for_set_initial (gfor, i, TREE_OPERAND (t, 1));
6290 t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6291 gimple_omp_for_set_cond (gfor, i, TREE_CODE (t));
6292 gimple_omp_for_set_final (gfor, i, TREE_OPERAND (t, 1));
6293 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6294 gimple_omp_for_set_incr (gfor, i, TREE_OPERAND (t, 1));
6295 }
6296
6297 gimplify_seq_add_stmt (pre_p, gfor);
6298 return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
6299 }
6300
6301 /* Gimplify the gross structure of other OpenMP worksharing constructs.
6302 In particular, OMP_SECTIONS and OMP_SINGLE. */
6303
6304 static void
6305 gimplify_omp_workshare (tree *expr_p, gimple_seq *pre_p)
6306 {
6307 tree expr = *expr_p;
6308 gimple stmt;
6309 gimple_seq body = NULL;
6310
6311 gimplify_scan_omp_clauses (&OMP_CLAUSES (expr), pre_p, ORT_WORKSHARE);
6312 gimplify_and_add (OMP_BODY (expr), &body);
6313 gimplify_adjust_omp_clauses (&OMP_CLAUSES (expr));
6314
6315 if (TREE_CODE (expr) == OMP_SECTIONS)
6316 stmt = gimple_build_omp_sections (body, OMP_CLAUSES (expr));
6317 else if (TREE_CODE (expr) == OMP_SINGLE)
6318 stmt = gimple_build_omp_single (body, OMP_CLAUSES (expr));
6319 else
6320 gcc_unreachable ();
6321
6322 gimplify_seq_add_stmt (pre_p, stmt);
6323 }
6324
6325 /* A subroutine of gimplify_omp_atomic. The front end is supposed to have
6326 stabilized the lhs of the atomic operation as *ADDR. Return true if
6327 EXPR is this stabilized form. */
6328
6329 static bool
6330 goa_lhs_expr_p (tree expr, tree addr)
6331 {
6332 /* Also include casts to other type variants. The C front end is fond
6333 of adding these for e.g. volatile variables. This is like
6334 STRIP_TYPE_NOPS but includes the main variant lookup. */
6335 STRIP_USELESS_TYPE_CONVERSION (expr);
6336
6337 if (TREE_CODE (expr) == INDIRECT_REF)
6338 {
6339 expr = TREE_OPERAND (expr, 0);
6340 while (expr != addr
6341 && (CONVERT_EXPR_P (expr)
6342 || TREE_CODE (expr) == NON_LVALUE_EXPR)
6343 && TREE_CODE (expr) == TREE_CODE (addr)
6344 && types_compatible_p (TREE_TYPE (expr), TREE_TYPE (addr)))
6345 {
6346 expr = TREE_OPERAND (expr, 0);
6347 addr = TREE_OPERAND (addr, 0);
6348 }
6349 if (expr == addr)
6350 return true;
6351 return (TREE_CODE (addr) == ADDR_EXPR
6352 && TREE_CODE (expr) == ADDR_EXPR
6353 && TREE_OPERAND (addr, 0) == TREE_OPERAND (expr, 0));
6354 }
6355 if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
6356 return true;
6357 return false;
6358 }
6359
6360 /* Walk *EXPR_P and replace
6361 appearances of *LHS_ADDR with LHS_VAR. If an expression does not involve
6362 the lhs, evaluate it into a temporary. Return 1 if the lhs appeared as
6363 a subexpression, 0 if it did not, or -1 if an error was encountered. */
6364
6365 static int
6366 goa_stabilize_expr (tree *expr_p, gimple_seq *pre_p, tree lhs_addr,
6367 tree lhs_var)
6368 {
6369 tree expr = *expr_p;
6370 int saw_lhs;
6371
6372 if (goa_lhs_expr_p (expr, lhs_addr))
6373 {
6374 *expr_p = lhs_var;
6375 return 1;
6376 }
6377 if (is_gimple_val (expr))
6378 return 0;
6379
6380 saw_lhs = 0;
6381 switch (TREE_CODE_CLASS (TREE_CODE (expr)))
6382 {
6383 case tcc_binary:
6384 case tcc_comparison:
6385 saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p, lhs_addr,
6386 lhs_var);
6387 case tcc_unary:
6388 saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p, lhs_addr,
6389 lhs_var);
6390 break;
6391 case tcc_expression:
6392 switch (TREE_CODE (expr))
6393 {
6394 case TRUTH_ANDIF_EXPR:
6395 case TRUTH_ORIF_EXPR:
6396 saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
6397 lhs_addr, lhs_var);
6398 saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
6399 lhs_addr, lhs_var);
6400 break;
6401 default:
6402 break;
6403 }
6404 break;
6405 default:
6406 break;
6407 }
6408
6409 if (saw_lhs == 0)
6410 {
6411 enum gimplify_status gs;
6412 gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
6413 if (gs != GS_ALL_DONE)
6414 saw_lhs = -1;
6415 }
6416
6417 return saw_lhs;
6418 }
6419
6420
6421 /* Gimplify an OMP_ATOMIC statement. */
6422
6423 static enum gimplify_status
6424 gimplify_omp_atomic (tree *expr_p, gimple_seq *pre_p)
6425 {
6426 tree addr = TREE_OPERAND (*expr_p, 0);
6427 tree rhs = TREE_OPERAND (*expr_p, 1);
6428 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
6429 tree tmp_load;
6430
6431 tmp_load = create_tmp_reg (type, NULL);
6432 if (goa_stabilize_expr (&rhs, pre_p, addr, tmp_load) < 0)
6433 return GS_ERROR;
6434
6435 if (gimplify_expr (&addr, pre_p, NULL, is_gimple_val, fb_rvalue)
6436 != GS_ALL_DONE)
6437 return GS_ERROR;
6438
6439 gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_load (tmp_load, addr));
6440 if (gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue)
6441 != GS_ALL_DONE)
6442 return GS_ERROR;
6443 gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_store (rhs));
6444 *expr_p = NULL;
6445
6446 return GS_ALL_DONE;
6447 }
6448
6449
6450 /* Converts the GENERIC expression tree *EXPR_P to GIMPLE. If the
6451 expression produces a value to be used as an operand inside a GIMPLE
6452 statement, the value will be stored back in *EXPR_P. This value will
6453 be a tree of class tcc_declaration, tcc_constant, tcc_reference or
6454 an SSA_NAME. The corresponding sequence of GIMPLE statements is
6455 emitted in PRE_P and POST_P.
6456
6457 Additionally, this process may overwrite parts of the input
6458 expression during gimplification. Ideally, it should be
6459 possible to do non-destructive gimplification.
6460
6461 EXPR_P points to the GENERIC expression to convert to GIMPLE. If
6462 the expression needs to evaluate to a value to be used as
6463 an operand in a GIMPLE statement, this value will be stored in
6464 *EXPR_P on exit. This happens when the caller specifies one
6465 of fb_lvalue or fb_rvalue fallback flags.
6466
6467 PRE_P will contain the sequence of GIMPLE statements corresponding
6468 to the evaluation of EXPR and all the side-effects that must
6469 be executed before the main expression. On exit, the last
6470 statement of PRE_P is the core statement being gimplified. For
6471 instance, when gimplifying 'if (++a)' the last statement in
6472 PRE_P will be 'if (t.1)' where t.1 is the result of
6473 pre-incrementing 'a'.
6474
6475 POST_P will contain the sequence of GIMPLE statements corresponding
6476 to the evaluation of all the side-effects that must be executed
6477 after the main expression. If this is NULL, the post
6478 side-effects are stored at the end of PRE_P.
6479
6480 The reason why the output is split in two is to handle post
6481 side-effects explicitly. In some cases, an expression may have
6482 inner and outer post side-effects which need to be emitted in
6483 an order different from the one given by the recursive
6484 traversal. For instance, for the expression (*p--)++ the post
6485 side-effects of '--' must actually occur *after* the post
6486 side-effects of '++'. However, gimplification will first visit
6487 the inner expression, so if a separate POST sequence was not
6488 used, the resulting sequence would be:
6489
6490 1 t.1 = *p
6491 2 p = p - 1
6492 3 t.2 = t.1 + 1
6493 4 *p = t.2
6494
6495 However, the post-decrement operation in line #2 must not be
6496 evaluated until after the store to *p at line #4, so the
6497 correct sequence should be:
6498
6499 1 t.1 = *p
6500 2 t.2 = t.1 + 1
6501 3 *p = t.2
6502 4 p = p - 1
6503
6504 So, by specifying a separate post queue, it is possible
6505 to emit the post side-effects in the correct order.
6506 If POST_P is NULL, an internal queue will be used. Before
6507 returning to the caller, the sequence POST_P is appended to
6508 the main output sequence PRE_P.
6509
6510 GIMPLE_TEST_F points to a function that takes a tree T and
6511 returns nonzero if T is in the GIMPLE form requested by the
6512 caller. The GIMPLE predicates are in gimple.c.
6513
6514 FALLBACK tells the function what sort of a temporary we want if
6515 gimplification cannot produce an expression that complies with
6516 GIMPLE_TEST_F.
6517
6518 fb_none means that no temporary should be generated
6519 fb_rvalue means that an rvalue is OK to generate
6520 fb_lvalue means that an lvalue is OK to generate
6521 fb_either means that either is OK, but an lvalue is preferable.
6522 fb_mayfail means that gimplification may fail (in which case
6523 GS_ERROR will be returned)
6524
6525 The return value is either GS_ERROR or GS_ALL_DONE, since this
6526 function iterates until EXPR is completely gimplified or an error
6527 occurs. */
6528
6529 enum gimplify_status
6530 gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
6531 bool (*gimple_test_f) (tree), fallback_t fallback)
6532 {
6533 tree tmp;
6534 gimple_seq internal_pre = NULL;
6535 gimple_seq internal_post = NULL;
6536 tree save_expr;
6537 bool is_statement;
6538 location_t saved_location;
6539 enum gimplify_status ret;
6540 gimple_stmt_iterator pre_last_gsi, post_last_gsi;
6541
6542 save_expr = *expr_p;
6543 if (save_expr == NULL_TREE)
6544 return GS_ALL_DONE;
6545
6546 /* If we are gimplifying a top-level statement, PRE_P must be valid. */
6547 is_statement = gimple_test_f == is_gimple_stmt;
6548 if (is_statement)
6549 gcc_assert (pre_p);
6550
6551 /* Consistency checks. */
6552 if (gimple_test_f == is_gimple_reg)
6553 gcc_assert (fallback & (fb_rvalue | fb_lvalue));
6554 else if (gimple_test_f == is_gimple_val
6555 || gimple_test_f == is_gimple_call_addr
6556 || gimple_test_f == is_gimple_condexpr
6557 || gimple_test_f == is_gimple_mem_rhs
6558 || gimple_test_f == is_gimple_mem_rhs_or_call
6559 || gimple_test_f == is_gimple_reg_rhs
6560 || gimple_test_f == is_gimple_reg_rhs_or_call
6561 || gimple_test_f == is_gimple_asm_val)
6562 gcc_assert (fallback & fb_rvalue);
6563 else if (gimple_test_f == is_gimple_min_lval
6564 || gimple_test_f == is_gimple_lvalue)
6565 gcc_assert (fallback & fb_lvalue);
6566 else if (gimple_test_f == is_gimple_addressable)
6567 gcc_assert (fallback & fb_either);
6568 else if (gimple_test_f == is_gimple_stmt)
6569 gcc_assert (fallback == fb_none);
6570 else
6571 {
6572 /* We should have recognized the GIMPLE_TEST_F predicate to
6573 know what kind of fallback to use in case a temporary is
6574 needed to hold the value or address of *EXPR_P. */
6575 gcc_unreachable ();
6576 }
6577
6578 /* We used to check the predicate here and return immediately if it
6579 succeeds. This is wrong; the design is for gimplification to be
6580 idempotent, and for the predicates to only test for valid forms, not
6581 whether they are fully simplified. */
6582 if (pre_p == NULL)
6583 pre_p = &internal_pre;
6584
6585 if (post_p == NULL)
6586 post_p = &internal_post;
6587
6588 /* Remember the last statements added to PRE_P and POST_P. Every
6589 new statement added by the gimplification helpers needs to be
6590 annotated with location information. To centralize the
6591 responsibility, we remember the last statement that had been
6592 added to both queues before gimplifying *EXPR_P. If
6593 gimplification produces new statements in PRE_P and POST_P, those
6594 statements will be annotated with the same location information
6595 as *EXPR_P. */
6596 pre_last_gsi = gsi_last (*pre_p);
6597 post_last_gsi = gsi_last (*post_p);
6598
6599 saved_location = input_location;
6600 if (save_expr != error_mark_node
6601 && EXPR_HAS_LOCATION (*expr_p))
6602 input_location = EXPR_LOCATION (*expr_p);
6603
6604 /* Loop over the specific gimplifiers until the toplevel node
6605 remains the same. */
6606 do
6607 {
6608 /* Strip away as many useless type conversions as possible
6609 at the toplevel. */
6610 STRIP_USELESS_TYPE_CONVERSION (*expr_p);
6611
6612 /* Remember the expr. */
6613 save_expr = *expr_p;
6614
6615 /* Die, die, die, my darling. */
6616 if (save_expr == error_mark_node
6617 || (TREE_TYPE (save_expr)
6618 && TREE_TYPE (save_expr) == error_mark_node))
6619 {
6620 ret = GS_ERROR;
6621 break;
6622 }
6623
6624 /* Do any language-specific gimplification. */
6625 ret = ((enum gimplify_status)
6626 lang_hooks.gimplify_expr (expr_p, pre_p, post_p));
6627 if (ret == GS_OK)
6628 {
6629 if (*expr_p == NULL_TREE)
6630 break;
6631 if (*expr_p != save_expr)
6632 continue;
6633 }
6634 else if (ret != GS_UNHANDLED)
6635 break;
6636
6637 /* Make sure that all the cases set 'ret' appropriately. */
6638 ret = GS_UNHANDLED;
6639 switch (TREE_CODE (*expr_p))
6640 {
6641 /* First deal with the special cases. */
6642
6643 case POSTINCREMENT_EXPR:
6644 case POSTDECREMENT_EXPR:
6645 case PREINCREMENT_EXPR:
6646 case PREDECREMENT_EXPR:
6647 ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
6648 fallback != fb_none);
6649 break;
6650
6651 case ARRAY_REF:
6652 case ARRAY_RANGE_REF:
6653 case REALPART_EXPR:
6654 case IMAGPART_EXPR:
6655 case COMPONENT_REF:
6656 case VIEW_CONVERT_EXPR:
6657 ret = gimplify_compound_lval (expr_p, pre_p, post_p,
6658 fallback ? fallback : fb_rvalue);
6659 break;
6660
6661 case COND_EXPR:
6662 ret = gimplify_cond_expr (expr_p, pre_p, fallback);
6663
6664 /* C99 code may assign to an array in a structure value of a
6665 conditional expression, and this has undefined behavior
6666 only on execution, so create a temporary if an lvalue is
6667 required. */
6668 if (fallback == fb_lvalue)
6669 {
6670 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6671 mark_addressable (*expr_p);
6672 ret = GS_OK;
6673 }
6674 break;
6675
6676 case CALL_EXPR:
6677 ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
6678
6679 /* C99 code may assign to an array in a structure returned
6680 from a function, and this has undefined behavior only on
6681 execution, so create a temporary if an lvalue is
6682 required. */
6683 if (fallback == fb_lvalue)
6684 {
6685 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6686 mark_addressable (*expr_p);
6687 ret = GS_OK;
6688 }
6689 break;
6690
6691 case TREE_LIST:
6692 gcc_unreachable ();
6693
6694 case COMPOUND_EXPR:
6695 ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
6696 break;
6697
6698 case COMPOUND_LITERAL_EXPR:
6699 ret = gimplify_compound_literal_expr (expr_p, pre_p);
6700 break;
6701
6702 case MODIFY_EXPR:
6703 case INIT_EXPR:
6704 ret = gimplify_modify_expr (expr_p, pre_p, post_p,
6705 fallback != fb_none);
6706 break;
6707
6708 case TRUTH_ANDIF_EXPR:
6709 case TRUTH_ORIF_EXPR:
6710 /* Pass the source location of the outer expression. */
6711 ret = gimplify_boolean_expr (expr_p, saved_location);
6712 break;
6713
6714 case TRUTH_NOT_EXPR:
6715 if (TREE_CODE (TREE_TYPE (*expr_p)) != BOOLEAN_TYPE)
6716 {
6717 tree type = TREE_TYPE (*expr_p);
6718 *expr_p = fold_convert (type, gimple_boolify (*expr_p));
6719 ret = GS_OK;
6720 break;
6721 }
6722
6723 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6724 is_gimple_val, fb_rvalue);
6725 recalculate_side_effects (*expr_p);
6726 break;
6727
6728 case ADDR_EXPR:
6729 ret = gimplify_addr_expr (expr_p, pre_p, post_p);
6730 break;
6731
6732 case VA_ARG_EXPR:
6733 ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
6734 break;
6735
6736 CASE_CONVERT:
6737 if (IS_EMPTY_STMT (*expr_p))
6738 {
6739 ret = GS_ALL_DONE;
6740 break;
6741 }
6742
6743 if (VOID_TYPE_P (TREE_TYPE (*expr_p))
6744 || fallback == fb_none)
6745 {
6746 /* Just strip a conversion to void (or in void context) and
6747 try again. */
6748 *expr_p = TREE_OPERAND (*expr_p, 0);
6749 ret = GS_OK;
6750 break;
6751 }
6752
6753 ret = gimplify_conversion (expr_p);
6754 if (ret == GS_ERROR)
6755 break;
6756 if (*expr_p != save_expr)
6757 break;
6758 /* FALLTHRU */
6759
6760 case FIX_TRUNC_EXPR:
6761 /* unary_expr: ... | '(' cast ')' val | ... */
6762 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6763 is_gimple_val, fb_rvalue);
6764 recalculate_side_effects (*expr_p);
6765 break;
6766
6767 case INDIRECT_REF:
6768 *expr_p = fold_indirect_ref_loc (input_location, *expr_p);
6769 if (*expr_p != save_expr)
6770 {
6771 ret = GS_OK;
6772 break;
6773 }
6774 /* else fall through. */
6775 case ALIGN_INDIRECT_REF:
6776 case MISALIGNED_INDIRECT_REF:
6777 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6778 is_gimple_reg, fb_rvalue);
6779 recalculate_side_effects (*expr_p);
6780 break;
6781
6782 /* Constants need not be gimplified. */
6783 case INTEGER_CST:
6784 case REAL_CST:
6785 case FIXED_CST:
6786 case STRING_CST:
6787 case COMPLEX_CST:
6788 case VECTOR_CST:
6789 ret = GS_ALL_DONE;
6790 break;
6791
6792 case CONST_DECL:
6793 /* If we require an lvalue, such as for ADDR_EXPR, retain the
6794 CONST_DECL node. Otherwise the decl is replaceable by its
6795 value. */
6796 /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either. */
6797 if (fallback & fb_lvalue)
6798 ret = GS_ALL_DONE;
6799 else
6800 {
6801 *expr_p = DECL_INITIAL (*expr_p);
6802 ret = GS_OK;
6803 }
6804 break;
6805
6806 case DECL_EXPR:
6807 ret = gimplify_decl_expr (expr_p, pre_p);
6808 break;
6809
6810 case BIND_EXPR:
6811 ret = gimplify_bind_expr (expr_p, pre_p);
6812 break;
6813
6814 case LOOP_EXPR:
6815 ret = gimplify_loop_expr (expr_p, pre_p);
6816 break;
6817
6818 case SWITCH_EXPR:
6819 ret = gimplify_switch_expr (expr_p, pre_p);
6820 break;
6821
6822 case EXIT_EXPR:
6823 ret = gimplify_exit_expr (expr_p);
6824 break;
6825
6826 case GOTO_EXPR:
6827 /* If the target is not LABEL, then it is a computed jump
6828 and the target needs to be gimplified. */
6829 if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
6830 {
6831 ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
6832 NULL, is_gimple_val, fb_rvalue);
6833 if (ret == GS_ERROR)
6834 break;
6835 }
6836 gimplify_seq_add_stmt (pre_p,
6837 gimple_build_goto (GOTO_DESTINATION (*expr_p)));
6838 ret = GS_ALL_DONE;
6839 break;
6840
6841 case PREDICT_EXPR:
6842 gimplify_seq_add_stmt (pre_p,
6843 gimple_build_predict (PREDICT_EXPR_PREDICTOR (*expr_p),
6844 PREDICT_EXPR_OUTCOME (*expr_p)));
6845 ret = GS_ALL_DONE;
6846 break;
6847
6848 case LABEL_EXPR:
6849 ret = GS_ALL_DONE;
6850 gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
6851 == current_function_decl);
6852 gimplify_seq_add_stmt (pre_p,
6853 gimple_build_label (LABEL_EXPR_LABEL (*expr_p)));
6854 break;
6855
6856 case CASE_LABEL_EXPR:
6857 ret = gimplify_case_label_expr (expr_p, pre_p);
6858 break;
6859
6860 case RETURN_EXPR:
6861 ret = gimplify_return_expr (*expr_p, pre_p);
6862 break;
6863
6864 case CONSTRUCTOR:
6865 /* Don't reduce this in place; let gimplify_init_constructor work its
6866 magic. Buf if we're just elaborating this for side effects, just
6867 gimplify any element that has side-effects. */
6868 if (fallback == fb_none)
6869 {
6870 unsigned HOST_WIDE_INT ix;
6871 constructor_elt *ce;
6872 tree temp = NULL_TREE;
6873 for (ix = 0;
6874 VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
6875 ix, ce);
6876 ix++)
6877 if (TREE_SIDE_EFFECTS (ce->value))
6878 append_to_statement_list (ce->value, &temp);
6879
6880 *expr_p = temp;
6881 ret = temp ? GS_OK : GS_ALL_DONE;
6882 }
6883 /* C99 code may assign to an array in a constructed
6884 structure or union, and this has undefined behavior only
6885 on execution, so create a temporary if an lvalue is
6886 required. */
6887 else if (fallback == fb_lvalue)
6888 {
6889 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6890 mark_addressable (*expr_p);
6891 ret = GS_OK;
6892 }
6893 else
6894 ret = GS_ALL_DONE;
6895 break;
6896
6897 /* The following are special cases that are not handled by the
6898 original GIMPLE grammar. */
6899
6900 /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
6901 eliminated. */
6902 case SAVE_EXPR:
6903 ret = gimplify_save_expr (expr_p, pre_p, post_p);
6904 break;
6905
6906 case BIT_FIELD_REF:
6907 {
6908 enum gimplify_status r0, r1, r2;
6909
6910 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6911 post_p, is_gimple_lvalue, fb_either);
6912 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
6913 post_p, is_gimple_val, fb_rvalue);
6914 r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
6915 post_p, is_gimple_val, fb_rvalue);
6916 recalculate_side_effects (*expr_p);
6917
6918 ret = MIN (r0, MIN (r1, r2));
6919 }
6920 break;
6921
6922 case TARGET_MEM_REF:
6923 {
6924 enum gimplify_status r0 = GS_ALL_DONE, r1 = GS_ALL_DONE;
6925
6926 if (TMR_SYMBOL (*expr_p))
6927 r0 = gimplify_expr (&TMR_SYMBOL (*expr_p), pre_p,
6928 post_p, is_gimple_lvalue, fb_either);
6929 else if (TMR_BASE (*expr_p))
6930 r0 = gimplify_expr (&TMR_BASE (*expr_p), pre_p,
6931 post_p, is_gimple_val, fb_either);
6932 if (TMR_INDEX (*expr_p))
6933 r1 = gimplify_expr (&TMR_INDEX (*expr_p), pre_p,
6934 post_p, is_gimple_val, fb_rvalue);
6935 /* TMR_STEP and TMR_OFFSET are always integer constants. */
6936 ret = MIN (r0, r1);
6937 }
6938 break;
6939
6940 case NON_LVALUE_EXPR:
6941 /* This should have been stripped above. */
6942 gcc_unreachable ();
6943
6944 case ASM_EXPR:
6945 ret = gimplify_asm_expr (expr_p, pre_p, post_p);
6946 break;
6947
6948 case TRY_FINALLY_EXPR:
6949 case TRY_CATCH_EXPR:
6950 {
6951 gimple_seq eval, cleanup;
6952 gimple try_;
6953
6954 eval = cleanup = NULL;
6955 gimplify_and_add (TREE_OPERAND (*expr_p, 0), &eval);
6956 gimplify_and_add (TREE_OPERAND (*expr_p, 1), &cleanup);
6957 /* Don't create bogus GIMPLE_TRY with empty cleanup. */
6958 if (gimple_seq_empty_p (cleanup))
6959 {
6960 gimple_seq_add_seq (pre_p, eval);
6961 ret = GS_ALL_DONE;
6962 break;
6963 }
6964 try_ = gimple_build_try (eval, cleanup,
6965 TREE_CODE (*expr_p) == TRY_FINALLY_EXPR
6966 ? GIMPLE_TRY_FINALLY
6967 : GIMPLE_TRY_CATCH);
6968 if (TREE_CODE (*expr_p) == TRY_CATCH_EXPR)
6969 gimple_try_set_catch_is_cleanup (try_,
6970 TRY_CATCH_IS_CLEANUP (*expr_p));
6971 gimplify_seq_add_stmt (pre_p, try_);
6972 ret = GS_ALL_DONE;
6973 break;
6974 }
6975
6976 case CLEANUP_POINT_EXPR:
6977 ret = gimplify_cleanup_point_expr (expr_p, pre_p);
6978 break;
6979
6980 case TARGET_EXPR:
6981 ret = gimplify_target_expr (expr_p, pre_p, post_p);
6982 break;
6983
6984 case CATCH_EXPR:
6985 {
6986 gimple c;
6987 gimple_seq handler = NULL;
6988 gimplify_and_add (CATCH_BODY (*expr_p), &handler);
6989 c = gimple_build_catch (CATCH_TYPES (*expr_p), handler);
6990 gimplify_seq_add_stmt (pre_p, c);
6991 ret = GS_ALL_DONE;
6992 break;
6993 }
6994
6995 case EH_FILTER_EXPR:
6996 {
6997 gimple ehf;
6998 gimple_seq failure = NULL;
6999
7000 gimplify_and_add (EH_FILTER_FAILURE (*expr_p), &failure);
7001 ehf = gimple_build_eh_filter (EH_FILTER_TYPES (*expr_p), failure);
7002 gimple_set_no_warning (ehf, TREE_NO_WARNING (*expr_p));
7003 gimplify_seq_add_stmt (pre_p, ehf);
7004 ret = GS_ALL_DONE;
7005 break;
7006 }
7007
7008 case OBJ_TYPE_REF:
7009 {
7010 enum gimplify_status r0, r1;
7011 r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p,
7012 post_p, is_gimple_val, fb_rvalue);
7013 r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p,
7014 post_p, is_gimple_val, fb_rvalue);
7015 TREE_SIDE_EFFECTS (*expr_p) = 0;
7016 ret = MIN (r0, r1);
7017 }
7018 break;
7019
7020 case LABEL_DECL:
7021 /* We get here when taking the address of a label. We mark
7022 the label as "forced"; meaning it can never be removed and
7023 it is a potential target for any computed goto. */
7024 FORCED_LABEL (*expr_p) = 1;
7025 ret = GS_ALL_DONE;
7026 break;
7027
7028 case STATEMENT_LIST:
7029 ret = gimplify_statement_list (expr_p, pre_p);
7030 break;
7031
7032 case WITH_SIZE_EXPR:
7033 {
7034 gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7035 post_p == &internal_post ? NULL : post_p,
7036 gimple_test_f, fallback);
7037 gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
7038 is_gimple_val, fb_rvalue);
7039 ret = GS_ALL_DONE;
7040 }
7041 break;
7042
7043 case VAR_DECL:
7044 case PARM_DECL:
7045 ret = gimplify_var_or_parm_decl (expr_p);
7046 break;
7047
7048 case RESULT_DECL:
7049 /* When within an OpenMP context, notice uses of variables. */
7050 if (gimplify_omp_ctxp)
7051 omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
7052 ret = GS_ALL_DONE;
7053 break;
7054
7055 case SSA_NAME:
7056 /* Allow callbacks into the gimplifier during optimization. */
7057 ret = GS_ALL_DONE;
7058 break;
7059
7060 case OMP_PARALLEL:
7061 gimplify_omp_parallel (expr_p, pre_p);
7062 ret = GS_ALL_DONE;
7063 break;
7064
7065 case OMP_TASK:
7066 gimplify_omp_task (expr_p, pre_p);
7067 ret = GS_ALL_DONE;
7068 break;
7069
7070 case OMP_FOR:
7071 ret = gimplify_omp_for (expr_p, pre_p);
7072 break;
7073
7074 case OMP_SECTIONS:
7075 case OMP_SINGLE:
7076 gimplify_omp_workshare (expr_p, pre_p);
7077 ret = GS_ALL_DONE;
7078 break;
7079
7080 case OMP_SECTION:
7081 case OMP_MASTER:
7082 case OMP_ORDERED:
7083 case OMP_CRITICAL:
7084 {
7085 gimple_seq body = NULL;
7086 gimple g;
7087
7088 gimplify_and_add (OMP_BODY (*expr_p), &body);
7089 switch (TREE_CODE (*expr_p))
7090 {
7091 case OMP_SECTION:
7092 g = gimple_build_omp_section (body);
7093 break;
7094 case OMP_MASTER:
7095 g = gimple_build_omp_master (body);
7096 break;
7097 case OMP_ORDERED:
7098 g = gimple_build_omp_ordered (body);
7099 break;
7100 case OMP_CRITICAL:
7101 g = gimple_build_omp_critical (body,
7102 OMP_CRITICAL_NAME (*expr_p));
7103 break;
7104 default:
7105 gcc_unreachable ();
7106 }
7107 gimplify_seq_add_stmt (pre_p, g);
7108 ret = GS_ALL_DONE;
7109 break;
7110 }
7111
7112 case OMP_ATOMIC:
7113 ret = gimplify_omp_atomic (expr_p, pre_p);
7114 break;
7115
7116 case POINTER_PLUS_EXPR:
7117 /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
7118 The second is gimple immediate saving a need for extra statement.
7119 */
7120 if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
7121 && (tmp = maybe_fold_offset_to_address
7122 (EXPR_LOCATION (*expr_p),
7123 TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
7124 TREE_TYPE (*expr_p))))
7125 {
7126 *expr_p = tmp;
7127 ret = GS_OK;
7128 break;
7129 }
7130 /* Convert (void *)&a + 4 into (void *)&a[1]. */
7131 if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
7132 && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
7133 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
7134 0),0)))
7135 && (tmp = maybe_fold_offset_to_address
7136 (EXPR_LOCATION (*expr_p),
7137 TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
7138 TREE_OPERAND (*expr_p, 1),
7139 TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
7140 0)))))
7141 {
7142 *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
7143 ret = GS_OK;
7144 break;
7145 }
7146 /* FALLTHRU */
7147
7148 default:
7149 switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
7150 {
7151 case tcc_comparison:
7152 /* Handle comparison of objects of non scalar mode aggregates
7153 with a call to memcmp. It would be nice to only have to do
7154 this for variable-sized objects, but then we'd have to allow
7155 the same nest of reference nodes we allow for MODIFY_EXPR and
7156 that's too complex.
7157
7158 Compare scalar mode aggregates as scalar mode values. Using
7159 memcmp for them would be very inefficient at best, and is
7160 plain wrong if bitfields are involved. */
7161 {
7162 tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
7163
7164 if (!AGGREGATE_TYPE_P (type))
7165 goto expr_2;
7166 else if (TYPE_MODE (type) != BLKmode)
7167 ret = gimplify_scalar_mode_aggregate_compare (expr_p);
7168 else
7169 ret = gimplify_variable_sized_compare (expr_p);
7170
7171 break;
7172 }
7173
7174 /* If *EXPR_P does not need to be special-cased, handle it
7175 according to its class. */
7176 case tcc_unary:
7177 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7178 post_p, is_gimple_val, fb_rvalue);
7179 break;
7180
7181 case tcc_binary:
7182 expr_2:
7183 {
7184 enum gimplify_status r0, r1;
7185
7186 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7187 post_p, is_gimple_val, fb_rvalue);
7188 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7189 post_p, is_gimple_val, fb_rvalue);
7190
7191 ret = MIN (r0, r1);
7192 break;
7193 }
7194
7195 case tcc_declaration:
7196 case tcc_constant:
7197 ret = GS_ALL_DONE;
7198 goto dont_recalculate;
7199
7200 default:
7201 gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
7202 || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
7203 || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
7204 goto expr_2;
7205 }
7206
7207 recalculate_side_effects (*expr_p);
7208
7209 dont_recalculate:
7210 break;
7211 }
7212
7213 gcc_assert (*expr_p || ret != GS_OK);
7214 }
7215 while (ret == GS_OK);
7216
7217 /* If we encountered an error_mark somewhere nested inside, either
7218 stub out the statement or propagate the error back out. */
7219 if (ret == GS_ERROR)
7220 {
7221 if (is_statement)
7222 *expr_p = NULL;
7223 goto out;
7224 }
7225
7226 /* This was only valid as a return value from the langhook, which
7227 we handled. Make sure it doesn't escape from any other context. */
7228 gcc_assert (ret != GS_UNHANDLED);
7229
7230 if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
7231 {
7232 /* We aren't looking for a value, and we don't have a valid
7233 statement. If it doesn't have side-effects, throw it away. */
7234 if (!TREE_SIDE_EFFECTS (*expr_p))
7235 *expr_p = NULL;
7236 else if (!TREE_THIS_VOLATILE (*expr_p))
7237 {
7238 /* This is probably a _REF that contains something nested that
7239 has side effects. Recurse through the operands to find it. */
7240 enum tree_code code = TREE_CODE (*expr_p);
7241
7242 switch (code)
7243 {
7244 case COMPONENT_REF:
7245 case REALPART_EXPR:
7246 case IMAGPART_EXPR:
7247 case VIEW_CONVERT_EXPR:
7248 gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7249 gimple_test_f, fallback);
7250 break;
7251
7252 case ARRAY_REF:
7253 case ARRAY_RANGE_REF:
7254 gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7255 gimple_test_f, fallback);
7256 gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
7257 gimple_test_f, fallback);
7258 break;
7259
7260 default:
7261 /* Anything else with side-effects must be converted to
7262 a valid statement before we get here. */
7263 gcc_unreachable ();
7264 }
7265
7266 *expr_p = NULL;
7267 }
7268 else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
7269 && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
7270 {
7271 /* Historically, the compiler has treated a bare reference
7272 to a non-BLKmode volatile lvalue as forcing a load. */
7273 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
7274
7275 /* Normally, we do not want to create a temporary for a
7276 TREE_ADDRESSABLE type because such a type should not be
7277 copied by bitwise-assignment. However, we make an
7278 exception here, as all we are doing here is ensuring that
7279 we read the bytes that make up the type. We use
7280 create_tmp_var_raw because create_tmp_var will abort when
7281 given a TREE_ADDRESSABLE type. */
7282 tree tmp = create_tmp_var_raw (type, "vol");
7283 gimple_add_tmp_var (tmp);
7284 gimplify_assign (tmp, *expr_p, pre_p);
7285 *expr_p = NULL;
7286 }
7287 else
7288 /* We can't do anything useful with a volatile reference to
7289 an incomplete type, so just throw it away. Likewise for
7290 a BLKmode type, since any implicit inner load should
7291 already have been turned into an explicit one by the
7292 gimplification process. */
7293 *expr_p = NULL;
7294 }
7295
7296 /* If we are gimplifying at the statement level, we're done. Tack
7297 everything together and return. */
7298 if (fallback == fb_none || is_statement)
7299 {
7300 /* Since *EXPR_P has been converted into a GIMPLE tuple, clear
7301 it out for GC to reclaim it. */
7302 *expr_p = NULL_TREE;
7303
7304 if (!gimple_seq_empty_p (internal_pre)
7305 || !gimple_seq_empty_p (internal_post))
7306 {
7307 gimplify_seq_add_seq (&internal_pre, internal_post);
7308 gimplify_seq_add_seq (pre_p, internal_pre);
7309 }
7310
7311 /* The result of gimplifying *EXPR_P is going to be the last few
7312 statements in *PRE_P and *POST_P. Add location information
7313 to all the statements that were added by the gimplification
7314 helpers. */
7315 if (!gimple_seq_empty_p (*pre_p))
7316 annotate_all_with_location_after (*pre_p, pre_last_gsi, input_location);
7317
7318 if (!gimple_seq_empty_p (*post_p))
7319 annotate_all_with_location_after (*post_p, post_last_gsi,
7320 input_location);
7321
7322 goto out;
7323 }
7324
7325 #ifdef ENABLE_GIMPLE_CHECKING
7326 if (*expr_p)
7327 {
7328 enum tree_code code = TREE_CODE (*expr_p);
7329 /* These expressions should already be in gimple IR form. */
7330 gcc_assert (code != MODIFY_EXPR
7331 && code != ASM_EXPR
7332 && code != BIND_EXPR
7333 && code != CATCH_EXPR
7334 && (code != COND_EXPR || gimplify_ctxp->allow_rhs_cond_expr)
7335 && code != EH_FILTER_EXPR
7336 && code != GOTO_EXPR
7337 && code != LABEL_EXPR
7338 && code != LOOP_EXPR
7339 && code != SWITCH_EXPR
7340 && code != TRY_FINALLY_EXPR
7341 && code != OMP_CRITICAL
7342 && code != OMP_FOR
7343 && code != OMP_MASTER
7344 && code != OMP_ORDERED
7345 && code != OMP_PARALLEL
7346 && code != OMP_SECTIONS
7347 && code != OMP_SECTION
7348 && code != OMP_SINGLE);
7349 }
7350 #endif
7351
7352 /* Otherwise we're gimplifying a subexpression, so the resulting
7353 value is interesting. If it's a valid operand that matches
7354 GIMPLE_TEST_F, we're done. Unless we are handling some
7355 post-effects internally; if that's the case, we need to copy into
7356 a temporary before adding the post-effects to POST_P. */
7357 if (gimple_seq_empty_p (internal_post) && (*gimple_test_f) (*expr_p))
7358 goto out;
7359
7360 /* Otherwise, we need to create a new temporary for the gimplified
7361 expression. */
7362
7363 /* We can't return an lvalue if we have an internal postqueue. The
7364 object the lvalue refers to would (probably) be modified by the
7365 postqueue; we need to copy the value out first, which means an
7366 rvalue. */
7367 if ((fallback & fb_lvalue)
7368 && gimple_seq_empty_p (internal_post)
7369 && is_gimple_addressable (*expr_p))
7370 {
7371 /* An lvalue will do. Take the address of the expression, store it
7372 in a temporary, and replace the expression with an INDIRECT_REF of
7373 that temporary. */
7374 tmp = build_fold_addr_expr_loc (input_location, *expr_p);
7375 gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
7376 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
7377 }
7378 else if ((fallback & fb_rvalue) && is_gimple_reg_rhs_or_call (*expr_p))
7379 {
7380 /* An rvalue will do. Assign the gimplified expression into a
7381 new temporary TMP and replace the original expression with
7382 TMP. First, make sure that the expression has a type so that
7383 it can be assigned into a temporary. */
7384 gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
7385
7386 if (!gimple_seq_empty_p (internal_post) || (fallback & fb_lvalue))
7387 /* The postqueue might change the value of the expression between
7388 the initialization and use of the temporary, so we can't use a
7389 formal temp. FIXME do we care? */
7390 {
7391 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
7392 if (TREE_CODE (TREE_TYPE (*expr_p)) == COMPLEX_TYPE
7393 || TREE_CODE (TREE_TYPE (*expr_p)) == VECTOR_TYPE)
7394 DECL_GIMPLE_REG_P (*expr_p) = 1;
7395 }
7396 else
7397 *expr_p = get_formal_tmp_var (*expr_p, pre_p);
7398 }
7399 else
7400 {
7401 #ifdef ENABLE_GIMPLE_CHECKING
7402 if (!(fallback & fb_mayfail))
7403 {
7404 fprintf (stderr, "gimplification failed:\n");
7405 print_generic_expr (stderr, *expr_p, 0);
7406 debug_tree (*expr_p);
7407 internal_error ("gimplification failed");
7408 }
7409 #endif
7410 gcc_assert (fallback & fb_mayfail);
7411
7412 /* If this is an asm statement, and the user asked for the
7413 impossible, don't die. Fail and let gimplify_asm_expr
7414 issue an error. */
7415 ret = GS_ERROR;
7416 goto out;
7417 }
7418
7419 /* Make sure the temporary matches our predicate. */
7420 gcc_assert ((*gimple_test_f) (*expr_p));
7421
7422 if (!gimple_seq_empty_p (internal_post))
7423 {
7424 annotate_all_with_location (internal_post, input_location);
7425 gimplify_seq_add_seq (pre_p, internal_post);
7426 }
7427
7428 out:
7429 input_location = saved_location;
7430 return ret;
7431 }
7432
7433 /* Look through TYPE for variable-sized objects and gimplify each such
7434 size that we find. Add to LIST_P any statements generated. */
7435
7436 void
7437 gimplify_type_sizes (tree type, gimple_seq *list_p)
7438 {
7439 tree field, t;
7440
7441 if (type == NULL || type == error_mark_node)
7442 return;
7443
7444 /* We first do the main variant, then copy into any other variants. */
7445 type = TYPE_MAIN_VARIANT (type);
7446
7447 /* Avoid infinite recursion. */
7448 if (TYPE_SIZES_GIMPLIFIED (type))
7449 return;
7450
7451 TYPE_SIZES_GIMPLIFIED (type) = 1;
7452
7453 switch (TREE_CODE (type))
7454 {
7455 case INTEGER_TYPE:
7456 case ENUMERAL_TYPE:
7457 case BOOLEAN_TYPE:
7458 case REAL_TYPE:
7459 case FIXED_POINT_TYPE:
7460 gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
7461 gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
7462
7463 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7464 {
7465 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
7466 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
7467 }
7468 break;
7469
7470 case ARRAY_TYPE:
7471 /* These types may not have declarations, so handle them here. */
7472 gimplify_type_sizes (TREE_TYPE (type), list_p);
7473 gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
7474 /* Ensure VLA bounds aren't removed, for -O0 they should be variables
7475 with assigned stack slots, for -O1+ -g they should be tracked
7476 by VTA. */
7477 if (TYPE_DOMAIN (type)
7478 && INTEGRAL_TYPE_P (TYPE_DOMAIN (type)))
7479 {
7480 t = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
7481 if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7482 DECL_IGNORED_P (t) = 0;
7483 t = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
7484 if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7485 DECL_IGNORED_P (t) = 0;
7486 }
7487 break;
7488
7489 case RECORD_TYPE:
7490 case UNION_TYPE:
7491 case QUAL_UNION_TYPE:
7492 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
7493 if (TREE_CODE (field) == FIELD_DECL)
7494 {
7495 gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
7496 gimplify_one_sizepos (&DECL_SIZE (field), list_p);
7497 gimplify_one_sizepos (&DECL_SIZE_UNIT (field), list_p);
7498 gimplify_type_sizes (TREE_TYPE (field), list_p);
7499 }
7500 break;
7501
7502 case POINTER_TYPE:
7503 case REFERENCE_TYPE:
7504 /* We used to recurse on the pointed-to type here, which turned out to
7505 be incorrect because its definition might refer to variables not
7506 yet initialized at this point if a forward declaration is involved.
7507
7508 It was actually useful for anonymous pointed-to types to ensure
7509 that the sizes evaluation dominates every possible later use of the
7510 values. Restricting to such types here would be safe since there
7511 is no possible forward declaration around, but would introduce an
7512 undesirable middle-end semantic to anonymity. We then defer to
7513 front-ends the responsibility of ensuring that the sizes are
7514 evaluated both early and late enough, e.g. by attaching artificial
7515 type declarations to the tree. */
7516 break;
7517
7518 default:
7519 break;
7520 }
7521
7522 gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
7523 gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
7524
7525 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7526 {
7527 TYPE_SIZE (t) = TYPE_SIZE (type);
7528 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
7529 TYPE_SIZES_GIMPLIFIED (t) = 1;
7530 }
7531 }
7532
7533 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
7534 a size or position, has had all of its SAVE_EXPRs evaluated.
7535 We add any required statements to *STMT_P. */
7536
7537 void
7538 gimplify_one_sizepos (tree *expr_p, gimple_seq *stmt_p)
7539 {
7540 tree type, expr = *expr_p;
7541
7542 /* We don't do anything if the value isn't there, is constant, or contains
7543 A PLACEHOLDER_EXPR. We also don't want to do anything if it's already
7544 a VAR_DECL. If it's a VAR_DECL from another function, the gimplifier
7545 will want to replace it with a new variable, but that will cause problems
7546 if this type is from outside the function. It's OK to have that here. */
7547 if (expr == NULL_TREE || TREE_CONSTANT (expr)
7548 || TREE_CODE (expr) == VAR_DECL
7549 || CONTAINS_PLACEHOLDER_P (expr))
7550 return;
7551
7552 type = TREE_TYPE (expr);
7553 *expr_p = unshare_expr (expr);
7554
7555 gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
7556 expr = *expr_p;
7557
7558 /* Verify that we've an exact type match with the original expression.
7559 In particular, we do not wish to drop a "sizetype" in favour of a
7560 type of similar dimensions. We don't want to pollute the generic
7561 type-stripping code with this knowledge because it doesn't matter
7562 for the bulk of GENERIC/GIMPLE. It only matters that TYPE_SIZE_UNIT
7563 and friends retain their "sizetype-ness". */
7564 if (TREE_TYPE (expr) != type
7565 && TREE_CODE (type) == INTEGER_TYPE
7566 && TYPE_IS_SIZETYPE (type))
7567 {
7568 tree tmp;
7569 gimple stmt;
7570
7571 *expr_p = create_tmp_var (type, NULL);
7572 tmp = build1 (NOP_EXPR, type, expr);
7573 stmt = gimplify_assign (*expr_p, tmp, stmt_p);
7574 if (EXPR_HAS_LOCATION (expr))
7575 gimple_set_location (stmt, EXPR_LOCATION (expr));
7576 else
7577 gimple_set_location (stmt, input_location);
7578 }
7579 }
7580
7581
7582 /* Gimplify the body of statements pointed to by BODY_P and return a
7583 GIMPLE_BIND containing the sequence of GIMPLE statements
7584 corresponding to BODY_P. FNDECL is the function decl containing
7585 *BODY_P. */
7586
7587 gimple
7588 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
7589 {
7590 location_t saved_location = input_location;
7591 gimple_seq parm_stmts, seq;
7592 gimple outer_bind;
7593 struct gimplify_ctx gctx;
7594
7595 timevar_push (TV_TREE_GIMPLIFY);
7596
7597 /* Initialize for optimize_insn_for_s{ize,peed}_p possibly called during
7598 gimplification. */
7599 default_rtl_profile ();
7600
7601 gcc_assert (gimplify_ctxp == NULL);
7602 push_gimplify_context (&gctx);
7603
7604 /* Unshare most shared trees in the body and in that of any nested functions.
7605 It would seem we don't have to do this for nested functions because
7606 they are supposed to be output and then the outer function gimplified
7607 first, but the g++ front end doesn't always do it that way. */
7608 unshare_body (body_p, fndecl);
7609 unvisit_body (body_p, fndecl);
7610
7611 if (cgraph_node (fndecl)->origin)
7612 nonlocal_vlas = pointer_set_create ();
7613
7614 /* Make sure input_location isn't set to something weird. */
7615 input_location = DECL_SOURCE_LOCATION (fndecl);
7616
7617 /* Resolve callee-copies. This has to be done before processing
7618 the body so that DECL_VALUE_EXPR gets processed correctly. */
7619 parm_stmts = (do_parms) ? gimplify_parameters () : NULL;
7620
7621 /* Gimplify the function's body. */
7622 seq = NULL;
7623 gimplify_stmt (body_p, &seq);
7624 outer_bind = gimple_seq_first_stmt (seq);
7625 if (!outer_bind)
7626 {
7627 outer_bind = gimple_build_nop ();
7628 gimplify_seq_add_stmt (&seq, outer_bind);
7629 }
7630
7631 /* The body must contain exactly one statement, a GIMPLE_BIND. If this is
7632 not the case, wrap everything in a GIMPLE_BIND to make it so. */
7633 if (gimple_code (outer_bind) == GIMPLE_BIND
7634 && gimple_seq_first (seq) == gimple_seq_last (seq))
7635 ;
7636 else
7637 outer_bind = gimple_build_bind (NULL_TREE, seq, NULL);
7638
7639 *body_p = NULL_TREE;
7640
7641 /* If we had callee-copies statements, insert them at the beginning
7642 of the function and clear DECL_VALUE_EXPR_P on the parameters. */
7643 if (!gimple_seq_empty_p (parm_stmts))
7644 {
7645 tree parm;
7646
7647 gimplify_seq_add_seq (&parm_stmts, gimple_bind_body (outer_bind));
7648 gimple_bind_set_body (outer_bind, parm_stmts);
7649
7650 for (parm = DECL_ARGUMENTS (current_function_decl);
7651 parm; parm = TREE_CHAIN (parm))
7652 if (DECL_HAS_VALUE_EXPR_P (parm))
7653 {
7654 DECL_HAS_VALUE_EXPR_P (parm) = 0;
7655 DECL_IGNORED_P (parm) = 0;
7656 }
7657 }
7658
7659 if (nonlocal_vlas)
7660 {
7661 pointer_set_destroy (nonlocal_vlas);
7662 nonlocal_vlas = NULL;
7663 }
7664
7665 pop_gimplify_context (outer_bind);
7666 gcc_assert (gimplify_ctxp == NULL);
7667
7668 #ifdef ENABLE_TYPES_CHECKING
7669 if (!seen_error ())
7670 verify_types_in_gimple_seq (gimple_bind_body (outer_bind));
7671 #endif
7672
7673 timevar_pop (TV_TREE_GIMPLIFY);
7674 input_location = saved_location;
7675
7676 return outer_bind;
7677 }
7678
7679 /* Entry point to the gimplification pass. FNDECL is the FUNCTION_DECL
7680 node for the function we want to gimplify.
7681
7682 Returns the sequence of GIMPLE statements corresponding to the body
7683 of FNDECL. */
7684
7685 void
7686 gimplify_function_tree (tree fndecl)
7687 {
7688 tree oldfn, parm, ret;
7689 gimple_seq seq;
7690 gimple bind;
7691
7692 gcc_assert (!gimple_body (fndecl));
7693
7694 oldfn = current_function_decl;
7695 current_function_decl = fndecl;
7696 if (DECL_STRUCT_FUNCTION (fndecl))
7697 push_cfun (DECL_STRUCT_FUNCTION (fndecl));
7698 else
7699 push_struct_function (fndecl);
7700
7701 for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
7702 {
7703 /* Preliminarily mark non-addressed complex variables as eligible
7704 for promotion to gimple registers. We'll transform their uses
7705 as we find them. */
7706 if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
7707 || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
7708 && !TREE_THIS_VOLATILE (parm)
7709 && !needs_to_live_in_memory (parm))
7710 DECL_GIMPLE_REG_P (parm) = 1;
7711 }
7712
7713 ret = DECL_RESULT (fndecl);
7714 if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
7715 || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
7716 && !needs_to_live_in_memory (ret))
7717 DECL_GIMPLE_REG_P (ret) = 1;
7718
7719 bind = gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
7720
7721 /* The tree body of the function is no longer needed, replace it
7722 with the new GIMPLE body. */
7723 seq = gimple_seq_alloc ();
7724 gimple_seq_add_stmt (&seq, bind);
7725 gimple_set_body (fndecl, seq);
7726
7727 /* If we're instrumenting function entry/exit, then prepend the call to
7728 the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
7729 catch the exit hook. */
7730 /* ??? Add some way to ignore exceptions for this TFE. */
7731 if (flag_instrument_function_entry_exit
7732 && !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
7733 && !flag_instrument_functions_exclude_p (fndecl))
7734 {
7735 tree x;
7736 gimple new_bind;
7737 gimple tf;
7738 gimple_seq cleanup = NULL, body = NULL;
7739
7740 x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
7741 gimplify_seq_add_stmt (&cleanup, gimple_build_call (x, 0));
7742 tf = gimple_build_try (seq, cleanup, GIMPLE_TRY_FINALLY);
7743
7744 x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
7745 gimplify_seq_add_stmt (&body, gimple_build_call (x, 0));
7746 gimplify_seq_add_stmt (&body, tf);
7747 new_bind = gimple_build_bind (NULL, body, gimple_bind_block (bind));
7748 /* Clear the block for BIND, since it is no longer directly inside
7749 the function, but within a try block. */
7750 gimple_bind_set_block (bind, NULL);
7751
7752 /* Replace the current function body with the body
7753 wrapped in the try/finally TF. */
7754 seq = gimple_seq_alloc ();
7755 gimple_seq_add_stmt (&seq, new_bind);
7756 gimple_set_body (fndecl, seq);
7757 }
7758
7759 DECL_SAVED_TREE (fndecl) = NULL_TREE;
7760 cfun->curr_properties = PROP_gimple_any;
7761
7762 current_function_decl = oldfn;
7763 pop_cfun ();
7764 }
7765
7766
7767 /* Some transformations like inlining may invalidate the GIMPLE form
7768 for operands. This function traverses all the operands in STMT and
7769 gimplifies anything that is not a valid gimple operand. Any new
7770 GIMPLE statements are inserted before *GSI_P. */
7771
7772 void
7773 gimple_regimplify_operands (gimple stmt, gimple_stmt_iterator *gsi_p)
7774 {
7775 size_t i, num_ops;
7776 tree orig_lhs = NULL_TREE, lhs, t;
7777 gimple_seq pre = NULL;
7778 gimple post_stmt = NULL;
7779 struct gimplify_ctx gctx;
7780
7781 push_gimplify_context (&gctx);
7782 gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7783
7784 switch (gimple_code (stmt))
7785 {
7786 case GIMPLE_COND:
7787 gimplify_expr (gimple_cond_lhs_ptr (stmt), &pre, NULL,
7788 is_gimple_val, fb_rvalue);
7789 gimplify_expr (gimple_cond_rhs_ptr (stmt), &pre, NULL,
7790 is_gimple_val, fb_rvalue);
7791 break;
7792 case GIMPLE_SWITCH:
7793 gimplify_expr (gimple_switch_index_ptr (stmt), &pre, NULL,
7794 is_gimple_val, fb_rvalue);
7795 break;
7796 case GIMPLE_OMP_ATOMIC_LOAD:
7797 gimplify_expr (gimple_omp_atomic_load_rhs_ptr (stmt), &pre, NULL,
7798 is_gimple_val, fb_rvalue);
7799 break;
7800 case GIMPLE_ASM:
7801 {
7802 size_t i, noutputs = gimple_asm_noutputs (stmt);
7803 const char *constraint, **oconstraints;
7804 bool allows_mem, allows_reg, is_inout;
7805
7806 oconstraints
7807 = (const char **) alloca ((noutputs) * sizeof (const char *));
7808 for (i = 0; i < noutputs; i++)
7809 {
7810 tree op = gimple_asm_output_op (stmt, i);
7811 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7812 oconstraints[i] = constraint;
7813 parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
7814 &allows_reg, &is_inout);
7815 gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7816 is_inout ? is_gimple_min_lval : is_gimple_lvalue,
7817 fb_lvalue | fb_mayfail);
7818 }
7819 for (i = 0; i < gimple_asm_ninputs (stmt); i++)
7820 {
7821 tree op = gimple_asm_input_op (stmt, i);
7822 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7823 parse_input_constraint (&constraint, 0, 0, noutputs, 0,
7824 oconstraints, &allows_mem, &allows_reg);
7825 if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (op))) && allows_mem)
7826 allows_reg = 0;
7827 if (!allows_reg && allows_mem)
7828 gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7829 is_gimple_lvalue, fb_lvalue | fb_mayfail);
7830 else
7831 gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7832 is_gimple_asm_val, fb_rvalue);
7833 }
7834 }
7835 break;
7836 default:
7837 /* NOTE: We start gimplifying operands from last to first to
7838 make sure that side-effects on the RHS of calls, assignments
7839 and ASMs are executed before the LHS. The ordering is not
7840 important for other statements. */
7841 num_ops = gimple_num_ops (stmt);
7842 orig_lhs = gimple_get_lhs (stmt);
7843 for (i = num_ops; i > 0; i--)
7844 {
7845 tree op = gimple_op (stmt, i - 1);
7846 if (op == NULL_TREE)
7847 continue;
7848 if (i == 1 && (is_gimple_call (stmt) || is_gimple_assign (stmt)))
7849 gimplify_expr (&op, &pre, NULL, is_gimple_lvalue, fb_lvalue);
7850 else if (i == 2
7851 && is_gimple_assign (stmt)
7852 && num_ops == 2
7853 && get_gimple_rhs_class (gimple_expr_code (stmt))
7854 == GIMPLE_SINGLE_RHS)
7855 gimplify_expr (&op, &pre, NULL,
7856 rhs_predicate_for (gimple_assign_lhs (stmt)),
7857 fb_rvalue);
7858 else if (i == 2 && is_gimple_call (stmt))
7859 {
7860 if (TREE_CODE (op) == FUNCTION_DECL)
7861 continue;
7862 gimplify_expr (&op, &pre, NULL, is_gimple_call_addr, fb_rvalue);
7863 }
7864 else
7865 gimplify_expr (&op, &pre, NULL, is_gimple_val, fb_rvalue);
7866 gimple_set_op (stmt, i - 1, op);
7867 }
7868
7869 lhs = gimple_get_lhs (stmt);
7870 /* If the LHS changed it in a way that requires a simple RHS,
7871 create temporary. */
7872 if (lhs && !is_gimple_reg (lhs))
7873 {
7874 bool need_temp = false;
7875
7876 if (is_gimple_assign (stmt)
7877 && num_ops == 2
7878 && get_gimple_rhs_class (gimple_expr_code (stmt))
7879 == GIMPLE_SINGLE_RHS)
7880 gimplify_expr (gimple_assign_rhs1_ptr (stmt), &pre, NULL,
7881 rhs_predicate_for (gimple_assign_lhs (stmt)),
7882 fb_rvalue);
7883 else if (is_gimple_reg (lhs))
7884 {
7885 if (is_gimple_reg_type (TREE_TYPE (lhs)))
7886 {
7887 if (is_gimple_call (stmt))
7888 {
7889 i = gimple_call_flags (stmt);
7890 if ((i & ECF_LOOPING_CONST_OR_PURE)
7891 || !(i & (ECF_CONST | ECF_PURE)))
7892 need_temp = true;
7893 }
7894 if (stmt_can_throw_internal (stmt))
7895 need_temp = true;
7896 }
7897 }
7898 else
7899 {
7900 if (is_gimple_reg_type (TREE_TYPE (lhs)))
7901 need_temp = true;
7902 else if (TYPE_MODE (TREE_TYPE (lhs)) != BLKmode)
7903 {
7904 if (is_gimple_call (stmt))
7905 {
7906 tree fndecl = gimple_call_fndecl (stmt);
7907
7908 if (!aggregate_value_p (TREE_TYPE (lhs), fndecl)
7909 && !(fndecl && DECL_RESULT (fndecl)
7910 && DECL_BY_REFERENCE (DECL_RESULT (fndecl))))
7911 need_temp = true;
7912 }
7913 else
7914 need_temp = true;
7915 }
7916 }
7917 if (need_temp)
7918 {
7919 tree temp = create_tmp_reg (TREE_TYPE (lhs), NULL);
7920
7921 if (TREE_CODE (orig_lhs) == SSA_NAME)
7922 orig_lhs = SSA_NAME_VAR (orig_lhs);
7923
7924 if (gimple_in_ssa_p (cfun))
7925 temp = make_ssa_name (temp, NULL);
7926 gimple_set_lhs (stmt, temp);
7927 post_stmt = gimple_build_assign (lhs, temp);
7928 if (TREE_CODE (lhs) == SSA_NAME)
7929 SSA_NAME_DEF_STMT (lhs) = post_stmt;
7930 }
7931 }
7932 break;
7933 }
7934
7935 if (gimple_referenced_vars (cfun))
7936 for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7937 add_referenced_var (t);
7938
7939 if (!gimple_seq_empty_p (pre))
7940 {
7941 if (gimple_in_ssa_p (cfun))
7942 {
7943 gimple_stmt_iterator i;
7944
7945 for (i = gsi_start (pre); !gsi_end_p (i); gsi_next (&i))
7946 mark_symbols_for_renaming (gsi_stmt (i));
7947 }
7948 gsi_insert_seq_before (gsi_p, pre, GSI_SAME_STMT);
7949 }
7950 if (post_stmt)
7951 gsi_insert_after (gsi_p, post_stmt, GSI_NEW_STMT);
7952
7953 pop_gimplify_context (NULL);
7954 }
7955
7956
7957 /* Expands EXPR to list of gimple statements STMTS. If SIMPLE is true,
7958 force the result to be either ssa_name or an invariant, otherwise
7959 just force it to be a rhs expression. If VAR is not NULL, make the
7960 base variable of the final destination be VAR if suitable. */
7961
7962 tree
7963 force_gimple_operand (tree expr, gimple_seq *stmts, bool simple, tree var)
7964 {
7965 tree t;
7966 enum gimplify_status ret;
7967 gimple_predicate gimple_test_f;
7968 struct gimplify_ctx gctx;
7969
7970 *stmts = NULL;
7971
7972 if (is_gimple_val (expr))
7973 return expr;
7974
7975 gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
7976
7977 push_gimplify_context (&gctx);
7978 gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7979 gimplify_ctxp->allow_rhs_cond_expr = true;
7980
7981 if (var)
7982 expr = build2 (MODIFY_EXPR, TREE_TYPE (var), var, expr);
7983
7984 if (TREE_CODE (expr) != MODIFY_EXPR
7985 && TREE_TYPE (expr) == void_type_node)
7986 {
7987 gimplify_and_add (expr, stmts);
7988 expr = NULL_TREE;
7989 }
7990 else
7991 {
7992 ret = gimplify_expr (&expr, stmts, NULL, gimple_test_f, fb_rvalue);
7993 gcc_assert (ret != GS_ERROR);
7994 }
7995
7996 if (gimple_referenced_vars (cfun))
7997 for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7998 add_referenced_var (t);
7999
8000 pop_gimplify_context (NULL);
8001
8002 return expr;
8003 }
8004
8005 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR. If
8006 some statements are produced, emits them at GSI. If BEFORE is true.
8007 the statements are appended before GSI, otherwise they are appended after
8008 it. M specifies the way GSI moves after insertion (GSI_SAME_STMT or
8009 GSI_CONTINUE_LINKING are the usual values). */
8010
8011 tree
8012 force_gimple_operand_gsi (gimple_stmt_iterator *gsi, tree expr,
8013 bool simple_p, tree var, bool before,
8014 enum gsi_iterator_update m)
8015 {
8016 gimple_seq stmts;
8017
8018 expr = force_gimple_operand (expr, &stmts, simple_p, var);
8019
8020 if (!gimple_seq_empty_p (stmts))
8021 {
8022 if (gimple_in_ssa_p (cfun))
8023 {
8024 gimple_stmt_iterator i;
8025
8026 for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
8027 mark_symbols_for_renaming (gsi_stmt (i));
8028 }
8029
8030 if (before)
8031 gsi_insert_seq_before (gsi, stmts, m);
8032 else
8033 gsi_insert_seq_after (gsi, stmts, m);
8034 }
8035
8036 return expr;
8037 }
8038
8039 #include "gt-gimplify.h"