re PR testsuite/40567 (Revision 149002 caused many failures)
[official-gcc.git] / gcc / gimplify.c
blob15005c379bd59264e57810587f61e8ece96398e6
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
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>.
8 This file is part of GCC.
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.
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.
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/>. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "rtl.h"
30 #include "varray.h"
31 #include "gimple.h"
32 #include "tree-iterator.h"
33 #include "tree-inline.h"
34 #include "diagnostic.h"
35 #include "langhooks.h"
36 #include "langhooks-def.h"
37 #include "tree-flow.h"
38 #include "cgraph.h"
39 #include "timevar.h"
40 #include "except.h"
41 #include "hashtab.h"
42 #include "flags.h"
43 #include "real.h"
44 #include "function.h"
45 #include "output.h"
46 #include "expr.h"
47 #include "ggc.h"
48 #include "toplev.h"
49 #include "target.h"
50 #include "optabs.h"
51 #include "pointer-set.h"
52 #include "splay-tree.h"
53 #include "vec.h"
54 #include "gimple.h"
57 enum gimplify_omp_var_data
59 GOVD_SEEN = 1,
60 GOVD_EXPLICIT = 2,
61 GOVD_SHARED = 4,
62 GOVD_PRIVATE = 8,
63 GOVD_FIRSTPRIVATE = 16,
64 GOVD_LASTPRIVATE = 32,
65 GOVD_REDUCTION = 64,
66 GOVD_LOCAL = 128,
67 GOVD_DEBUG_PRIVATE = 256,
68 GOVD_PRIVATE_OUTER_REF = 512,
69 GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
70 | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LOCAL)
74 enum omp_region_type
76 ORT_WORKSHARE = 0,
77 ORT_TASK = 1,
78 ORT_PARALLEL = 2,
79 ORT_COMBINED_PARALLEL = 3
82 struct gimplify_omp_ctx
84 struct gimplify_omp_ctx *outer_context;
85 splay_tree variables;
86 struct pointer_set_t *privatized_types;
87 location_t location;
88 enum omp_clause_default_kind default_kind;
89 enum omp_region_type region_type;
92 static struct gimplify_ctx *gimplify_ctxp;
93 static struct gimplify_omp_ctx *gimplify_omp_ctxp;
96 /* Formal (expression) temporary table handling: Multiple occurrences of
97 the same scalar expression are evaluated into the same temporary. */
99 typedef struct gimple_temp_hash_elt
101 tree val; /* Key */
102 tree temp; /* Value */
103 } elt_t;
105 /* Forward declarations. */
106 static enum gimplify_status gimplify_compound_expr (tree *, gimple_seq *, bool);
108 /* Mark X addressable. Unlike the langhook we expect X to be in gimple
109 form and we don't do any syntax checking. */
110 void
111 mark_addressable (tree x)
113 while (handled_component_p (x))
114 x = TREE_OPERAND (x, 0);
115 if (TREE_CODE (x) != VAR_DECL
116 && TREE_CODE (x) != PARM_DECL
117 && TREE_CODE (x) != RESULT_DECL)
118 return ;
119 TREE_ADDRESSABLE (x) = 1;
122 /* Return a hash value for a formal temporary table entry. */
124 static hashval_t
125 gimple_tree_hash (const void *p)
127 tree t = ((const elt_t *) p)->val;
128 return iterative_hash_expr (t, 0);
131 /* Compare two formal temporary table entries. */
133 static int
134 gimple_tree_eq (const void *p1, const void *p2)
136 tree t1 = ((const elt_t *) p1)->val;
137 tree t2 = ((const elt_t *) p2)->val;
138 enum tree_code code = TREE_CODE (t1);
140 if (TREE_CODE (t2) != code
141 || TREE_TYPE (t1) != TREE_TYPE (t2))
142 return 0;
144 if (!operand_equal_p (t1, t2, 0))
145 return 0;
147 /* Only allow them to compare equal if they also hash equal; otherwise
148 results are nondeterminate, and we fail bootstrap comparison. */
149 gcc_assert (gimple_tree_hash (p1) == gimple_tree_hash (p2));
151 return 1;
154 /* Link gimple statement GS to the end of the sequence *SEQ_P. If
155 *SEQ_P is NULL, a new sequence is allocated. This function is
156 similar to gimple_seq_add_stmt, but does not scan the operands.
157 During gimplification, we need to manipulate statement sequences
158 before the def/use vectors have been constructed. */
160 static void
161 gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs)
163 gimple_stmt_iterator si;
165 if (gs == NULL)
166 return;
168 if (*seq_p == NULL)
169 *seq_p = gimple_seq_alloc ();
171 si = gsi_last (*seq_p);
173 gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT);
176 /* Append sequence SRC to the end of sequence *DST_P. If *DST_P is
177 NULL, a new sequence is allocated. This function is
178 similar to gimple_seq_add_seq, but does not scan the operands.
179 During gimplification, we need to manipulate statement sequences
180 before the def/use vectors have been constructed. */
182 static void
183 gimplify_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
185 gimple_stmt_iterator si;
187 if (src == NULL)
188 return;
190 if (*dst_p == NULL)
191 *dst_p = gimple_seq_alloc ();
193 si = gsi_last (*dst_p);
194 gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT);
197 /* Set up a context for the gimplifier. */
199 void
200 push_gimplify_context (struct gimplify_ctx *c)
202 memset (c, '\0', sizeof (*c));
203 c->prev_context = gimplify_ctxp;
204 gimplify_ctxp = c;
207 /* Tear down a context for the gimplifier. If BODY is non-null, then
208 put the temporaries into the outer BIND_EXPR. Otherwise, put them
209 in the local_decls.
211 BODY is not a sequence, but the first tuple in a sequence. */
213 void
214 pop_gimplify_context (gimple body)
216 struct gimplify_ctx *c = gimplify_ctxp;
218 gcc_assert (c && (c->bind_expr_stack == NULL
219 || VEC_empty (gimple, c->bind_expr_stack)));
220 VEC_free (gimple, heap, c->bind_expr_stack);
221 gimplify_ctxp = c->prev_context;
223 if (body)
224 declare_vars (c->temps, body, false);
225 else
226 record_vars (c->temps);
228 if (c->temp_htab)
229 htab_delete (c->temp_htab);
232 static void
233 gimple_push_bind_expr (gimple gimple_bind)
235 if (gimplify_ctxp->bind_expr_stack == NULL)
236 gimplify_ctxp->bind_expr_stack = VEC_alloc (gimple, heap, 8);
237 VEC_safe_push (gimple, heap, gimplify_ctxp->bind_expr_stack, gimple_bind);
240 static void
241 gimple_pop_bind_expr (void)
243 VEC_pop (gimple, gimplify_ctxp->bind_expr_stack);
246 gimple
247 gimple_current_bind_expr (void)
249 return VEC_last (gimple, gimplify_ctxp->bind_expr_stack);
252 /* Return the stack GIMPLE_BINDs created during gimplification. */
254 VEC(gimple, heap) *
255 gimple_bind_expr_stack (void)
257 return gimplify_ctxp->bind_expr_stack;
260 /* Returns true iff there is a COND_EXPR between us and the innermost
261 CLEANUP_POINT_EXPR. This info is used by gimple_push_cleanup. */
263 static bool
264 gimple_conditional_context (void)
266 return gimplify_ctxp->conditions > 0;
269 /* Note that we've entered a COND_EXPR. */
271 static void
272 gimple_push_condition (void)
274 #ifdef ENABLE_GIMPLE_CHECKING
275 if (gimplify_ctxp->conditions == 0)
276 gcc_assert (gimple_seq_empty_p (gimplify_ctxp->conditional_cleanups));
277 #endif
278 ++(gimplify_ctxp->conditions);
281 /* Note that we've left a COND_EXPR. If we're back at unconditional scope
282 now, add any conditional cleanups we've seen to the prequeue. */
284 static void
285 gimple_pop_condition (gimple_seq *pre_p)
287 int conds = --(gimplify_ctxp->conditions);
289 gcc_assert (conds >= 0);
290 if (conds == 0)
292 gimplify_seq_add_seq (pre_p, gimplify_ctxp->conditional_cleanups);
293 gimplify_ctxp->conditional_cleanups = NULL;
297 /* A stable comparison routine for use with splay trees and DECLs. */
299 static int
300 splay_tree_compare_decl_uid (splay_tree_key xa, splay_tree_key xb)
302 tree a = (tree) xa;
303 tree b = (tree) xb;
305 return DECL_UID (a) - DECL_UID (b);
308 /* Create a new omp construct that deals with variable remapping. */
310 static struct gimplify_omp_ctx *
311 new_omp_context (enum omp_region_type region_type)
313 struct gimplify_omp_ctx *c;
315 c = XCNEW (struct gimplify_omp_ctx);
316 c->outer_context = gimplify_omp_ctxp;
317 c->variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0);
318 c->privatized_types = pointer_set_create ();
319 c->location = input_location;
320 c->region_type = region_type;
321 if (region_type != ORT_TASK)
322 c->default_kind = OMP_CLAUSE_DEFAULT_SHARED;
323 else
324 c->default_kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
326 return c;
329 /* Destroy an omp construct that deals with variable remapping. */
331 static void
332 delete_omp_context (struct gimplify_omp_ctx *c)
334 splay_tree_delete (c->variables);
335 pointer_set_destroy (c->privatized_types);
336 XDELETE (c);
339 static void omp_add_variable (struct gimplify_omp_ctx *, tree, unsigned int);
340 static bool omp_notice_variable (struct gimplify_omp_ctx *, tree, bool);
342 /* A subroutine of append_to_statement_list{,_force}. T is not NULL. */
344 static void
345 append_to_statement_list_1 (tree t, tree *list_p)
347 tree list = *list_p;
348 tree_stmt_iterator i;
350 if (!list)
352 if (t && TREE_CODE (t) == STATEMENT_LIST)
354 *list_p = t;
355 return;
357 *list_p = list = alloc_stmt_list ();
360 i = tsi_last (list);
361 tsi_link_after (&i, t, TSI_CONTINUE_LINKING);
364 /* Add T to the end of the list container pointed to by LIST_P.
365 If T is an expression with no effects, it is ignored. */
367 void
368 append_to_statement_list (tree t, tree *list_p)
370 if (t && TREE_SIDE_EFFECTS (t))
371 append_to_statement_list_1 (t, list_p);
374 /* Similar, but the statement is always added, regardless of side effects. */
376 void
377 append_to_statement_list_force (tree t, tree *list_p)
379 if (t != NULL_TREE)
380 append_to_statement_list_1 (t, list_p);
383 /* Both gimplify the statement T and append it to *SEQ_P. This function
384 behaves exactly as gimplify_stmt, but you don't have to pass T as a
385 reference. */
387 void
388 gimplify_and_add (tree t, gimple_seq *seq_p)
390 gimplify_stmt (&t, seq_p);
393 /* Gimplify statement T into sequence *SEQ_P, and return the first
394 tuple in the sequence of generated tuples for this statement.
395 Return NULL if gimplifying T produced no tuples. */
397 static gimple
398 gimplify_and_return_first (tree t, gimple_seq *seq_p)
400 gimple_stmt_iterator last = gsi_last (*seq_p);
402 gimplify_and_add (t, seq_p);
404 if (!gsi_end_p (last))
406 gsi_next (&last);
407 return gsi_stmt (last);
409 else
410 return gimple_seq_first_stmt (*seq_p);
413 /* Strip off a legitimate source ending from the input string NAME of
414 length LEN. Rather than having to know the names used by all of
415 our front ends, we strip off an ending of a period followed by
416 up to five characters. (Java uses ".class".) */
418 static inline void
419 remove_suffix (char *name, int len)
421 int i;
423 for (i = 2; i < 8 && len > i; i++)
425 if (name[len - i] == '.')
427 name[len - i] = '\0';
428 break;
433 /* Subroutine for find_single_pointer_decl. */
435 static tree
436 find_single_pointer_decl_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
437 void *data)
439 tree *pdecl = (tree *) data;
441 /* We are only looking for pointers at the same level as the
442 original tree; we must not look through any indirections.
443 Returning anything other than NULL_TREE will cause the caller to
444 not find a base. */
445 if (REFERENCE_CLASS_P (*tp))
446 return *tp;
448 if (DECL_P (*tp) && POINTER_TYPE_P (TREE_TYPE (*tp)))
450 if (*pdecl)
452 /* We already found a pointer decl; return anything other
453 than NULL_TREE to unwind from walk_tree signalling that
454 we have a duplicate. */
455 return *tp;
457 *pdecl = *tp;
460 return NULL_TREE;
463 /* Find the single DECL of pointer type in the tree T, used directly
464 rather than via an indirection, and return it. If there are zero
465 or more than one such DECLs, return NULL. */
467 static tree
468 find_single_pointer_decl (tree t)
470 tree decl = NULL_TREE;
472 if (walk_tree (&t, find_single_pointer_decl_1, &decl, NULL))
474 /* find_single_pointer_decl_1 returns a nonzero value, causing
475 walk_tree to return a nonzero value, to indicate that it
476 found more than one pointer DECL or that it found an
477 indirection. */
478 return NULL_TREE;
481 return decl;
484 /* Create a new temporary name with PREFIX. Returns an identifier. */
486 static GTY(()) unsigned int tmp_var_id_num;
488 tree
489 create_tmp_var_name (const char *prefix)
491 char *tmp_name;
493 if (prefix)
495 char *preftmp = ASTRDUP (prefix);
497 remove_suffix (preftmp, strlen (preftmp));
498 prefix = preftmp;
501 ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
502 return get_identifier (tmp_name);
506 /* Create a new temporary variable declaration of type TYPE.
507 Does NOT push it into the current binding. */
509 tree
510 create_tmp_var_raw (tree type, const char *prefix)
512 tree tmp_var;
513 tree new_type;
515 /* Make the type of the variable writable. */
516 new_type = build_type_variant (type, 0, 0);
517 TYPE_ATTRIBUTES (new_type) = TYPE_ATTRIBUTES (type);
519 tmp_var = build_decl (input_location,
520 VAR_DECL, prefix ? create_tmp_var_name (prefix) : NULL,
521 type);
523 /* The variable was declared by the compiler. */
524 DECL_ARTIFICIAL (tmp_var) = 1;
525 /* And we don't want debug info for it. */
526 DECL_IGNORED_P (tmp_var) = 1;
528 /* Make the variable writable. */
529 TREE_READONLY (tmp_var) = 0;
531 DECL_EXTERNAL (tmp_var) = 0;
532 TREE_STATIC (tmp_var) = 0;
533 TREE_USED (tmp_var) = 1;
535 return tmp_var;
538 /* Create a new temporary variable declaration of type TYPE. DOES push the
539 variable into the current binding. Further, assume that this is called
540 only from gimplification or optimization, at which point the creation of
541 certain types are bugs. */
543 tree
544 create_tmp_var (tree type, const char *prefix)
546 tree tmp_var;
548 /* We don't allow types that are addressable (meaning we can't make copies),
549 or incomplete. We also used to reject every variable size objects here,
550 but now support those for which a constant upper bound can be obtained.
551 The processing for variable sizes is performed in gimple_add_tmp_var,
552 point at which it really matters and possibly reached via paths not going
553 through this function, e.g. after direct calls to create_tmp_var_raw. */
554 gcc_assert (!TREE_ADDRESSABLE (type) && COMPLETE_TYPE_P (type));
556 tmp_var = create_tmp_var_raw (type, prefix);
557 gimple_add_tmp_var (tmp_var);
558 return tmp_var;
561 /* Create a temporary with a name derived from VAL. Subroutine of
562 lookup_tmp_var; nobody else should call this function. */
564 static inline tree
565 create_tmp_from_val (tree val)
567 return create_tmp_var (TREE_TYPE (val), get_name (val));
570 /* Create a temporary to hold the value of VAL. If IS_FORMAL, try to reuse
571 an existing expression temporary. */
573 static tree
574 lookup_tmp_var (tree val, bool is_formal)
576 tree ret;
578 /* If not optimizing, never really reuse a temporary. local-alloc
579 won't allocate any variable that is used in more than one basic
580 block, which means it will go into memory, causing much extra
581 work in reload and final and poorer code generation, outweighing
582 the extra memory allocation here. */
583 if (!optimize || !is_formal || TREE_SIDE_EFFECTS (val))
584 ret = create_tmp_from_val (val);
585 else
587 elt_t elt, *elt_p;
588 void **slot;
590 elt.val = val;
591 if (gimplify_ctxp->temp_htab == NULL)
592 gimplify_ctxp->temp_htab
593 = htab_create (1000, gimple_tree_hash, gimple_tree_eq, free);
594 slot = htab_find_slot (gimplify_ctxp->temp_htab, (void *)&elt, INSERT);
595 if (*slot == NULL)
597 elt_p = XNEW (elt_t);
598 elt_p->val = val;
599 elt_p->temp = ret = create_tmp_from_val (val);
600 *slot = (void *) elt_p;
602 else
604 elt_p = (elt_t *) *slot;
605 ret = elt_p->temp;
609 return ret;
613 /* Return true if T is a CALL_EXPR or an expression that can be
614 assignmed to a temporary. Note that this predicate should only be
615 used during gimplification. See the rationale for this in
616 gimplify_modify_expr. */
618 static bool
619 is_gimple_reg_rhs_or_call (tree t)
621 return (get_gimple_rhs_class (TREE_CODE (t)) != GIMPLE_INVALID_RHS
622 || TREE_CODE (t) == CALL_EXPR);
625 /* Return true if T is a valid memory RHS or a CALL_EXPR. Note that
626 this predicate should only be used during gimplification. See the
627 rationale for this in gimplify_modify_expr. */
629 static bool
630 is_gimple_mem_rhs_or_call (tree t)
632 /* If we're dealing with a renamable type, either source or dest must be
633 a renamed variable. */
634 if (is_gimple_reg_type (TREE_TYPE (t)))
635 return is_gimple_val (t);
636 else
637 return (is_gimple_val (t) || is_gimple_lvalue (t)
638 || TREE_CODE (t) == CALL_EXPR);
641 /* Helper for get_formal_tmp_var and get_initialized_tmp_var. */
643 static tree
644 internal_get_tmp_var (tree val, gimple_seq *pre_p, gimple_seq *post_p,
645 bool is_formal)
647 tree t, mod;
649 /* Notice that we explicitly allow VAL to be a CALL_EXPR so that we
650 can create an INIT_EXPR and convert it into a GIMPLE_CALL below. */
651 gimplify_expr (&val, pre_p, post_p, is_gimple_reg_rhs_or_call,
652 fb_rvalue);
654 t = lookup_tmp_var (val, is_formal);
656 if (is_formal)
658 tree u = find_single_pointer_decl (val);
660 if (u && TREE_CODE (u) == VAR_DECL && DECL_BASED_ON_RESTRICT_P (u))
661 u = DECL_GET_RESTRICT_BASE (u);
662 if (u && TYPE_RESTRICT (TREE_TYPE (u)))
664 if (DECL_BASED_ON_RESTRICT_P (t))
665 gcc_assert (u == DECL_GET_RESTRICT_BASE (t));
666 else
668 DECL_BASED_ON_RESTRICT_P (t) = 1;
669 SET_DECL_RESTRICT_BASE (t, u);
673 if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
674 || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
675 DECL_GIMPLE_REG_P (t) = 1;
678 mod = build2 (INIT_EXPR, TREE_TYPE (t), t, unshare_expr (val));
680 if (EXPR_HAS_LOCATION (val))
681 SET_EXPR_LOCUS (mod, EXPR_LOCUS (val));
682 else
683 SET_EXPR_LOCATION (mod, input_location);
685 /* gimplify_modify_expr might want to reduce this further. */
686 gimplify_and_add (mod, pre_p);
687 ggc_free (mod);
689 /* If we're gimplifying into ssa, gimplify_modify_expr will have
690 given our temporary an SSA name. Find and return it. */
691 if (gimplify_ctxp->into_ssa)
693 gimple last = gimple_seq_last_stmt (*pre_p);
694 t = gimple_get_lhs (last);
697 return t;
700 /* Returns a formal temporary variable initialized with VAL. PRE_P is as
701 in gimplify_expr. Only use this function if:
703 1) The value of the unfactored expression represented by VAL will not
704 change between the initialization and use of the temporary, and
705 2) The temporary will not be otherwise modified.
707 For instance, #1 means that this is inappropriate for SAVE_EXPR temps,
708 and #2 means it is inappropriate for && temps.
710 For other cases, use get_initialized_tmp_var instead. */
712 tree
713 get_formal_tmp_var (tree val, gimple_seq *pre_p)
715 return internal_get_tmp_var (val, pre_p, NULL, true);
718 /* Returns a temporary variable initialized with VAL. PRE_P and POST_P
719 are as in gimplify_expr. */
721 tree
722 get_initialized_tmp_var (tree val, gimple_seq *pre_p, gimple_seq *post_p)
724 return internal_get_tmp_var (val, pre_p, post_p, false);
727 /* Declares all the variables in VARS in SCOPE. If DEBUG_INFO is
728 true, generate debug info for them; otherwise don't. */
730 void
731 declare_vars (tree vars, gimple scope, bool debug_info)
733 tree last = vars;
734 if (last)
736 tree temps, block;
738 gcc_assert (gimple_code (scope) == GIMPLE_BIND);
740 temps = nreverse (last);
742 block = gimple_bind_block (scope);
743 gcc_assert (!block || TREE_CODE (block) == BLOCK);
744 if (!block || !debug_info)
746 TREE_CHAIN (last) = gimple_bind_vars (scope);
747 gimple_bind_set_vars (scope, temps);
749 else
751 /* We need to attach the nodes both to the BIND_EXPR and to its
752 associated BLOCK for debugging purposes. The key point here
753 is that the BLOCK_VARS of the BIND_EXPR_BLOCK of a BIND_EXPR
754 is a subchain of the BIND_EXPR_VARS of the BIND_EXPR. */
755 if (BLOCK_VARS (block))
756 BLOCK_VARS (block) = chainon (BLOCK_VARS (block), temps);
757 else
759 gimple_bind_set_vars (scope,
760 chainon (gimple_bind_vars (scope), temps));
761 BLOCK_VARS (block) = temps;
767 /* For VAR a VAR_DECL of variable size, try to find a constant upper bound
768 for the size and adjust DECL_SIZE/DECL_SIZE_UNIT accordingly. Abort if
769 no such upper bound can be obtained. */
771 static void
772 force_constant_size (tree var)
774 /* The only attempt we make is by querying the maximum size of objects
775 of the variable's type. */
777 HOST_WIDE_INT max_size;
779 gcc_assert (TREE_CODE (var) == VAR_DECL);
781 max_size = max_int_size_in_bytes (TREE_TYPE (var));
783 gcc_assert (max_size >= 0);
785 DECL_SIZE_UNIT (var)
786 = build_int_cst (TREE_TYPE (DECL_SIZE_UNIT (var)), max_size);
787 DECL_SIZE (var)
788 = build_int_cst (TREE_TYPE (DECL_SIZE (var)), max_size * BITS_PER_UNIT);
791 void
792 gimple_add_tmp_var (tree tmp)
794 gcc_assert (!TREE_CHAIN (tmp) && !DECL_SEEN_IN_BIND_EXPR_P (tmp));
796 /* Later processing assumes that the object size is constant, which might
797 not be true at this point. Force the use of a constant upper bound in
798 this case. */
799 if (!host_integerp (DECL_SIZE_UNIT (tmp), 1))
800 force_constant_size (tmp);
802 DECL_CONTEXT (tmp) = current_function_decl;
803 DECL_SEEN_IN_BIND_EXPR_P (tmp) = 1;
805 if (gimplify_ctxp)
807 TREE_CHAIN (tmp) = gimplify_ctxp->temps;
808 gimplify_ctxp->temps = tmp;
810 /* Mark temporaries local within the nearest enclosing parallel. */
811 if (gimplify_omp_ctxp)
813 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
814 while (ctx && ctx->region_type == ORT_WORKSHARE)
815 ctx = ctx->outer_context;
816 if (ctx)
817 omp_add_variable (ctx, tmp, GOVD_LOCAL | GOVD_SEEN);
820 else if (cfun)
821 record_vars (tmp);
822 else
824 gimple_seq body_seq;
826 /* This case is for nested functions. We need to expose the locals
827 they create. */
828 body_seq = gimple_body (current_function_decl);
829 declare_vars (tmp, gimple_seq_first_stmt (body_seq), false);
833 /* Determines whether to assign a location to the statement GS. */
835 static bool
836 should_carry_location_p (gimple gs)
838 /* Don't emit a line note for a label. We particularly don't want to
839 emit one for the break label, since it doesn't actually correspond
840 to the beginning of the loop/switch. */
841 if (gimple_code (gs) == GIMPLE_LABEL)
842 return false;
844 return true;
847 /* Same, but for a tree. */
849 static bool
850 tree_should_carry_location_p (const_tree stmt)
852 /* Don't emit a line note for a label. We particularly don't want to
853 emit one for the break label, since it doesn't actually correspond
854 to the beginning of the loop/switch. */
855 if (TREE_CODE (stmt) == LABEL_EXPR)
856 return false;
858 /* Do not annotate empty statements, since it confuses gcov. */
859 if (!TREE_SIDE_EFFECTS (stmt))
860 return false;
862 return true;
865 /* Return true if a location should not be emitted for this statement
866 by annotate_one_with_location. */
868 static inline bool
869 gimple_do_not_emit_location_p (gimple g)
871 return gimple_plf (g, GF_PLF_1);
874 /* Mark statement G so a location will not be emitted by
875 annotate_one_with_location. */
877 static inline void
878 gimple_set_do_not_emit_location (gimple g)
880 /* The PLF flags are initialized to 0 when a new tuple is created,
881 so no need to initialize it anywhere. */
882 gimple_set_plf (g, GF_PLF_1, true);
885 /* Set the location for gimple statement GS to LOCUS. */
887 static void
888 annotate_one_with_location (gimple gs, location_t location)
890 if (!gimple_has_location (gs)
891 && !gimple_do_not_emit_location_p (gs)
892 && should_carry_location_p (gs))
893 gimple_set_location (gs, location);
896 /* Same, but for tree T. */
898 static void
899 tree_annotate_one_with_location (tree t, location_t location)
901 if (CAN_HAVE_LOCATION_P (t)
902 && ! EXPR_HAS_LOCATION (t) && tree_should_carry_location_p (t))
903 SET_EXPR_LOCATION (t, location);
907 /* Set LOCATION for all the statements after iterator GSI in sequence
908 SEQ. If GSI is pointing to the end of the sequence, start with the
909 first statement in SEQ. */
911 static void
912 annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
913 location_t location)
915 if (gsi_end_p (gsi))
916 gsi = gsi_start (seq);
917 else
918 gsi_next (&gsi);
920 for (; !gsi_end_p (gsi); gsi_next (&gsi))
921 annotate_one_with_location (gsi_stmt (gsi), location);
925 /* Set the location for all the statements in a sequence STMT_P to LOCUS. */
927 void
928 annotate_all_with_location (gimple_seq stmt_p, location_t location)
930 gimple_stmt_iterator i;
932 if (gimple_seq_empty_p (stmt_p))
933 return;
935 for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
937 gimple gs = gsi_stmt (i);
938 annotate_one_with_location (gs, location);
942 /* Same, but for statement or statement list in *STMT_P. */
944 void
945 tree_annotate_all_with_location (tree *stmt_p, location_t location)
947 tree_stmt_iterator i;
949 if (!*stmt_p)
950 return;
952 for (i = tsi_start (*stmt_p); !tsi_end_p (i); tsi_next (&i))
954 tree t = tsi_stmt (i);
956 /* Assuming we've already been gimplified, we shouldn't
957 see nested chaining constructs anymore. */
958 gcc_assert (TREE_CODE (t) != STATEMENT_LIST
959 && TREE_CODE (t) != COMPOUND_EXPR);
961 tree_annotate_one_with_location (t, location);
966 /* Similar to copy_tree_r() but do not copy SAVE_EXPR or TARGET_EXPR nodes.
967 These nodes model computations that should only be done once. If we
968 were to unshare something like SAVE_EXPR(i++), the gimplification
969 process would create wrong code. */
971 static tree
972 mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
974 enum tree_code code = TREE_CODE (*tp);
975 /* Don't unshare types, decls, constants and SAVE_EXPR nodes. */
976 if (TREE_CODE_CLASS (code) == tcc_type
977 || TREE_CODE_CLASS (code) == tcc_declaration
978 || TREE_CODE_CLASS (code) == tcc_constant
979 || code == SAVE_EXPR || code == TARGET_EXPR
980 /* We can't do anything sensible with a BLOCK used as an expression,
981 but we also can't just die when we see it because of non-expression
982 uses. So just avert our eyes and cross our fingers. Silly Java. */
983 || code == BLOCK)
984 *walk_subtrees = 0;
985 else
987 gcc_assert (code != BIND_EXPR);
988 copy_tree_r (tp, walk_subtrees, data);
991 return NULL_TREE;
994 /* Callback for walk_tree to unshare most of the shared trees rooted at
995 *TP. If *TP has been visited already (i.e., TREE_VISITED (*TP) == 1),
996 then *TP is deep copied by calling copy_tree_r.
998 This unshares the same trees as copy_tree_r with the exception of
999 SAVE_EXPR nodes. These nodes model computations that should only be
1000 done once. If we were to unshare something like SAVE_EXPR(i++), the
1001 gimplification process would create wrong code. */
1003 static tree
1004 copy_if_shared_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
1005 void *data ATTRIBUTE_UNUSED)
1007 tree t = *tp;
1008 enum tree_code code = TREE_CODE (t);
1010 /* Skip types, decls, and constants. But we do want to look at their
1011 types and the bounds of types. Mark them as visited so we properly
1012 unmark their subtrees on the unmark pass. If we've already seen them,
1013 don't look down further. */
1014 if (TREE_CODE_CLASS (code) == tcc_type
1015 || TREE_CODE_CLASS (code) == tcc_declaration
1016 || TREE_CODE_CLASS (code) == tcc_constant)
1018 if (TREE_VISITED (t))
1019 *walk_subtrees = 0;
1020 else
1021 TREE_VISITED (t) = 1;
1024 /* If this node has been visited already, unshare it and don't look
1025 any deeper. */
1026 else if (TREE_VISITED (t))
1028 walk_tree (tp, mostly_copy_tree_r, NULL, NULL);
1029 *walk_subtrees = 0;
1032 /* Otherwise, mark the tree as visited and keep looking. */
1033 else
1034 TREE_VISITED (t) = 1;
1036 return NULL_TREE;
1039 static tree
1040 unmark_visited_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
1041 void *data ATTRIBUTE_UNUSED)
1043 if (TREE_VISITED (*tp))
1044 TREE_VISITED (*tp) = 0;
1045 else
1046 *walk_subtrees = 0;
1048 return NULL_TREE;
1051 /* Unshare all the trees in BODY_P, a pointer into the body of FNDECL, and the
1052 bodies of any nested functions if we are unsharing the entire body of
1053 FNDECL. */
1055 static void
1056 unshare_body (tree *body_p, tree fndecl)
1058 struct cgraph_node *cgn = cgraph_node (fndecl);
1060 walk_tree (body_p, copy_if_shared_r, NULL, NULL);
1061 if (body_p == &DECL_SAVED_TREE (fndecl))
1062 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1063 unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
1066 /* Likewise, but mark all trees as not visited. */
1068 static void
1069 unvisit_body (tree *body_p, tree fndecl)
1071 struct cgraph_node *cgn = cgraph_node (fndecl);
1073 walk_tree (body_p, unmark_visited_r, NULL, NULL);
1074 if (body_p == &DECL_SAVED_TREE (fndecl))
1075 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1076 unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
1079 /* Unconditionally make an unshared copy of EXPR. This is used when using
1080 stored expressions which span multiple functions, such as BINFO_VTABLE,
1081 as the normal unsharing process can't tell that they're shared. */
1083 tree
1084 unshare_expr (tree expr)
1086 walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
1087 return expr;
1090 /* WRAPPER is a code such as BIND_EXPR or CLEANUP_POINT_EXPR which can both
1091 contain statements and have a value. Assign its value to a temporary
1092 and give it void_type_node. Returns the temporary, or NULL_TREE if
1093 WRAPPER was already void. */
1095 tree
1096 voidify_wrapper_expr (tree wrapper, tree temp)
1098 tree type = TREE_TYPE (wrapper);
1099 if (type && !VOID_TYPE_P (type))
1101 tree *p;
1103 /* Set p to point to the body of the wrapper. Loop until we find
1104 something that isn't a wrapper. */
1105 for (p = &wrapper; p && *p; )
1107 switch (TREE_CODE (*p))
1109 case BIND_EXPR:
1110 TREE_SIDE_EFFECTS (*p) = 1;
1111 TREE_TYPE (*p) = void_type_node;
1112 /* For a BIND_EXPR, the body is operand 1. */
1113 p = &BIND_EXPR_BODY (*p);
1114 break;
1116 case CLEANUP_POINT_EXPR:
1117 case TRY_FINALLY_EXPR:
1118 case TRY_CATCH_EXPR:
1119 TREE_SIDE_EFFECTS (*p) = 1;
1120 TREE_TYPE (*p) = void_type_node;
1121 p = &TREE_OPERAND (*p, 0);
1122 break;
1124 case STATEMENT_LIST:
1126 tree_stmt_iterator i = tsi_last (*p);
1127 TREE_SIDE_EFFECTS (*p) = 1;
1128 TREE_TYPE (*p) = void_type_node;
1129 p = tsi_end_p (i) ? NULL : tsi_stmt_ptr (i);
1131 break;
1133 case COMPOUND_EXPR:
1134 /* Advance to the last statement. Set all container types to void. */
1135 for (; TREE_CODE (*p) == COMPOUND_EXPR; p = &TREE_OPERAND (*p, 1))
1137 TREE_SIDE_EFFECTS (*p) = 1;
1138 TREE_TYPE (*p) = void_type_node;
1140 break;
1142 default:
1143 goto out;
1147 out:
1148 if (p == NULL || IS_EMPTY_STMT (*p))
1149 temp = NULL_TREE;
1150 else if (temp)
1152 /* The wrapper is on the RHS of an assignment that we're pushing
1153 down. */
1154 gcc_assert (TREE_CODE (temp) == INIT_EXPR
1155 || TREE_CODE (temp) == MODIFY_EXPR);
1156 TREE_OPERAND (temp, 1) = *p;
1157 *p = temp;
1159 else
1161 temp = create_tmp_var (type, "retval");
1162 *p = build2 (INIT_EXPR, type, temp, *p);
1165 return temp;
1168 return NULL_TREE;
1171 /* Prepare calls to builtins to SAVE and RESTORE the stack as well as
1172 a temporary through which they communicate. */
1174 static void
1175 build_stack_save_restore (gimple *save, gimple *restore)
1177 tree tmp_var;
1179 *save = gimple_build_call (implicit_built_in_decls[BUILT_IN_STACK_SAVE], 0);
1180 tmp_var = create_tmp_var (ptr_type_node, "saved_stack");
1181 gimple_call_set_lhs (*save, tmp_var);
1183 *restore = gimple_build_call (implicit_built_in_decls[BUILT_IN_STACK_RESTORE],
1184 1, tmp_var);
1187 /* Gimplify a BIND_EXPR. Just voidify and recurse. */
1189 static enum gimplify_status
1190 gimplify_bind_expr (tree *expr_p, gimple_seq *pre_p)
1192 tree bind_expr = *expr_p;
1193 bool old_save_stack = gimplify_ctxp->save_stack;
1194 tree t;
1195 gimple gimple_bind;
1196 gimple_seq body;
1198 tree temp = voidify_wrapper_expr (bind_expr, NULL);
1200 /* Mark variables seen in this bind expr. */
1201 for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t))
1203 if (TREE_CODE (t) == VAR_DECL)
1205 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
1207 /* Mark variable as local. */
1208 if (ctx && !is_global_var (t)
1209 && (! DECL_SEEN_IN_BIND_EXPR_P (t)
1210 || splay_tree_lookup (ctx->variables,
1211 (splay_tree_key) t) == NULL))
1212 omp_add_variable (gimplify_omp_ctxp, t, GOVD_LOCAL | GOVD_SEEN);
1214 DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
1216 if (DECL_HARD_REGISTER (t) && !is_global_var (t) && cfun)
1217 cfun->has_local_explicit_reg_vars = true;
1220 /* Preliminarily mark non-addressed complex variables as eligible
1221 for promotion to gimple registers. We'll transform their uses
1222 as we find them.
1223 We exclude complex types if not optimizing because they can be
1224 subject to partial stores in GNU C by means of the __real__ and
1225 __imag__ operators and we cannot promote them to total stores
1226 (see gimplify_modify_expr_complex_part). */
1227 if (optimize
1228 && (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
1229 || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
1230 && !TREE_THIS_VOLATILE (t)
1231 && (TREE_CODE (t) == VAR_DECL && !DECL_HARD_REGISTER (t))
1232 && !needs_to_live_in_memory (t))
1233 DECL_GIMPLE_REG_P (t) = 1;
1236 gimple_bind = gimple_build_bind (BIND_EXPR_VARS (bind_expr), NULL,
1237 BIND_EXPR_BLOCK (bind_expr));
1238 gimple_push_bind_expr (gimple_bind);
1240 gimplify_ctxp->save_stack = false;
1242 /* Gimplify the body into the GIMPLE_BIND tuple's body. */
1243 body = NULL;
1244 gimplify_stmt (&BIND_EXPR_BODY (bind_expr), &body);
1245 gimple_bind_set_body (gimple_bind, body);
1247 if (gimplify_ctxp->save_stack)
1249 gimple stack_save, stack_restore, gs;
1250 gimple_seq cleanup, new_body;
1252 /* Save stack on entry and restore it on exit. Add a try_finally
1253 block to achieve this. Note that mudflap depends on the
1254 format of the emitted code: see mx_register_decls(). */
1255 build_stack_save_restore (&stack_save, &stack_restore);
1257 cleanup = new_body = NULL;
1258 gimplify_seq_add_stmt (&cleanup, stack_restore);
1259 gs = gimple_build_try (gimple_bind_body (gimple_bind), cleanup,
1260 GIMPLE_TRY_FINALLY);
1262 gimplify_seq_add_stmt (&new_body, stack_save);
1263 gimplify_seq_add_stmt (&new_body, gs);
1264 gimple_bind_set_body (gimple_bind, new_body);
1267 gimplify_ctxp->save_stack = old_save_stack;
1268 gimple_pop_bind_expr ();
1270 gimplify_seq_add_stmt (pre_p, gimple_bind);
1272 if (temp)
1274 *expr_p = temp;
1275 return GS_OK;
1278 *expr_p = NULL_TREE;
1279 return GS_ALL_DONE;
1282 /* Gimplify a RETURN_EXPR. If the expression to be returned is not a
1283 GIMPLE value, it is assigned to a new temporary and the statement is
1284 re-written to return the temporary.
1286 PRE_P points to the sequence where side effects that must happen before
1287 STMT should be stored. */
1289 static enum gimplify_status
1290 gimplify_return_expr (tree stmt, gimple_seq *pre_p)
1292 gimple ret;
1293 tree ret_expr = TREE_OPERAND (stmt, 0);
1294 tree result_decl, result;
1296 if (ret_expr == error_mark_node)
1297 return GS_ERROR;
1299 if (!ret_expr
1300 || TREE_CODE (ret_expr) == RESULT_DECL
1301 || ret_expr == error_mark_node)
1303 gimple ret = gimple_build_return (ret_expr);
1304 gimple_set_no_warning (ret, TREE_NO_WARNING (stmt));
1305 gimplify_seq_add_stmt (pre_p, ret);
1306 return GS_ALL_DONE;
1309 if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
1310 result_decl = NULL_TREE;
1311 else
1313 result_decl = TREE_OPERAND (ret_expr, 0);
1315 /* See through a return by reference. */
1316 if (TREE_CODE (result_decl) == INDIRECT_REF)
1317 result_decl = TREE_OPERAND (result_decl, 0);
1319 gcc_assert ((TREE_CODE (ret_expr) == MODIFY_EXPR
1320 || TREE_CODE (ret_expr) == INIT_EXPR)
1321 && TREE_CODE (result_decl) == RESULT_DECL);
1324 /* If aggregate_value_p is true, then we can return the bare RESULT_DECL.
1325 Recall that aggregate_value_p is FALSE for any aggregate type that is
1326 returned in registers. If we're returning values in registers, then
1327 we don't want to extend the lifetime of the RESULT_DECL, particularly
1328 across another call. In addition, for those aggregates for which
1329 hard_function_value generates a PARALLEL, we'll die during normal
1330 expansion of structure assignments; there's special code in expand_return
1331 to handle this case that does not exist in expand_expr. */
1332 if (!result_decl
1333 || aggregate_value_p (result_decl, TREE_TYPE (current_function_decl)))
1334 result = result_decl;
1335 else if (gimplify_ctxp->return_temp)
1336 result = gimplify_ctxp->return_temp;
1337 else
1339 result = create_tmp_var (TREE_TYPE (result_decl), NULL);
1340 if (TREE_CODE (TREE_TYPE (result)) == COMPLEX_TYPE
1341 || TREE_CODE (TREE_TYPE (result)) == VECTOR_TYPE)
1342 DECL_GIMPLE_REG_P (result) = 1;
1344 /* ??? With complex control flow (usually involving abnormal edges),
1345 we can wind up warning about an uninitialized value for this. Due
1346 to how this variable is constructed and initialized, this is never
1347 true. Give up and never warn. */
1348 TREE_NO_WARNING (result) = 1;
1350 gimplify_ctxp->return_temp = result;
1353 /* Smash the lhs of the MODIFY_EXPR to the temporary we plan to use.
1354 Then gimplify the whole thing. */
1355 if (result != result_decl)
1356 TREE_OPERAND (ret_expr, 0) = result;
1358 gimplify_and_add (TREE_OPERAND (stmt, 0), pre_p);
1360 ret = gimple_build_return (result);
1361 gimple_set_no_warning (ret, TREE_NO_WARNING (stmt));
1362 gimplify_seq_add_stmt (pre_p, ret);
1364 return GS_ALL_DONE;
1367 static void
1368 gimplify_vla_decl (tree decl, gimple_seq *seq_p)
1370 /* This is a variable-sized decl. Simplify its size and mark it
1371 for deferred expansion. Note that mudflap depends on the format
1372 of the emitted code: see mx_register_decls(). */
1373 tree t, addr, ptr_type;
1375 gimplify_one_sizepos (&DECL_SIZE (decl), seq_p);
1376 gimplify_one_sizepos (&DECL_SIZE_UNIT (decl), seq_p);
1378 /* All occurrences of this decl in final gimplified code will be
1379 replaced by indirection. Setting DECL_VALUE_EXPR does two
1380 things: First, it lets the rest of the gimplifier know what
1381 replacement to use. Second, it lets the debug info know
1382 where to find the value. */
1383 ptr_type = build_pointer_type (TREE_TYPE (decl));
1384 addr = create_tmp_var (ptr_type, get_name (decl));
1385 DECL_IGNORED_P (addr) = 0;
1386 t = build_fold_indirect_ref (addr);
1387 SET_DECL_VALUE_EXPR (decl, t);
1388 DECL_HAS_VALUE_EXPR_P (decl) = 1;
1390 t = built_in_decls[BUILT_IN_ALLOCA];
1391 t = build_call_expr (t, 1, DECL_SIZE_UNIT (decl));
1392 t = fold_convert (ptr_type, t);
1393 t = build2 (MODIFY_EXPR, TREE_TYPE (addr), addr, t);
1395 gimplify_and_add (t, seq_p);
1397 /* Indicate that we need to restore the stack level when the
1398 enclosing BIND_EXPR is exited. */
1399 gimplify_ctxp->save_stack = true;
1403 /* Gimplifies a DECL_EXPR node *STMT_P by making any necessary allocation
1404 and initialization explicit. */
1406 static enum gimplify_status
1407 gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p)
1409 tree stmt = *stmt_p;
1410 tree decl = DECL_EXPR_DECL (stmt);
1412 *stmt_p = NULL_TREE;
1414 if (TREE_TYPE (decl) == error_mark_node)
1415 return GS_ERROR;
1417 if ((TREE_CODE (decl) == TYPE_DECL
1418 || TREE_CODE (decl) == VAR_DECL)
1419 && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (decl)))
1420 gimplify_type_sizes (TREE_TYPE (decl), seq_p);
1422 if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
1424 tree init = DECL_INITIAL (decl);
1426 if (TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST
1427 || (!TREE_STATIC (decl)
1428 && flag_stack_check == GENERIC_STACK_CHECK
1429 && compare_tree_int (DECL_SIZE_UNIT (decl),
1430 STACK_CHECK_MAX_VAR_SIZE) > 0))
1431 gimplify_vla_decl (decl, seq_p);
1433 if (init && init != error_mark_node)
1435 if (!TREE_STATIC (decl))
1437 DECL_INITIAL (decl) = NULL_TREE;
1438 init = build2 (INIT_EXPR, void_type_node, decl, init);
1439 gimplify_and_add (init, seq_p);
1440 ggc_free (init);
1442 else
1443 /* We must still examine initializers for static variables
1444 as they may contain a label address. */
1445 walk_tree (&init, force_labels_r, NULL, NULL);
1448 /* Some front ends do not explicitly declare all anonymous
1449 artificial variables. We compensate here by declaring the
1450 variables, though it would be better if the front ends would
1451 explicitly declare them. */
1452 if (!DECL_SEEN_IN_BIND_EXPR_P (decl)
1453 && DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
1454 gimple_add_tmp_var (decl);
1457 return GS_ALL_DONE;
1460 /* Gimplify a LOOP_EXPR. Normally this just involves gimplifying the body
1461 and replacing the LOOP_EXPR with goto, but if the loop contains an
1462 EXIT_EXPR, we need to append a label for it to jump to. */
1464 static enum gimplify_status
1465 gimplify_loop_expr (tree *expr_p, gimple_seq *pre_p)
1467 tree saved_label = gimplify_ctxp->exit_label;
1468 tree start_label = create_artificial_label (UNKNOWN_LOCATION);
1470 gimplify_seq_add_stmt (pre_p, gimple_build_label (start_label));
1472 gimplify_ctxp->exit_label = NULL_TREE;
1474 gimplify_and_add (LOOP_EXPR_BODY (*expr_p), pre_p);
1476 gimplify_seq_add_stmt (pre_p, gimple_build_goto (start_label));
1478 if (gimplify_ctxp->exit_label)
1479 gimplify_seq_add_stmt (pre_p, gimple_build_label (gimplify_ctxp->exit_label));
1481 gimplify_ctxp->exit_label = saved_label;
1483 *expr_p = NULL;
1484 return GS_ALL_DONE;
1487 /* Gimplifies a statement list onto a sequence. These may be created either
1488 by an enlightened front-end, or by shortcut_cond_expr. */
1490 static enum gimplify_status
1491 gimplify_statement_list (tree *expr_p, gimple_seq *pre_p)
1493 tree temp = voidify_wrapper_expr (*expr_p, NULL);
1495 tree_stmt_iterator i = tsi_start (*expr_p);
1497 while (!tsi_end_p (i))
1499 gimplify_stmt (tsi_stmt_ptr (i), pre_p);
1500 tsi_delink (&i);
1503 if (temp)
1505 *expr_p = temp;
1506 return GS_OK;
1509 return GS_ALL_DONE;
1512 /* Compare two case labels. Because the front end should already have
1513 made sure that case ranges do not overlap, it is enough to only compare
1514 the CASE_LOW values of each case label. */
1516 static int
1517 compare_case_labels (const void *p1, const void *p2)
1519 const_tree const case1 = *(const_tree const*)p1;
1520 const_tree const case2 = *(const_tree const*)p2;
1522 /* The 'default' case label always goes first. */
1523 if (!CASE_LOW (case1))
1524 return -1;
1525 else if (!CASE_LOW (case2))
1526 return 1;
1527 else
1528 return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
1532 /* Sort the case labels in LABEL_VEC in place in ascending order. */
1534 void
1535 sort_case_labels (VEC(tree,heap)* label_vec)
1537 size_t len = VEC_length (tree, label_vec);
1538 qsort (VEC_address (tree, label_vec), len, sizeof (tree),
1539 compare_case_labels);
1543 /* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
1544 branch to. */
1546 static enum gimplify_status
1547 gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
1549 tree switch_expr = *expr_p;
1550 gimple_seq switch_body_seq = NULL;
1551 enum gimplify_status ret;
1553 ret = gimplify_expr (&SWITCH_COND (switch_expr), pre_p, NULL, is_gimple_val,
1554 fb_rvalue);
1555 if (ret == GS_ERROR || ret == GS_UNHANDLED)
1556 return ret;
1558 if (SWITCH_BODY (switch_expr))
1560 VEC (tree,heap) *labels;
1561 VEC (tree,heap) *saved_labels;
1562 tree default_case = NULL_TREE;
1563 size_t i, len;
1564 gimple gimple_switch;
1566 /* If someone can be bothered to fill in the labels, they can
1567 be bothered to null out the body too. */
1568 gcc_assert (!SWITCH_LABELS (switch_expr));
1570 /* save old labels, get new ones from body, then restore the old
1571 labels. Save all the things from the switch body to append after. */
1572 saved_labels = gimplify_ctxp->case_labels;
1573 gimplify_ctxp->case_labels = VEC_alloc (tree, heap, 8);
1575 gimplify_stmt (&SWITCH_BODY (switch_expr), &switch_body_seq);
1576 labels = gimplify_ctxp->case_labels;
1577 gimplify_ctxp->case_labels = saved_labels;
1579 i = 0;
1580 while (i < VEC_length (tree, labels))
1582 tree elt = VEC_index (tree, labels, i);
1583 tree low = CASE_LOW (elt);
1584 bool remove_element = FALSE;
1586 if (low)
1588 /* Discard empty ranges. */
1589 tree high = CASE_HIGH (elt);
1590 if (high && tree_int_cst_lt (high, low))
1591 remove_element = TRUE;
1593 else
1595 /* The default case must be the last label in the list. */
1596 gcc_assert (!default_case);
1597 default_case = elt;
1598 remove_element = TRUE;
1601 if (remove_element)
1602 VEC_ordered_remove (tree, labels, i);
1603 else
1604 i++;
1606 len = i;
1608 if (!VEC_empty (tree, labels))
1609 sort_case_labels (labels);
1611 if (!default_case)
1613 tree type = TREE_TYPE (switch_expr);
1615 /* If the switch has no default label, add one, so that we jump
1616 around the switch body. If the labels already cover the whole
1617 range of type, add the default label pointing to one of the
1618 existing labels. */
1619 if (type == void_type_node)
1620 type = TREE_TYPE (SWITCH_COND (switch_expr));
1621 if (len
1622 && INTEGRAL_TYPE_P (type)
1623 && TYPE_MIN_VALUE (type)
1624 && TYPE_MAX_VALUE (type)
1625 && tree_int_cst_equal (CASE_LOW (VEC_index (tree, labels, 0)),
1626 TYPE_MIN_VALUE (type)))
1628 tree low, high = CASE_HIGH (VEC_index (tree, labels, len - 1));
1629 if (!high)
1630 high = CASE_LOW (VEC_index (tree, labels, len - 1));
1631 if (tree_int_cst_equal (high, TYPE_MAX_VALUE (type)))
1633 for (i = 1; i < len; i++)
1635 high = CASE_LOW (VEC_index (tree, labels, i));
1636 low = CASE_HIGH (VEC_index (tree, labels, i - 1));
1637 if (!low)
1638 low = CASE_LOW (VEC_index (tree, labels, i - 1));
1639 if ((TREE_INT_CST_LOW (low) + 1
1640 != TREE_INT_CST_LOW (high))
1641 || (TREE_INT_CST_HIGH (low)
1642 + (TREE_INT_CST_LOW (high) == 0)
1643 != TREE_INT_CST_HIGH (high)))
1644 break;
1646 if (i == len)
1647 default_case = build3 (CASE_LABEL_EXPR, void_type_node,
1648 NULL_TREE, NULL_TREE,
1649 CASE_LABEL (VEC_index (tree,
1650 labels, 0)));
1654 if (!default_case)
1656 gimple new_default;
1658 default_case
1659 = build3 (CASE_LABEL_EXPR, void_type_node,
1660 NULL_TREE, NULL_TREE,
1661 create_artificial_label (UNKNOWN_LOCATION));
1662 new_default = gimple_build_label (CASE_LABEL (default_case));
1663 gimplify_seq_add_stmt (&switch_body_seq, new_default);
1667 gimple_switch = gimple_build_switch_vec (SWITCH_COND (switch_expr),
1668 default_case, labels);
1669 gimplify_seq_add_stmt (pre_p, gimple_switch);
1670 gimplify_seq_add_seq (pre_p, switch_body_seq);
1671 VEC_free(tree, heap, labels);
1673 else
1674 gcc_assert (SWITCH_LABELS (switch_expr));
1676 return GS_ALL_DONE;
1680 static enum gimplify_status
1681 gimplify_case_label_expr (tree *expr_p, gimple_seq *pre_p)
1683 struct gimplify_ctx *ctxp;
1684 gimple gimple_label;
1686 /* Invalid OpenMP programs can play Duff's Device type games with
1687 #pragma omp parallel. At least in the C front end, we don't
1688 detect such invalid branches until after gimplification. */
1689 for (ctxp = gimplify_ctxp; ; ctxp = ctxp->prev_context)
1690 if (ctxp->case_labels)
1691 break;
1693 gimple_label = gimple_build_label (CASE_LABEL (*expr_p));
1694 VEC_safe_push (tree, heap, ctxp->case_labels, *expr_p);
1695 gimplify_seq_add_stmt (pre_p, gimple_label);
1697 return GS_ALL_DONE;
1700 /* Build a GOTO to the LABEL_DECL pointed to by LABEL_P, building it first
1701 if necessary. */
1703 tree
1704 build_and_jump (tree *label_p)
1706 if (label_p == NULL)
1707 /* If there's nowhere to jump, just fall through. */
1708 return NULL_TREE;
1710 if (*label_p == NULL_TREE)
1712 tree label = create_artificial_label (UNKNOWN_LOCATION);
1713 *label_p = label;
1716 return build1 (GOTO_EXPR, void_type_node, *label_p);
1719 /* Gimplify an EXIT_EXPR by converting to a GOTO_EXPR inside a COND_EXPR.
1720 This also involves building a label to jump to and communicating it to
1721 gimplify_loop_expr through gimplify_ctxp->exit_label. */
1723 static enum gimplify_status
1724 gimplify_exit_expr (tree *expr_p)
1726 tree cond = TREE_OPERAND (*expr_p, 0);
1727 tree expr;
1729 expr = build_and_jump (&gimplify_ctxp->exit_label);
1730 expr = build3 (COND_EXPR, void_type_node, cond, expr, NULL_TREE);
1731 *expr_p = expr;
1733 return GS_OK;
1736 /* A helper function to be called via walk_tree. Mark all labels under *TP
1737 as being forced. To be called for DECL_INITIAL of static variables. */
1739 tree
1740 force_labels_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1742 if (TYPE_P (*tp))
1743 *walk_subtrees = 0;
1744 if (TREE_CODE (*tp) == LABEL_DECL)
1745 FORCED_LABEL (*tp) = 1;
1747 return NULL_TREE;
1750 /* *EXPR_P is a COMPONENT_REF being used as an rvalue. If its type is
1751 different from its canonical type, wrap the whole thing inside a
1752 NOP_EXPR and force the type of the COMPONENT_REF to be the canonical
1753 type.
1755 The canonical type of a COMPONENT_REF is the type of the field being
1756 referenced--unless the field is a bit-field which can be read directly
1757 in a smaller mode, in which case the canonical type is the
1758 sign-appropriate type corresponding to that mode. */
1760 static void
1761 canonicalize_component_ref (tree *expr_p)
1763 tree expr = *expr_p;
1764 tree type;
1766 gcc_assert (TREE_CODE (expr) == COMPONENT_REF);
1768 if (INTEGRAL_TYPE_P (TREE_TYPE (expr)))
1769 type = TREE_TYPE (get_unwidened (expr, NULL_TREE));
1770 else
1771 type = TREE_TYPE (TREE_OPERAND (expr, 1));
1773 /* One could argue that all the stuff below is not necessary for
1774 the non-bitfield case and declare it a FE error if type
1775 adjustment would be needed. */
1776 if (TREE_TYPE (expr) != type)
1778 #ifdef ENABLE_TYPES_CHECKING
1779 tree old_type = TREE_TYPE (expr);
1780 #endif
1781 int type_quals;
1783 /* We need to preserve qualifiers and propagate them from
1784 operand 0. */
1785 type_quals = TYPE_QUALS (type)
1786 | TYPE_QUALS (TREE_TYPE (TREE_OPERAND (expr, 0)));
1787 if (TYPE_QUALS (type) != type_quals)
1788 type = build_qualified_type (TYPE_MAIN_VARIANT (type), type_quals);
1790 /* Set the type of the COMPONENT_REF to the underlying type. */
1791 TREE_TYPE (expr) = type;
1793 #ifdef ENABLE_TYPES_CHECKING
1794 /* It is now a FE error, if the conversion from the canonical
1795 type to the original expression type is not useless. */
1796 gcc_assert (useless_type_conversion_p (old_type, type));
1797 #endif
1801 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1802 to foo, embed that change in the ADDR_EXPR by converting
1803 T array[U];
1804 (T *)&array
1806 &array[L]
1807 where L is the lower bound. For simplicity, only do this for constant
1808 lower bound.
1809 The constraint is that the type of &array[L] is trivially convertible
1810 to T *. */
1812 static void
1813 canonicalize_addr_expr (tree *expr_p)
1815 tree expr = *expr_p;
1816 tree addr_expr = TREE_OPERAND (expr, 0);
1817 tree datype, ddatype, pddatype;
1819 /* We simplify only conversions from an ADDR_EXPR to a pointer type. */
1820 if (!POINTER_TYPE_P (TREE_TYPE (expr))
1821 || TREE_CODE (addr_expr) != ADDR_EXPR)
1822 return;
1824 /* The addr_expr type should be a pointer to an array. */
1825 datype = TREE_TYPE (TREE_TYPE (addr_expr));
1826 if (TREE_CODE (datype) != ARRAY_TYPE)
1827 return;
1829 /* The pointer to element type shall be trivially convertible to
1830 the expression pointer type. */
1831 ddatype = TREE_TYPE (datype);
1832 pddatype = build_pointer_type (ddatype);
1833 if (!useless_type_conversion_p (pddatype, ddatype))
1834 return;
1836 /* The lower bound and element sizes must be constant. */
1837 if (!TYPE_SIZE_UNIT (ddatype)
1838 || TREE_CODE (TYPE_SIZE_UNIT (ddatype)) != INTEGER_CST
1839 || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1840 || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1841 return;
1843 /* All checks succeeded. Build a new node to merge the cast. */
1844 *expr_p = build4 (ARRAY_REF, ddatype, TREE_OPERAND (addr_expr, 0),
1845 TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1846 NULL_TREE, NULL_TREE);
1847 *expr_p = build1 (ADDR_EXPR, pddatype, *expr_p);
1850 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR. Remove it and/or other conversions
1851 underneath as appropriate. */
1853 static enum gimplify_status
1854 gimplify_conversion (tree *expr_p)
1856 tree tem;
1857 gcc_assert (CONVERT_EXPR_P (*expr_p));
1859 /* Then strip away all but the outermost conversion. */
1860 STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1862 /* And remove the outermost conversion if it's useless. */
1863 if (tree_ssa_useless_type_conversion (*expr_p))
1864 *expr_p = TREE_OPERAND (*expr_p, 0);
1866 /* Attempt to avoid NOP_EXPR by producing reference to a subtype.
1867 For example this fold (subclass *)&A into &A->subclass avoiding
1868 a need for statement. */
1869 if (CONVERT_EXPR_P (*expr_p)
1870 && POINTER_TYPE_P (TREE_TYPE (*expr_p))
1871 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 0)))
1872 && (tem = maybe_fold_offset_to_address
1873 (EXPR_LOCATION (*expr_p), TREE_OPERAND (*expr_p, 0),
1874 integer_zero_node, TREE_TYPE (*expr_p))) != NULL_TREE)
1875 *expr_p = tem;
1877 /* If we still have a conversion at the toplevel,
1878 then canonicalize some constructs. */
1879 if (CONVERT_EXPR_P (*expr_p))
1881 tree sub = TREE_OPERAND (*expr_p, 0);
1883 /* If a NOP conversion is changing the type of a COMPONENT_REF
1884 expression, then canonicalize its type now in order to expose more
1885 redundant conversions. */
1886 if (TREE_CODE (sub) == COMPONENT_REF)
1887 canonicalize_component_ref (&TREE_OPERAND (*expr_p, 0));
1889 /* If a NOP conversion is changing a pointer to array of foo
1890 to a pointer to foo, embed that change in the ADDR_EXPR. */
1891 else if (TREE_CODE (sub) == ADDR_EXPR)
1892 canonicalize_addr_expr (expr_p);
1895 /* If we have a conversion to a non-register type force the
1896 use of a VIEW_CONVERT_EXPR instead. */
1897 if (!is_gimple_reg_type (TREE_TYPE (*expr_p)))
1898 *expr_p = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (*expr_p),
1899 TREE_OPERAND (*expr_p, 0));
1901 return GS_OK;
1904 /* Nonlocal VLAs seen in the current function. */
1905 static struct pointer_set_t *nonlocal_vlas;
1907 /* Gimplify a VAR_DECL or PARM_DECL. Returns GS_OK if we expanded a
1908 DECL_VALUE_EXPR, and it's worth re-examining things. */
1910 static enum gimplify_status
1911 gimplify_var_or_parm_decl (tree *expr_p)
1913 tree decl = *expr_p;
1915 /* ??? If this is a local variable, and it has not been seen in any
1916 outer BIND_EXPR, then it's probably the result of a duplicate
1917 declaration, for which we've already issued an error. It would
1918 be really nice if the front end wouldn't leak these at all.
1919 Currently the only known culprit is C++ destructors, as seen
1920 in g++.old-deja/g++.jason/binding.C. */
1921 if (TREE_CODE (decl) == VAR_DECL
1922 && !DECL_SEEN_IN_BIND_EXPR_P (decl)
1923 && !TREE_STATIC (decl) && !DECL_EXTERNAL (decl)
1924 && decl_function_context (decl) == current_function_decl)
1926 gcc_assert (errorcount || sorrycount);
1927 return GS_ERROR;
1930 /* When within an OpenMP context, notice uses of variables. */
1931 if (gimplify_omp_ctxp && omp_notice_variable (gimplify_omp_ctxp, decl, true))
1932 return GS_ALL_DONE;
1934 /* If the decl is an alias for another expression, substitute it now. */
1935 if (DECL_HAS_VALUE_EXPR_P (decl))
1937 tree value_expr = DECL_VALUE_EXPR (decl);
1939 /* For referenced nonlocal VLAs add a decl for debugging purposes
1940 to the current function. */
1941 if (TREE_CODE (decl) == VAR_DECL
1942 && TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST
1943 && nonlocal_vlas != NULL
1944 && TREE_CODE (value_expr) == INDIRECT_REF
1945 && TREE_CODE (TREE_OPERAND (value_expr, 0)) == VAR_DECL
1946 && decl_function_context (decl) != current_function_decl)
1948 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
1949 while (ctx && ctx->region_type == ORT_WORKSHARE)
1950 ctx = ctx->outer_context;
1951 if (!ctx && !pointer_set_insert (nonlocal_vlas, decl))
1953 tree copy = copy_node (decl), block;
1955 lang_hooks.dup_lang_specific_decl (copy);
1956 SET_DECL_RTL (copy, NULL_RTX);
1957 TREE_USED (copy) = 1;
1958 block = DECL_INITIAL (current_function_decl);
1959 TREE_CHAIN (copy) = BLOCK_VARS (block);
1960 BLOCK_VARS (block) = copy;
1961 SET_DECL_VALUE_EXPR (copy, unshare_expr (value_expr));
1962 DECL_HAS_VALUE_EXPR_P (copy) = 1;
1966 *expr_p = unshare_expr (value_expr);
1967 return GS_OK;
1970 return GS_ALL_DONE;
1974 /* Gimplify the COMPONENT_REF, ARRAY_REF, REALPART_EXPR or IMAGPART_EXPR
1975 node *EXPR_P.
1977 compound_lval
1978 : min_lval '[' val ']'
1979 | min_lval '.' ID
1980 | compound_lval '[' val ']'
1981 | compound_lval '.' ID
1983 This is not part of the original SIMPLE definition, which separates
1984 array and member references, but it seems reasonable to handle them
1985 together. Also, this way we don't run into problems with union
1986 aliasing; gcc requires that for accesses through a union to alias, the
1987 union reference must be explicit, which was not always the case when we
1988 were splitting up array and member refs.
1990 PRE_P points to the sequence where side effects that must happen before
1991 *EXPR_P should be stored.
1993 POST_P points to the sequence where side effects that must happen after
1994 *EXPR_P should be stored. */
1996 static enum gimplify_status
1997 gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
1998 fallback_t fallback)
2000 tree *p;
2001 VEC(tree,heap) *stack;
2002 enum gimplify_status ret = GS_OK, tret;
2003 int i;
2005 /* Create a stack of the subexpressions so later we can walk them in
2006 order from inner to outer. */
2007 stack = VEC_alloc (tree, heap, 10);
2009 /* We can handle anything that get_inner_reference can deal with. */
2010 for (p = expr_p; ; p = &TREE_OPERAND (*p, 0))
2012 restart:
2013 /* Fold INDIRECT_REFs now to turn them into ARRAY_REFs. */
2014 if (TREE_CODE (*p) == INDIRECT_REF)
2015 *p = fold_indirect_ref (*p);
2017 if (handled_component_p (*p))
2019 /* Expand DECL_VALUE_EXPR now. In some cases that may expose
2020 additional COMPONENT_REFs. */
2021 else if ((TREE_CODE (*p) == VAR_DECL || TREE_CODE (*p) == PARM_DECL)
2022 && gimplify_var_or_parm_decl (p) == GS_OK)
2023 goto restart;
2024 else
2025 break;
2027 VEC_safe_push (tree, heap, stack, *p);
2030 gcc_assert (VEC_length (tree, stack));
2032 /* Now STACK is a stack of pointers to all the refs we've walked through
2033 and P points to the innermost expression.
2035 Java requires that we elaborated nodes in source order. That
2036 means we must gimplify the inner expression followed by each of
2037 the indices, in order. But we can't gimplify the inner
2038 expression until we deal with any variable bounds, sizes, or
2039 positions in order to deal with PLACEHOLDER_EXPRs.
2041 So we do this in three steps. First we deal with the annotations
2042 for any variables in the components, then we gimplify the base,
2043 then we gimplify any indices, from left to right. */
2044 for (i = VEC_length (tree, stack) - 1; i >= 0; i--)
2046 tree t = VEC_index (tree, stack, i);
2048 if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
2050 /* Gimplify the low bound and element type size and put them into
2051 the ARRAY_REF. If these values are set, they have already been
2052 gimplified. */
2053 if (TREE_OPERAND (t, 2) == NULL_TREE)
2055 tree low = unshare_expr (array_ref_low_bound (t));
2056 if (!is_gimple_min_invariant (low))
2058 TREE_OPERAND (t, 2) = low;
2059 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p,
2060 post_p, is_gimple_reg,
2061 fb_rvalue);
2062 ret = MIN (ret, tret);
2066 if (!TREE_OPERAND (t, 3))
2068 tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
2069 tree elmt_size = unshare_expr (array_ref_element_size (t));
2070 tree factor = size_int (TYPE_ALIGN_UNIT (elmt_type));
2072 /* Divide the element size by the alignment of the element
2073 type (above). */
2074 elmt_size = size_binop (EXACT_DIV_EXPR, elmt_size, factor);
2076 if (!is_gimple_min_invariant (elmt_size))
2078 TREE_OPERAND (t, 3) = elmt_size;
2079 tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p,
2080 post_p, is_gimple_reg,
2081 fb_rvalue);
2082 ret = MIN (ret, tret);
2086 else if (TREE_CODE (t) == COMPONENT_REF)
2088 /* Set the field offset into T and gimplify it. */
2089 if (!TREE_OPERAND (t, 2))
2091 tree offset = unshare_expr (component_ref_field_offset (t));
2092 tree field = TREE_OPERAND (t, 1);
2093 tree factor
2094 = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT);
2096 /* Divide the offset by its alignment. */
2097 offset = size_binop (EXACT_DIV_EXPR, offset, factor);
2099 if (!is_gimple_min_invariant (offset))
2101 TREE_OPERAND (t, 2) = offset;
2102 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p,
2103 post_p, is_gimple_reg,
2104 fb_rvalue);
2105 ret = MIN (ret, tret);
2111 /* Step 2 is to gimplify the base expression. Make sure lvalue is set
2112 so as to match the min_lval predicate. Failure to do so may result
2113 in the creation of large aggregate temporaries. */
2114 tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval,
2115 fallback | fb_lvalue);
2116 ret = MIN (ret, tret);
2118 /* And finally, the indices and operands to BIT_FIELD_REF. During this
2119 loop we also remove any useless conversions. */
2120 for (; VEC_length (tree, stack) > 0; )
2122 tree t = VEC_pop (tree, stack);
2124 if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
2126 /* Gimplify the dimension. */
2127 if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
2129 tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
2130 is_gimple_val, fb_rvalue);
2131 ret = MIN (ret, tret);
2134 else if (TREE_CODE (t) == BIT_FIELD_REF)
2136 tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
2137 is_gimple_val, fb_rvalue);
2138 ret = MIN (ret, tret);
2139 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
2140 is_gimple_val, fb_rvalue);
2141 ret = MIN (ret, tret);
2144 STRIP_USELESS_TYPE_CONVERSION (TREE_OPERAND (t, 0));
2146 /* The innermost expression P may have originally had
2147 TREE_SIDE_EFFECTS set which would have caused all the outer
2148 expressions in *EXPR_P leading to P to also have had
2149 TREE_SIDE_EFFECTS set. */
2150 recalculate_side_effects (t);
2153 /* If the outermost expression is a COMPONENT_REF, canonicalize its type. */
2154 if ((fallback & fb_rvalue) && TREE_CODE (*expr_p) == COMPONENT_REF)
2156 canonicalize_component_ref (expr_p);
2157 ret = MIN (ret, GS_OK);
2160 VEC_free (tree, heap, stack);
2162 return ret;
2165 /* Gimplify the self modifying expression pointed to by EXPR_P
2166 (++, --, +=, -=).
2168 PRE_P points to the list where side effects that must happen before
2169 *EXPR_P should be stored.
2171 POST_P points to the list where side effects that must happen after
2172 *EXPR_P should be stored.
2174 WANT_VALUE is nonzero iff we want to use the value of this expression
2175 in another expression. */
2177 static enum gimplify_status
2178 gimplify_self_mod_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
2179 bool want_value)
2181 enum tree_code code;
2182 tree lhs, lvalue, rhs, t1;
2183 gimple_seq post = NULL, *orig_post_p = post_p;
2184 bool postfix;
2185 enum tree_code arith_code;
2186 enum gimplify_status ret;
2188 code = TREE_CODE (*expr_p);
2190 gcc_assert (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR
2191 || code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR);
2193 /* Prefix or postfix? */
2194 if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
2195 /* Faster to treat as prefix if result is not used. */
2196 postfix = want_value;
2197 else
2198 postfix = false;
2200 /* For postfix, make sure the inner expression's post side effects
2201 are executed after side effects from this expression. */
2202 if (postfix)
2203 post_p = &post;
2205 /* Add or subtract? */
2206 if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
2207 arith_code = PLUS_EXPR;
2208 else
2209 arith_code = MINUS_EXPR;
2211 /* Gimplify the LHS into a GIMPLE lvalue. */
2212 lvalue = TREE_OPERAND (*expr_p, 0);
2213 ret = gimplify_expr (&lvalue, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
2214 if (ret == GS_ERROR)
2215 return ret;
2217 /* Extract the operands to the arithmetic operation. */
2218 lhs = lvalue;
2219 rhs = TREE_OPERAND (*expr_p, 1);
2221 /* For postfix operator, we evaluate the LHS to an rvalue and then use
2222 that as the result value and in the postqueue operation. We also
2223 make sure to make lvalue a minimal lval, see
2224 gcc.c-torture/execute/20040313-1.c for an example where this matters. */
2225 if (postfix)
2227 if (!is_gimple_min_lval (lvalue))
2229 mark_addressable (lvalue);
2230 lvalue = build_fold_addr_expr (lvalue);
2231 gimplify_expr (&lvalue, pre_p, post_p, is_gimple_val, fb_rvalue);
2232 lvalue = build_fold_indirect_ref (lvalue);
2234 ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
2235 if (ret == GS_ERROR)
2236 return ret;
2239 /* For POINTERs increment, use POINTER_PLUS_EXPR. */
2240 if (POINTER_TYPE_P (TREE_TYPE (lhs)))
2242 rhs = fold_convert (sizetype, rhs);
2243 if (arith_code == MINUS_EXPR)
2244 rhs = fold_build1 (NEGATE_EXPR, TREE_TYPE (rhs), rhs);
2245 arith_code = POINTER_PLUS_EXPR;
2248 t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
2250 if (postfix)
2252 gimplify_assign (lvalue, t1, orig_post_p);
2253 gimplify_seq_add_seq (orig_post_p, post);
2254 *expr_p = lhs;
2255 return GS_ALL_DONE;
2257 else
2259 *expr_p = build2 (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
2260 return GS_OK;
2265 /* If *EXPR_P has a variable sized type, wrap it in a WITH_SIZE_EXPR. */
2267 static void
2268 maybe_with_size_expr (tree *expr_p)
2270 tree expr = *expr_p;
2271 tree type = TREE_TYPE (expr);
2272 tree size;
2274 /* If we've already wrapped this or the type is error_mark_node, we can't do
2275 anything. */
2276 if (TREE_CODE (expr) == WITH_SIZE_EXPR
2277 || type == error_mark_node)
2278 return;
2280 /* If the size isn't known or is a constant, we have nothing to do. */
2281 size = TYPE_SIZE_UNIT (type);
2282 if (!size || TREE_CODE (size) == INTEGER_CST)
2283 return;
2285 /* Otherwise, make a WITH_SIZE_EXPR. */
2286 size = unshare_expr (size);
2287 size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, expr);
2288 *expr_p = build2 (WITH_SIZE_EXPR, type, expr, size);
2292 /* Helper for gimplify_call_expr. Gimplify a single argument *ARG_P
2293 Store any side-effects in PRE_P. CALL_LOCATION is the location of
2294 the CALL_EXPR. */
2296 static enum gimplify_status
2297 gimplify_arg (tree *arg_p, gimple_seq *pre_p, location_t call_location)
2299 bool (*test) (tree);
2300 fallback_t fb;
2302 /* In general, we allow lvalues for function arguments to avoid
2303 extra overhead of copying large aggregates out of even larger
2304 aggregates into temporaries only to copy the temporaries to
2305 the argument list. Make optimizers happy by pulling out to
2306 temporaries those types that fit in registers. */
2307 if (is_gimple_reg_type (TREE_TYPE (*arg_p)))
2308 test = is_gimple_val, fb = fb_rvalue;
2309 else
2310 test = is_gimple_lvalue, fb = fb_either;
2312 /* If this is a variable sized type, we must remember the size. */
2313 maybe_with_size_expr (arg_p);
2315 /* FIXME diagnostics: This will mess up gcc.dg/Warray-bounds.c. */
2316 /* Make sure arguments have the same location as the function call
2317 itself. */
2318 protected_set_expr_location (*arg_p, call_location);
2320 /* There is a sequence point before a function call. Side effects in
2321 the argument list must occur before the actual call. So, when
2322 gimplifying arguments, force gimplify_expr to use an internal
2323 post queue which is then appended to the end of PRE_P. */
2324 return gimplify_expr (arg_p, pre_p, NULL, test, fb);
2328 /* Gimplify the CALL_EXPR node *EXPR_P into the GIMPLE sequence PRE_P.
2329 WANT_VALUE is true if the result of the call is desired. */
2331 static enum gimplify_status
2332 gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
2334 tree fndecl, parms, p;
2335 enum gimplify_status ret;
2336 int i, nargs;
2337 gimple call;
2338 bool builtin_va_start_p = FALSE;
2340 gcc_assert (TREE_CODE (*expr_p) == CALL_EXPR);
2342 /* For reliable diagnostics during inlining, it is necessary that
2343 every call_expr be annotated with file and line. */
2344 if (! EXPR_HAS_LOCATION (*expr_p))
2345 SET_EXPR_LOCATION (*expr_p, input_location);
2347 /* This may be a call to a builtin function.
2349 Builtin function calls may be transformed into different
2350 (and more efficient) builtin function calls under certain
2351 circumstances. Unfortunately, gimplification can muck things
2352 up enough that the builtin expanders are not aware that certain
2353 transformations are still valid.
2355 So we attempt transformation/gimplification of the call before
2356 we gimplify the CALL_EXPR. At this time we do not manage to
2357 transform all calls in the same manner as the expanders do, but
2358 we do transform most of them. */
2359 fndecl = get_callee_fndecl (*expr_p);
2360 if (fndecl && DECL_BUILT_IN (fndecl))
2362 tree new_tree = fold_call_expr (*expr_p, !want_value);
2364 if (new_tree && new_tree != *expr_p)
2366 /* There was a transformation of this call which computes the
2367 same value, but in a more efficient way. Return and try
2368 again. */
2369 *expr_p = new_tree;
2370 return GS_OK;
2373 if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
2374 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_VA_START)
2376 builtin_va_start_p = TRUE;
2377 if (call_expr_nargs (*expr_p) < 2)
2379 error ("too few arguments to function %<va_start%>");
2380 *expr_p = build_empty_stmt (EXPR_LOCATION (*expr_p));
2381 return GS_OK;
2384 if (fold_builtin_next_arg (*expr_p, true))
2386 *expr_p = build_empty_stmt (EXPR_LOCATION (*expr_p));
2387 return GS_OK;
2392 /* There is a sequence point before the call, so any side effects in
2393 the calling expression must occur before the actual call. Force
2394 gimplify_expr to use an internal post queue. */
2395 ret = gimplify_expr (&CALL_EXPR_FN (*expr_p), pre_p, NULL,
2396 is_gimple_call_addr, fb_rvalue);
2398 nargs = call_expr_nargs (*expr_p);
2400 /* Get argument types for verification. */
2401 fndecl = get_callee_fndecl (*expr_p);
2402 parms = NULL_TREE;
2403 if (fndecl)
2404 parms = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
2405 else if (POINTER_TYPE_P (TREE_TYPE (CALL_EXPR_FN (*expr_p))))
2406 parms = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (*expr_p))));
2408 if (fndecl && DECL_ARGUMENTS (fndecl))
2409 p = DECL_ARGUMENTS (fndecl);
2410 else if (parms)
2411 p = parms;
2412 else
2413 p = NULL_TREE;
2414 for (i = 0; i < nargs && p; i++, p = TREE_CHAIN (p))
2417 /* If the last argument is __builtin_va_arg_pack () and it is not
2418 passed as a named argument, decrease the number of CALL_EXPR
2419 arguments and set instead the CALL_EXPR_VA_ARG_PACK flag. */
2420 if (!p
2421 && i < nargs
2422 && TREE_CODE (CALL_EXPR_ARG (*expr_p, nargs - 1)) == CALL_EXPR)
2424 tree last_arg = CALL_EXPR_ARG (*expr_p, nargs - 1);
2425 tree last_arg_fndecl = get_callee_fndecl (last_arg);
2427 if (last_arg_fndecl
2428 && TREE_CODE (last_arg_fndecl) == FUNCTION_DECL
2429 && DECL_BUILT_IN_CLASS (last_arg_fndecl) == BUILT_IN_NORMAL
2430 && DECL_FUNCTION_CODE (last_arg_fndecl) == BUILT_IN_VA_ARG_PACK)
2432 tree call = *expr_p;
2434 --nargs;
2435 *expr_p = build_call_array (TREE_TYPE (call), CALL_EXPR_FN (call),
2436 nargs, CALL_EXPR_ARGP (call));
2438 /* Copy all CALL_EXPR flags, location and block, except
2439 CALL_EXPR_VA_ARG_PACK flag. */
2440 CALL_EXPR_STATIC_CHAIN (*expr_p) = CALL_EXPR_STATIC_CHAIN (call);
2441 CALL_EXPR_TAILCALL (*expr_p) = CALL_EXPR_TAILCALL (call);
2442 CALL_EXPR_RETURN_SLOT_OPT (*expr_p)
2443 = CALL_EXPR_RETURN_SLOT_OPT (call);
2444 CALL_FROM_THUNK_P (*expr_p) = CALL_FROM_THUNK_P (call);
2445 CALL_CANNOT_INLINE_P (*expr_p) = CALL_CANNOT_INLINE_P (call);
2446 SET_EXPR_LOCUS (*expr_p, EXPR_LOCUS (call));
2447 TREE_BLOCK (*expr_p) = TREE_BLOCK (call);
2449 /* Set CALL_EXPR_VA_ARG_PACK. */
2450 CALL_EXPR_VA_ARG_PACK (*expr_p) = 1;
2454 /* Finally, gimplify the function arguments. */
2455 if (nargs > 0)
2457 for (i = (PUSH_ARGS_REVERSED ? nargs - 1 : 0);
2458 PUSH_ARGS_REVERSED ? i >= 0 : i < nargs;
2459 PUSH_ARGS_REVERSED ? i-- : i++)
2461 enum gimplify_status t;
2463 /* Avoid gimplifying the second argument to va_start, which needs to
2464 be the plain PARM_DECL. */
2465 if ((i != 1) || !builtin_va_start_p)
2467 t = gimplify_arg (&CALL_EXPR_ARG (*expr_p, i), pre_p,
2468 EXPR_LOCATION (*expr_p));
2470 if (t == GS_ERROR)
2471 ret = GS_ERROR;
2476 /* Try this again in case gimplification exposed something. */
2477 if (ret != GS_ERROR)
2479 tree new_tree = fold_call_expr (*expr_p, !want_value);
2481 if (new_tree && new_tree != *expr_p)
2483 /* There was a transformation of this call which computes the
2484 same value, but in a more efficient way. Return and try
2485 again. */
2486 *expr_p = new_tree;
2487 return GS_OK;
2490 else
2492 *expr_p = error_mark_node;
2493 return GS_ERROR;
2496 /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
2497 decl. This allows us to eliminate redundant or useless
2498 calls to "const" functions. */
2499 if (TREE_CODE (*expr_p) == CALL_EXPR)
2501 int flags = call_expr_flags (*expr_p);
2502 if (flags & (ECF_CONST | ECF_PURE)
2503 /* An infinite loop is considered a side effect. */
2504 && !(flags & (ECF_LOOPING_CONST_OR_PURE)))
2505 TREE_SIDE_EFFECTS (*expr_p) = 0;
2508 /* If the value is not needed by the caller, emit a new GIMPLE_CALL
2509 and clear *EXPR_P. Otherwise, leave *EXPR_P in its gimplified
2510 form and delegate the creation of a GIMPLE_CALL to
2511 gimplify_modify_expr. This is always possible because when
2512 WANT_VALUE is true, the caller wants the result of this call into
2513 a temporary, which means that we will emit an INIT_EXPR in
2514 internal_get_tmp_var which will then be handled by
2515 gimplify_modify_expr. */
2516 if (!want_value)
2518 /* The CALL_EXPR in *EXPR_P is already in GIMPLE form, so all we
2519 have to do is replicate it as a GIMPLE_CALL tuple. */
2520 call = gimple_build_call_from_tree (*expr_p);
2521 gimplify_seq_add_stmt (pre_p, call);
2522 *expr_p = NULL_TREE;
2525 return ret;
2528 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
2529 rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
2531 TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
2532 condition is true or false, respectively. If null, we should generate
2533 our own to skip over the evaluation of this specific expression.
2535 LOCUS is the source location of the COND_EXPR.
2537 This function is the tree equivalent of do_jump.
2539 shortcut_cond_r should only be called by shortcut_cond_expr. */
2541 static tree
2542 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p,
2543 location_t locus)
2545 tree local_label = NULL_TREE;
2546 tree t, expr = NULL;
2548 /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
2549 retain the shortcut semantics. Just insert the gotos here;
2550 shortcut_cond_expr will append the real blocks later. */
2551 if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2553 location_t new_locus;
2555 /* Turn if (a && b) into
2557 if (a); else goto no;
2558 if (b) goto yes; else goto no;
2559 (no:) */
2561 if (false_label_p == NULL)
2562 false_label_p = &local_label;
2564 /* Keep the original source location on the first 'if'. */
2565 t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p, locus);
2566 append_to_statement_list (t, &expr);
2568 /* Set the source location of the && on the second 'if'. */
2569 new_locus = EXPR_HAS_LOCATION (pred) ? EXPR_LOCATION (pred) : locus;
2570 t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p, false_label_p,
2571 new_locus);
2572 append_to_statement_list (t, &expr);
2574 else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2576 location_t new_locus;
2578 /* Turn if (a || b) into
2580 if (a) goto yes;
2581 if (b) goto yes; else goto no;
2582 (yes:) */
2584 if (true_label_p == NULL)
2585 true_label_p = &local_label;
2587 /* Keep the original source location on the first 'if'. */
2588 t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL, locus);
2589 append_to_statement_list (t, &expr);
2591 /* Set the source location of the || on the second 'if'. */
2592 new_locus = EXPR_HAS_LOCATION (pred) ? EXPR_LOCATION (pred) : locus;
2593 t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p, false_label_p,
2594 new_locus);
2595 append_to_statement_list (t, &expr);
2597 else if (TREE_CODE (pred) == COND_EXPR)
2599 location_t new_locus;
2601 /* As long as we're messing with gotos, turn if (a ? b : c) into
2602 if (a)
2603 if (b) goto yes; else goto no;
2604 else
2605 if (c) goto yes; else goto no; */
2607 /* Keep the original source location on the first 'if'. Set the source
2608 location of the ? on the second 'if'. */
2609 new_locus = EXPR_HAS_LOCATION (pred) ? EXPR_LOCATION (pred) : locus;
2610 expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
2611 shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2612 false_label_p, locus),
2613 shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
2614 false_label_p, new_locus));
2616 else
2618 expr = build3 (COND_EXPR, void_type_node, pred,
2619 build_and_jump (true_label_p),
2620 build_and_jump (false_label_p));
2621 SET_EXPR_LOCATION (expr, locus);
2624 if (local_label)
2626 t = build1 (LABEL_EXPR, void_type_node, local_label);
2627 append_to_statement_list (t, &expr);
2630 return expr;
2633 /* Given a conditional expression EXPR with short-circuit boolean
2634 predicates using TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR, break the
2635 predicate appart into the equivalent sequence of conditionals. */
2637 static tree
2638 shortcut_cond_expr (tree expr)
2640 tree pred = TREE_OPERAND (expr, 0);
2641 tree then_ = TREE_OPERAND (expr, 1);
2642 tree else_ = TREE_OPERAND (expr, 2);
2643 tree true_label, false_label, end_label, t;
2644 tree *true_label_p;
2645 tree *false_label_p;
2646 bool emit_end, emit_false, jump_over_else;
2647 bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
2648 bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
2650 /* First do simple transformations. */
2651 if (!else_se)
2653 /* If there is no 'else', turn
2654 if (a && b) then c
2655 into
2656 if (a) if (b) then c. */
2657 while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2659 /* Keep the original source location on the first 'if'. */
2660 location_t locus = EXPR_HAS_LOCATION (expr)
2661 ? EXPR_LOCATION (expr) : input_location;
2662 TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2663 /* Set the source location of the && on the second 'if'. */
2664 if (EXPR_HAS_LOCATION (pred))
2665 SET_EXPR_LOCATION (expr, EXPR_LOCATION (pred));
2666 then_ = shortcut_cond_expr (expr);
2667 then_se = then_ && TREE_SIDE_EFFECTS (then_);
2668 pred = TREE_OPERAND (pred, 0);
2669 expr = build3 (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
2670 SET_EXPR_LOCATION (expr, locus);
2674 if (!then_se)
2676 /* If there is no 'then', turn
2677 if (a || b); else d
2678 into
2679 if (a); else if (b); else d. */
2680 while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2682 /* Keep the original source location on the first 'if'. */
2683 location_t locus = EXPR_HAS_LOCATION (expr)
2684 ? EXPR_LOCATION (expr) : input_location;
2685 TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2686 /* Set the source location of the || on the second 'if'. */
2687 if (EXPR_HAS_LOCATION (pred))
2688 SET_EXPR_LOCATION (expr, EXPR_LOCATION (pred));
2689 else_ = shortcut_cond_expr (expr);
2690 else_se = else_ && TREE_SIDE_EFFECTS (else_);
2691 pred = TREE_OPERAND (pred, 0);
2692 expr = build3 (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
2693 SET_EXPR_LOCATION (expr, locus);
2697 /* If we're done, great. */
2698 if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
2699 && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
2700 return expr;
2702 /* Otherwise we need to mess with gotos. Change
2703 if (a) c; else d;
2705 if (a); else goto no;
2706 c; goto end;
2707 no: d; end:
2708 and recursively gimplify the condition. */
2710 true_label = false_label = end_label = NULL_TREE;
2712 /* If our arms just jump somewhere, hijack those labels so we don't
2713 generate jumps to jumps. */
2715 if (then_
2716 && TREE_CODE (then_) == GOTO_EXPR
2717 && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
2719 true_label = GOTO_DESTINATION (then_);
2720 then_ = NULL;
2721 then_se = false;
2724 if (else_
2725 && TREE_CODE (else_) == GOTO_EXPR
2726 && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
2728 false_label = GOTO_DESTINATION (else_);
2729 else_ = NULL;
2730 else_se = false;
2733 /* If we aren't hijacking a label for the 'then' branch, it falls through. */
2734 if (true_label)
2735 true_label_p = &true_label;
2736 else
2737 true_label_p = NULL;
2739 /* The 'else' branch also needs a label if it contains interesting code. */
2740 if (false_label || else_se)
2741 false_label_p = &false_label;
2742 else
2743 false_label_p = NULL;
2745 /* If there was nothing else in our arms, just forward the label(s). */
2746 if (!then_se && !else_se)
2747 return shortcut_cond_r (pred, true_label_p, false_label_p,
2748 EXPR_HAS_LOCATION (expr)
2749 ? EXPR_LOCATION (expr) : input_location);
2751 /* If our last subexpression already has a terminal label, reuse it. */
2752 if (else_se)
2753 t = expr_last (else_);
2754 else if (then_se)
2755 t = expr_last (then_);
2756 else
2757 t = NULL;
2758 if (t && TREE_CODE (t) == LABEL_EXPR)
2759 end_label = LABEL_EXPR_LABEL (t);
2761 /* If we don't care about jumping to the 'else' branch, jump to the end
2762 if the condition is false. */
2763 if (!false_label_p)
2764 false_label_p = &end_label;
2766 /* We only want to emit these labels if we aren't hijacking them. */
2767 emit_end = (end_label == NULL_TREE);
2768 emit_false = (false_label == NULL_TREE);
2770 /* We only emit the jump over the else clause if we have to--if the
2771 then clause may fall through. Otherwise we can wind up with a
2772 useless jump and a useless label at the end of gimplified code,
2773 which will cause us to think that this conditional as a whole
2774 falls through even if it doesn't. If we then inline a function
2775 which ends with such a condition, that can cause us to issue an
2776 inappropriate warning about control reaching the end of a
2777 non-void function. */
2778 jump_over_else = block_may_fallthru (then_);
2780 pred = shortcut_cond_r (pred, true_label_p, false_label_p,
2781 EXPR_HAS_LOCATION (expr)
2782 ? EXPR_LOCATION (expr) : input_location);
2784 expr = NULL;
2785 append_to_statement_list (pred, &expr);
2787 append_to_statement_list (then_, &expr);
2788 if (else_se)
2790 if (jump_over_else)
2792 tree last = expr_last (expr);
2793 t = build_and_jump (&end_label);
2794 if (EXPR_HAS_LOCATION (last))
2795 SET_EXPR_LOCATION (t, EXPR_LOCATION (last));
2796 append_to_statement_list (t, &expr);
2798 if (emit_false)
2800 t = build1 (LABEL_EXPR, void_type_node, false_label);
2801 append_to_statement_list (t, &expr);
2803 append_to_statement_list (else_, &expr);
2805 if (emit_end && end_label)
2807 t = build1 (LABEL_EXPR, void_type_node, end_label);
2808 append_to_statement_list (t, &expr);
2811 return expr;
2814 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE. */
2816 tree
2817 gimple_boolify (tree expr)
2819 tree type = TREE_TYPE (expr);
2821 if (TREE_CODE (type) == BOOLEAN_TYPE)
2822 return expr;
2824 switch (TREE_CODE (expr))
2826 case TRUTH_AND_EXPR:
2827 case TRUTH_OR_EXPR:
2828 case TRUTH_XOR_EXPR:
2829 case TRUTH_ANDIF_EXPR:
2830 case TRUTH_ORIF_EXPR:
2831 /* Also boolify the arguments of truth exprs. */
2832 TREE_OPERAND (expr, 1) = gimple_boolify (TREE_OPERAND (expr, 1));
2833 /* FALLTHRU */
2835 case TRUTH_NOT_EXPR:
2836 TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2837 /* FALLTHRU */
2839 case EQ_EXPR: case NE_EXPR:
2840 case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2841 /* These expressions always produce boolean results. */
2842 TREE_TYPE (expr) = boolean_type_node;
2843 return expr;
2845 default:
2846 /* Other expressions that get here must have boolean values, but
2847 might need to be converted to the appropriate mode. */
2848 return fold_convert (boolean_type_node, expr);
2852 /* Given a conditional expression *EXPR_P without side effects, gimplify
2853 its operands. New statements are inserted to PRE_P. */
2855 static enum gimplify_status
2856 gimplify_pure_cond_expr (tree *expr_p, gimple_seq *pre_p)
2858 tree expr = *expr_p, cond;
2859 enum gimplify_status ret, tret;
2860 enum tree_code code;
2862 cond = gimple_boolify (COND_EXPR_COND (expr));
2864 /* We need to handle && and || specially, as their gimplification
2865 creates pure cond_expr, thus leading to an infinite cycle otherwise. */
2866 code = TREE_CODE (cond);
2867 if (code == TRUTH_ANDIF_EXPR)
2868 TREE_SET_CODE (cond, TRUTH_AND_EXPR);
2869 else if (code == TRUTH_ORIF_EXPR)
2870 TREE_SET_CODE (cond, TRUTH_OR_EXPR);
2871 ret = gimplify_expr (&cond, pre_p, NULL, is_gimple_condexpr, fb_rvalue);
2872 COND_EXPR_COND (*expr_p) = cond;
2874 tret = gimplify_expr (&COND_EXPR_THEN (expr), pre_p, NULL,
2875 is_gimple_val, fb_rvalue);
2876 ret = MIN (ret, tret);
2877 tret = gimplify_expr (&COND_EXPR_ELSE (expr), pre_p, NULL,
2878 is_gimple_val, fb_rvalue);
2880 return MIN (ret, tret);
2883 /* Returns true if evaluating EXPR could trap.
2884 EXPR is GENERIC, while tree_could_trap_p can be called
2885 only on GIMPLE. */
2887 static bool
2888 generic_expr_could_trap_p (tree expr)
2890 unsigned i, n;
2892 if (!expr || is_gimple_val (expr))
2893 return false;
2895 if (!EXPR_P (expr) || tree_could_trap_p (expr))
2896 return true;
2898 n = TREE_OPERAND_LENGTH (expr);
2899 for (i = 0; i < n; i++)
2900 if (generic_expr_could_trap_p (TREE_OPERAND (expr, i)))
2901 return true;
2903 return false;
2906 /* Convert the conditional expression pointed to by EXPR_P '(p) ? a : b;'
2907 into
2909 if (p) if (p)
2910 t1 = a; a;
2911 else or else
2912 t1 = b; b;
2915 The second form is used when *EXPR_P is of type void.
2917 PRE_P points to the list where side effects that must happen before
2918 *EXPR_P should be stored. */
2920 static enum gimplify_status
2921 gimplify_cond_expr (tree *expr_p, gimple_seq *pre_p, fallback_t fallback)
2923 tree expr = *expr_p;
2924 tree tmp, type, arm1, arm2;
2925 enum gimplify_status ret;
2926 tree label_true, label_false, label_cont;
2927 bool have_then_clause_p, have_else_clause_p;
2928 gimple gimple_cond;
2929 enum tree_code pred_code;
2930 gimple_seq seq = NULL;
2932 type = TREE_TYPE (expr);
2934 /* If this COND_EXPR has a value, copy the values into a temporary within
2935 the arms. */
2936 if (! VOID_TYPE_P (type))
2938 tree result;
2940 /* If an rvalue is ok or we do not require an lvalue, avoid creating
2941 an addressable temporary. */
2942 if (((fallback & fb_rvalue)
2943 || !(fallback & fb_lvalue))
2944 && !TREE_ADDRESSABLE (type))
2946 if (gimplify_ctxp->allow_rhs_cond_expr
2947 /* If either branch has side effects or could trap, it can't be
2948 evaluated unconditionally. */
2949 && !TREE_SIDE_EFFECTS (TREE_OPERAND (*expr_p, 1))
2950 && !generic_expr_could_trap_p (TREE_OPERAND (*expr_p, 1))
2951 && !TREE_SIDE_EFFECTS (TREE_OPERAND (*expr_p, 2))
2952 && !generic_expr_could_trap_p (TREE_OPERAND (*expr_p, 2)))
2953 return gimplify_pure_cond_expr (expr_p, pre_p);
2955 result = tmp = create_tmp_var (TREE_TYPE (expr), "iftmp");
2956 ret = GS_ALL_DONE;
2958 else
2960 tree type = build_pointer_type (TREE_TYPE (expr));
2962 if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2963 TREE_OPERAND (expr, 1) =
2964 build_fold_addr_expr (TREE_OPERAND (expr, 1));
2966 if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2967 TREE_OPERAND (expr, 2) =
2968 build_fold_addr_expr (TREE_OPERAND (expr, 2));
2970 tmp = create_tmp_var (type, "iftmp");
2972 expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (expr, 0),
2973 TREE_OPERAND (expr, 1), TREE_OPERAND (expr, 2));
2975 result = build_fold_indirect_ref (tmp);
2978 /* Build the then clause, 't1 = a;'. But don't build an assignment
2979 if this branch is void; in C++ it can be, if it's a throw. */
2980 if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2981 TREE_OPERAND (expr, 1)
2982 = build2 (MODIFY_EXPR, TREE_TYPE (tmp), tmp, TREE_OPERAND (expr, 1));
2984 /* Build the else clause, 't1 = b;'. */
2985 if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2986 TREE_OPERAND (expr, 2)
2987 = build2 (MODIFY_EXPR, TREE_TYPE (tmp), tmp, TREE_OPERAND (expr, 2));
2989 TREE_TYPE (expr) = void_type_node;
2990 recalculate_side_effects (expr);
2992 /* Move the COND_EXPR to the prequeue. */
2993 gimplify_stmt (&expr, pre_p);
2995 *expr_p = result;
2996 return GS_ALL_DONE;
2999 /* Make sure the condition has BOOLEAN_TYPE. */
3000 TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
3002 /* Break apart && and || conditions. */
3003 if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
3004 || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
3006 expr = shortcut_cond_expr (expr);
3008 if (expr != *expr_p)
3010 *expr_p = expr;
3012 /* We can't rely on gimplify_expr to re-gimplify the expanded
3013 form properly, as cleanups might cause the target labels to be
3014 wrapped in a TRY_FINALLY_EXPR. To prevent that, we need to
3015 set up a conditional context. */
3016 gimple_push_condition ();
3017 gimplify_stmt (expr_p, &seq);
3018 gimple_pop_condition (pre_p);
3019 gimple_seq_add_seq (pre_p, seq);
3021 return GS_ALL_DONE;
3025 /* Now do the normal gimplification. */
3027 /* Gimplify condition. */
3028 ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL, is_gimple_condexpr,
3029 fb_rvalue);
3030 if (ret == GS_ERROR)
3031 return GS_ERROR;
3032 gcc_assert (TREE_OPERAND (expr, 0) != NULL_TREE);
3034 gimple_push_condition ();
3036 have_then_clause_p = have_else_clause_p = false;
3037 if (TREE_OPERAND (expr, 1) != NULL
3038 && TREE_CODE (TREE_OPERAND (expr, 1)) == GOTO_EXPR
3039 && TREE_CODE (GOTO_DESTINATION (TREE_OPERAND (expr, 1))) == LABEL_DECL
3040 && (DECL_CONTEXT (GOTO_DESTINATION (TREE_OPERAND (expr, 1)))
3041 == current_function_decl)
3042 /* For -O0 avoid this optimization if the COND_EXPR and GOTO_EXPR
3043 have different locations, otherwise we end up with incorrect
3044 location information on the branches. */
3045 && (optimize
3046 || !EXPR_HAS_LOCATION (expr)
3047 || !EXPR_HAS_LOCATION (TREE_OPERAND (expr, 1))
3048 || EXPR_LOCATION (expr) == EXPR_LOCATION (TREE_OPERAND (expr, 1))))
3050 label_true = GOTO_DESTINATION (TREE_OPERAND (expr, 1));
3051 have_then_clause_p = true;
3053 else
3054 label_true = create_artificial_label (UNKNOWN_LOCATION);
3055 if (TREE_OPERAND (expr, 2) != NULL
3056 && TREE_CODE (TREE_OPERAND (expr, 2)) == GOTO_EXPR
3057 && TREE_CODE (GOTO_DESTINATION (TREE_OPERAND (expr, 2))) == LABEL_DECL
3058 && (DECL_CONTEXT (GOTO_DESTINATION (TREE_OPERAND (expr, 2)))
3059 == current_function_decl)
3060 /* For -O0 avoid this optimization if the COND_EXPR and GOTO_EXPR
3061 have different locations, otherwise we end up with incorrect
3062 location information on the branches. */
3063 && (optimize
3064 || !EXPR_HAS_LOCATION (expr)
3065 || !EXPR_HAS_LOCATION (TREE_OPERAND (expr, 2))
3066 || EXPR_LOCATION (expr) == EXPR_LOCATION (TREE_OPERAND (expr, 2))))
3068 label_false = GOTO_DESTINATION (TREE_OPERAND (expr, 2));
3069 have_else_clause_p = true;
3071 else
3072 label_false = create_artificial_label (UNKNOWN_LOCATION);
3074 gimple_cond_get_ops_from_tree (COND_EXPR_COND (expr), &pred_code, &arm1,
3075 &arm2);
3077 gimple_cond = gimple_build_cond (pred_code, arm1, arm2, label_true,
3078 label_false);
3080 gimplify_seq_add_stmt (&seq, gimple_cond);
3081 label_cont = NULL_TREE;
3082 if (!have_then_clause_p)
3084 /* For if (...) {} else { code; } put label_true after
3085 the else block. */
3086 if (TREE_OPERAND (expr, 1) == NULL_TREE
3087 && !have_else_clause_p
3088 && TREE_OPERAND (expr, 2) != NULL_TREE)
3089 label_cont = label_true;
3090 else
3092 gimplify_seq_add_stmt (&seq, gimple_build_label (label_true));
3093 have_then_clause_p = gimplify_stmt (&TREE_OPERAND (expr, 1), &seq);
3094 /* For if (...) { code; } else {} or
3095 if (...) { code; } else goto label; or
3096 if (...) { code; return; } else { ... }
3097 label_cont isn't needed. */
3098 if (!have_else_clause_p
3099 && TREE_OPERAND (expr, 2) != NULL_TREE
3100 && gimple_seq_may_fallthru (seq))
3102 gimple g;
3103 label_cont = create_artificial_label (UNKNOWN_LOCATION);
3105 g = gimple_build_goto (label_cont);
3107 /* GIMPLE_COND's are very low level; they have embedded
3108 gotos. This particular embedded goto should not be marked
3109 with the location of the original COND_EXPR, as it would
3110 correspond to the COND_EXPR's condition, not the ELSE or the
3111 THEN arms. To avoid marking it with the wrong location, flag
3112 it as "no location". */
3113 gimple_set_do_not_emit_location (g);
3115 gimplify_seq_add_stmt (&seq, g);
3119 if (!have_else_clause_p)
3121 gimplify_seq_add_stmt (&seq, gimple_build_label (label_false));
3122 have_else_clause_p = gimplify_stmt (&TREE_OPERAND (expr, 2), &seq);
3124 if (label_cont)
3125 gimplify_seq_add_stmt (&seq, gimple_build_label (label_cont));
3127 gimple_pop_condition (pre_p);
3128 gimple_seq_add_seq (pre_p, seq);
3130 if (ret == GS_ERROR)
3131 ; /* Do nothing. */
3132 else if (have_then_clause_p || have_else_clause_p)
3133 ret = GS_ALL_DONE;
3134 else
3136 /* Both arms are empty; replace the COND_EXPR with its predicate. */
3137 expr = TREE_OPERAND (expr, 0);
3138 gimplify_stmt (&expr, pre_p);
3141 *expr_p = NULL;
3142 return ret;
3145 /* A subroutine of gimplify_modify_expr. Replace a MODIFY_EXPR with
3146 a call to __builtin_memcpy. */
3148 static enum gimplify_status
3149 gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value,
3150 gimple_seq *seq_p)
3152 tree t, to, to_ptr, from, from_ptr;
3153 gimple gs;
3155 to = TREE_OPERAND (*expr_p, 0);
3156 from = TREE_OPERAND (*expr_p, 1);
3158 mark_addressable (from);
3159 from_ptr = build_fold_addr_expr (from);
3160 gimplify_arg (&from_ptr, seq_p, EXPR_LOCATION (*expr_p));
3162 mark_addressable (to);
3163 to_ptr = build_fold_addr_expr (to);
3164 gimplify_arg (&to_ptr, seq_p, EXPR_LOCATION (*expr_p));
3166 t = implicit_built_in_decls[BUILT_IN_MEMCPY];
3168 gs = gimple_build_call (t, 3, to_ptr, from_ptr, size);
3170 if (want_value)
3172 /* tmp = memcpy() */
3173 t = create_tmp_var (TREE_TYPE (to_ptr), NULL);
3174 gimple_call_set_lhs (gs, t);
3175 gimplify_seq_add_stmt (seq_p, gs);
3177 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (to), t);
3178 return GS_ALL_DONE;
3181 gimplify_seq_add_stmt (seq_p, gs);
3182 *expr_p = NULL;
3183 return GS_ALL_DONE;
3186 /* A subroutine of gimplify_modify_expr. Replace a MODIFY_EXPR with
3187 a call to __builtin_memset. In this case we know that the RHS is
3188 a CONSTRUCTOR with an empty element list. */
3190 static enum gimplify_status
3191 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value,
3192 gimple_seq *seq_p)
3194 tree t, from, to, to_ptr;
3195 gimple gs;
3197 /* Assert our assumptions, to abort instead of producing wrong code
3198 silently if they are not met. Beware that the RHS CONSTRUCTOR might
3199 not be immediately exposed. */
3200 from = TREE_OPERAND (*expr_p, 1);
3201 if (TREE_CODE (from) == WITH_SIZE_EXPR)
3202 from = TREE_OPERAND (from, 0);
3204 gcc_assert (TREE_CODE (from) == CONSTRUCTOR
3205 && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (from)));
3207 /* Now proceed. */
3208 to = TREE_OPERAND (*expr_p, 0);
3210 to_ptr = build_fold_addr_expr (to);
3211 gimplify_arg (&to_ptr, seq_p, EXPR_LOCATION (*expr_p));
3212 t = implicit_built_in_decls[BUILT_IN_MEMSET];
3214 gs = gimple_build_call (t, 3, to_ptr, integer_zero_node, size);
3216 if (want_value)
3218 /* tmp = memset() */
3219 t = create_tmp_var (TREE_TYPE (to_ptr), NULL);
3220 gimple_call_set_lhs (gs, t);
3221 gimplify_seq_add_stmt (seq_p, gs);
3223 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (to), t);
3224 return GS_ALL_DONE;
3227 gimplify_seq_add_stmt (seq_p, gs);
3228 *expr_p = NULL;
3229 return GS_ALL_DONE;
3232 /* A subroutine of gimplify_init_ctor_preeval. Called via walk_tree,
3233 determine, cautiously, if a CONSTRUCTOR overlaps the lhs of an
3234 assignment. Returns non-null if we detect a potential overlap. */
3236 struct gimplify_init_ctor_preeval_data
3238 /* The base decl of the lhs object. May be NULL, in which case we
3239 have to assume the lhs is indirect. */
3240 tree lhs_base_decl;
3242 /* The alias set of the lhs object. */
3243 alias_set_type lhs_alias_set;
3246 static tree
3247 gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
3249 struct gimplify_init_ctor_preeval_data *data
3250 = (struct gimplify_init_ctor_preeval_data *) xdata;
3251 tree t = *tp;
3253 /* If we find the base object, obviously we have overlap. */
3254 if (data->lhs_base_decl == t)
3255 return t;
3257 /* If the constructor component is indirect, determine if we have a
3258 potential overlap with the lhs. The only bits of information we
3259 have to go on at this point are addressability and alias sets. */
3260 if (TREE_CODE (t) == INDIRECT_REF
3261 && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
3262 && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
3263 return t;
3265 /* If the constructor component is a call, determine if it can hide a
3266 potential overlap with the lhs through an INDIRECT_REF like above. */
3267 if (TREE_CODE (t) == CALL_EXPR)
3269 tree type, fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (t)));
3271 for (type = TYPE_ARG_TYPES (fntype); type; type = TREE_CHAIN (type))
3272 if (POINTER_TYPE_P (TREE_VALUE (type))
3273 && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
3274 && alias_sets_conflict_p (data->lhs_alias_set,
3275 get_alias_set
3276 (TREE_TYPE (TREE_VALUE (type)))))
3277 return t;
3280 if (IS_TYPE_OR_DECL_P (t))
3281 *walk_subtrees = 0;
3282 return NULL;
3285 /* A subroutine of gimplify_init_constructor. Pre-evaluate EXPR,
3286 force values that overlap with the lhs (as described by *DATA)
3287 into temporaries. */
3289 static void
3290 gimplify_init_ctor_preeval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
3291 struct gimplify_init_ctor_preeval_data *data)
3293 enum gimplify_status one;
3295 /* If the value is constant, then there's nothing to pre-evaluate. */
3296 if (TREE_CONSTANT (*expr_p))
3298 /* Ensure it does not have side effects, it might contain a reference to
3299 the object we're initializing. */
3300 gcc_assert (!TREE_SIDE_EFFECTS (*expr_p));
3301 return;
3304 /* If the type has non-trivial constructors, we can't pre-evaluate. */
3305 if (TREE_ADDRESSABLE (TREE_TYPE (*expr_p)))
3306 return;
3308 /* Recurse for nested constructors. */
3309 if (TREE_CODE (*expr_p) == CONSTRUCTOR)
3311 unsigned HOST_WIDE_INT ix;
3312 constructor_elt *ce;
3313 VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (*expr_p);
3315 for (ix = 0; VEC_iterate (constructor_elt, v, ix, ce); ix++)
3316 gimplify_init_ctor_preeval (&ce->value, pre_p, post_p, data);
3318 return;
3321 /* If this is a variable sized type, we must remember the size. */
3322 maybe_with_size_expr (expr_p);
3324 /* Gimplify the constructor element to something appropriate for the rhs
3325 of a MODIFY_EXPR. Given that we know the LHS is an aggregate, we know
3326 the gimplifier will consider this a store to memory. Doing this
3327 gimplification now means that we won't have to deal with complicated
3328 language-specific trees, nor trees like SAVE_EXPR that can induce
3329 exponential search behavior. */
3330 one = gimplify_expr (expr_p, pre_p, post_p, is_gimple_mem_rhs, fb_rvalue);
3331 if (one == GS_ERROR)
3333 *expr_p = NULL;
3334 return;
3337 /* If we gimplified to a bare decl, we can be sure that it doesn't overlap
3338 with the lhs, since "a = { .x=a }" doesn't make sense. This will
3339 always be true for all scalars, since is_gimple_mem_rhs insists on a
3340 temporary variable for them. */
3341 if (DECL_P (*expr_p))
3342 return;
3344 /* If this is of variable size, we have no choice but to assume it doesn't
3345 overlap since we can't make a temporary for it. */
3346 if (TREE_CODE (TYPE_SIZE (TREE_TYPE (*expr_p))) != INTEGER_CST)
3347 return;
3349 /* Otherwise, we must search for overlap ... */
3350 if (!walk_tree (expr_p, gimplify_init_ctor_preeval_1, data, NULL))
3351 return;
3353 /* ... and if found, force the value into a temporary. */
3354 *expr_p = get_formal_tmp_var (*expr_p, pre_p);
3357 /* A subroutine of gimplify_init_ctor_eval. Create a loop for
3358 a RANGE_EXPR in a CONSTRUCTOR for an array.
3360 var = lower;
3361 loop_entry:
3362 object[var] = value;
3363 if (var == upper)
3364 goto loop_exit;
3365 var = var + 1;
3366 goto loop_entry;
3367 loop_exit:
3369 We increment var _after_ the loop exit check because we might otherwise
3370 fail if upper == TYPE_MAX_VALUE (type for upper).
3372 Note that we never have to deal with SAVE_EXPRs here, because this has
3373 already been taken care of for us, in gimplify_init_ctor_preeval(). */
3375 static void gimplify_init_ctor_eval (tree, VEC(constructor_elt,gc) *,
3376 gimple_seq *, bool);
3378 static void
3379 gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
3380 tree value, tree array_elt_type,
3381 gimple_seq *pre_p, bool cleared)
3383 tree loop_entry_label, loop_exit_label, fall_thru_label;
3384 tree var, var_type, cref, tmp;
3386 loop_entry_label = create_artificial_label (UNKNOWN_LOCATION);
3387 loop_exit_label = create_artificial_label (UNKNOWN_LOCATION);
3388 fall_thru_label = create_artificial_label (UNKNOWN_LOCATION);
3390 /* Create and initialize the index variable. */
3391 var_type = TREE_TYPE (upper);
3392 var = create_tmp_var (var_type, NULL);
3393 gimplify_seq_add_stmt (pre_p, gimple_build_assign (var, lower));
3395 /* Add the loop entry label. */
3396 gimplify_seq_add_stmt (pre_p, gimple_build_label (loop_entry_label));
3398 /* Build the reference. */
3399 cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3400 var, NULL_TREE, NULL_TREE);
3402 /* If we are a constructor, just call gimplify_init_ctor_eval to do
3403 the store. Otherwise just assign value to the reference. */
3405 if (TREE_CODE (value) == CONSTRUCTOR)
3406 /* NB we might have to call ourself recursively through
3407 gimplify_init_ctor_eval if the value is a constructor. */
3408 gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3409 pre_p, cleared);
3410 else
3411 gimplify_seq_add_stmt (pre_p, gimple_build_assign (cref, value));
3413 /* We exit the loop when the index var is equal to the upper bound. */
3414 gimplify_seq_add_stmt (pre_p,
3415 gimple_build_cond (EQ_EXPR, var, upper,
3416 loop_exit_label, fall_thru_label));
3418 gimplify_seq_add_stmt (pre_p, gimple_build_label (fall_thru_label));
3420 /* Otherwise, increment the index var... */
3421 tmp = build2 (PLUS_EXPR, var_type, var,
3422 fold_convert (var_type, integer_one_node));
3423 gimplify_seq_add_stmt (pre_p, gimple_build_assign (var, tmp));
3425 /* ...and jump back to the loop entry. */
3426 gimplify_seq_add_stmt (pre_p, gimple_build_goto (loop_entry_label));
3428 /* Add the loop exit label. */
3429 gimplify_seq_add_stmt (pre_p, gimple_build_label (loop_exit_label));
3432 /* Return true if FDECL is accessing a field that is zero sized. */
3434 static bool
3435 zero_sized_field_decl (const_tree fdecl)
3437 if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl)
3438 && integer_zerop (DECL_SIZE (fdecl)))
3439 return true;
3440 return false;
3443 /* Return true if TYPE is zero sized. */
3445 static bool
3446 zero_sized_type (const_tree type)
3448 if (AGGREGATE_TYPE_P (type) && TYPE_SIZE (type)
3449 && integer_zerop (TYPE_SIZE (type)))
3450 return true;
3451 return false;
3454 /* A subroutine of gimplify_init_constructor. Generate individual
3455 MODIFY_EXPRs for a CONSTRUCTOR. OBJECT is the LHS against which the
3456 assignments should happen. ELTS is the CONSTRUCTOR_ELTS of the
3457 CONSTRUCTOR. CLEARED is true if the entire LHS object has been
3458 zeroed first. */
3460 static void
3461 gimplify_init_ctor_eval (tree object, VEC(constructor_elt,gc) *elts,
3462 gimple_seq *pre_p, bool cleared)
3464 tree array_elt_type = NULL;
3465 unsigned HOST_WIDE_INT ix;
3466 tree purpose, value;
3468 if (TREE_CODE (TREE_TYPE (object)) == ARRAY_TYPE)
3469 array_elt_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
3471 FOR_EACH_CONSTRUCTOR_ELT (elts, ix, purpose, value)
3473 tree cref;
3475 /* NULL values are created above for gimplification errors. */
3476 if (value == NULL)
3477 continue;
3479 if (cleared && initializer_zerop (value))
3480 continue;
3482 /* ??? Here's to hoping the front end fills in all of the indices,
3483 so we don't have to figure out what's missing ourselves. */
3484 gcc_assert (purpose);
3486 /* Skip zero-sized fields, unless value has side-effects. This can
3487 happen with calls to functions returning a zero-sized type, which
3488 we shouldn't discard. As a number of downstream passes don't
3489 expect sets of zero-sized fields, we rely on the gimplification of
3490 the MODIFY_EXPR we make below to drop the assignment statement. */
3491 if (! TREE_SIDE_EFFECTS (value) && zero_sized_field_decl (purpose))
3492 continue;
3494 /* If we have a RANGE_EXPR, we have to build a loop to assign the
3495 whole range. */
3496 if (TREE_CODE (purpose) == RANGE_EXPR)
3498 tree lower = TREE_OPERAND (purpose, 0);
3499 tree upper = TREE_OPERAND (purpose, 1);
3501 /* If the lower bound is equal to upper, just treat it as if
3502 upper was the index. */
3503 if (simple_cst_equal (lower, upper))
3504 purpose = upper;
3505 else
3507 gimplify_init_ctor_eval_range (object, lower, upper, value,
3508 array_elt_type, pre_p, cleared);
3509 continue;
3513 if (array_elt_type)
3515 /* Do not use bitsizetype for ARRAY_REF indices. */
3516 if (TYPE_DOMAIN (TREE_TYPE (object)))
3517 purpose = fold_convert (TREE_TYPE (TYPE_DOMAIN (TREE_TYPE (object))),
3518 purpose);
3519 cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3520 purpose, NULL_TREE, NULL_TREE);
3522 else
3524 gcc_assert (TREE_CODE (purpose) == FIELD_DECL);
3525 cref = build3 (COMPONENT_REF, TREE_TYPE (purpose),
3526 unshare_expr (object), purpose, NULL_TREE);
3529 if (TREE_CODE (value) == CONSTRUCTOR
3530 && TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE)
3531 gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3532 pre_p, cleared);
3533 else
3535 tree init = build2 (INIT_EXPR, TREE_TYPE (cref), cref, value);
3536 gimplify_and_add (init, pre_p);
3537 ggc_free (init);
3543 /* Returns the appropriate RHS predicate for this LHS. */
3545 gimple_predicate
3546 rhs_predicate_for (tree lhs)
3548 if (is_gimple_reg (lhs))
3549 return is_gimple_reg_rhs_or_call;
3550 else
3551 return is_gimple_mem_rhs_or_call;
3554 /* Gimplify a C99 compound literal expression. This just means adding
3555 the DECL_EXPR before the current statement and using its anonymous
3556 decl instead. */
3558 static enum gimplify_status
3559 gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p)
3561 tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (*expr_p);
3562 tree decl = DECL_EXPR_DECL (decl_s);
3563 /* Mark the decl as addressable if the compound literal
3564 expression is addressable now, otherwise it is marked too late
3565 after we gimplify the initialization expression. */
3566 if (TREE_ADDRESSABLE (*expr_p))
3567 TREE_ADDRESSABLE (decl) = 1;
3569 /* Preliminarily mark non-addressed complex variables as eligible
3570 for promotion to gimple registers. We'll transform their uses
3571 as we find them. */
3572 if ((TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE
3573 || TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE)
3574 && !TREE_THIS_VOLATILE (decl)
3575 && !needs_to_live_in_memory (decl))
3576 DECL_GIMPLE_REG_P (decl) = 1;
3578 /* This decl isn't mentioned in the enclosing block, so add it to the
3579 list of temps. FIXME it seems a bit of a kludge to say that
3580 anonymous artificial vars aren't pushed, but everything else is. */
3581 if (DECL_NAME (decl) == NULL_TREE && !DECL_SEEN_IN_BIND_EXPR_P (decl))
3582 gimple_add_tmp_var (decl);
3584 gimplify_and_add (decl_s, pre_p);
3585 *expr_p = decl;
3586 return GS_OK;
3589 /* Optimize embedded COMPOUND_LITERAL_EXPRs within a CONSTRUCTOR,
3590 return a new CONSTRUCTOR if something changed. */
3592 static tree
3593 optimize_compound_literals_in_ctor (tree orig_ctor)
3595 tree ctor = orig_ctor;
3596 VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (ctor);
3597 unsigned int idx, num = VEC_length (constructor_elt, elts);
3599 for (idx = 0; idx < num; idx++)
3601 tree value = VEC_index (constructor_elt, elts, idx)->value;
3602 tree newval = value;
3603 if (TREE_CODE (value) == CONSTRUCTOR)
3604 newval = optimize_compound_literals_in_ctor (value);
3605 else if (TREE_CODE (value) == COMPOUND_LITERAL_EXPR)
3607 tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (value);
3608 tree decl = DECL_EXPR_DECL (decl_s);
3609 tree init = DECL_INITIAL (decl);
3611 if (!TREE_ADDRESSABLE (value)
3612 && !TREE_ADDRESSABLE (decl)
3613 && init)
3614 newval = optimize_compound_literals_in_ctor (init);
3616 if (newval == value)
3617 continue;
3619 if (ctor == orig_ctor)
3621 ctor = copy_node (orig_ctor);
3622 CONSTRUCTOR_ELTS (ctor) = VEC_copy (constructor_elt, gc, elts);
3623 elts = CONSTRUCTOR_ELTS (ctor);
3625 VEC_index (constructor_elt, elts, idx)->value = newval;
3627 return ctor;
3632 /* A subroutine of gimplify_modify_expr. Break out elements of a
3633 CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
3635 Note that we still need to clear any elements that don't have explicit
3636 initializers, so if not all elements are initialized we keep the
3637 original MODIFY_EXPR, we just remove all of the constructor elements.
3639 If NOTIFY_TEMP_CREATION is true, do not gimplify, just return
3640 GS_ERROR if we would have to create a temporary when gimplifying
3641 this constructor. Otherwise, return GS_OK.
3643 If NOTIFY_TEMP_CREATION is false, just do the gimplification. */
3645 static enum gimplify_status
3646 gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
3647 bool want_value, bool notify_temp_creation)
3649 tree object, ctor, type;
3650 enum gimplify_status ret;
3651 VEC(constructor_elt,gc) *elts;
3653 gcc_assert (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == CONSTRUCTOR);
3655 if (!notify_temp_creation)
3657 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3658 is_gimple_lvalue, fb_lvalue);
3659 if (ret == GS_ERROR)
3660 return ret;
3663 object = TREE_OPERAND (*expr_p, 0);
3664 ctor = TREE_OPERAND (*expr_p, 1) =
3665 optimize_compound_literals_in_ctor (TREE_OPERAND (*expr_p, 1));
3666 type = TREE_TYPE (ctor);
3667 elts = CONSTRUCTOR_ELTS (ctor);
3668 ret = GS_ALL_DONE;
3670 switch (TREE_CODE (type))
3672 case RECORD_TYPE:
3673 case UNION_TYPE:
3674 case QUAL_UNION_TYPE:
3675 case ARRAY_TYPE:
3677 struct gimplify_init_ctor_preeval_data preeval_data;
3678 HOST_WIDE_INT num_type_elements, num_ctor_elements;
3679 HOST_WIDE_INT num_nonzero_elements;
3680 bool cleared, valid_const_initializer;
3682 /* Aggregate types must lower constructors to initialization of
3683 individual elements. The exception is that a CONSTRUCTOR node
3684 with no elements indicates zero-initialization of the whole. */
3685 if (VEC_empty (constructor_elt, elts))
3687 if (notify_temp_creation)
3688 return GS_OK;
3689 break;
3692 /* Fetch information about the constructor to direct later processing.
3693 We might want to make static versions of it in various cases, and
3694 can only do so if it known to be a valid constant initializer. */
3695 valid_const_initializer
3696 = categorize_ctor_elements (ctor, &num_nonzero_elements,
3697 &num_ctor_elements, &cleared);
3699 /* If a const aggregate variable is being initialized, then it
3700 should never be a lose to promote the variable to be static. */
3701 if (valid_const_initializer
3702 && num_nonzero_elements > 1
3703 && TREE_READONLY (object)
3704 && TREE_CODE (object) == VAR_DECL
3705 && (flag_merge_constants >= 2 || !TREE_ADDRESSABLE (object)))
3707 if (notify_temp_creation)
3708 return GS_ERROR;
3709 DECL_INITIAL (object) = ctor;
3710 TREE_STATIC (object) = 1;
3711 if (!DECL_NAME (object))
3712 DECL_NAME (object) = create_tmp_var_name ("C");
3713 walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
3715 /* ??? C++ doesn't automatically append a .<number> to the
3716 assembler name, and even when it does, it looks a FE private
3717 data structures to figure out what that number should be,
3718 which are not set for this variable. I suppose this is
3719 important for local statics for inline functions, which aren't
3720 "local" in the object file sense. So in order to get a unique
3721 TU-local symbol, we must invoke the lhd version now. */
3722 lhd_set_decl_assembler_name (object);
3724 *expr_p = NULL_TREE;
3725 break;
3728 /* If there are "lots" of initialized elements, even discounting
3729 those that are not address constants (and thus *must* be
3730 computed at runtime), then partition the constructor into
3731 constant and non-constant parts. Block copy the constant
3732 parts in, then generate code for the non-constant parts. */
3733 /* TODO. There's code in cp/typeck.c to do this. */
3735 num_type_elements = count_type_elements (type, true);
3737 /* If count_type_elements could not determine number of type elements
3738 for a constant-sized object, assume clearing is needed.
3739 Don't do this for variable-sized objects, as store_constructor
3740 will ignore the clearing of variable-sized objects. */
3741 if (num_type_elements < 0 && int_size_in_bytes (type) >= 0)
3742 cleared = true;
3743 /* If there are "lots" of zeros, then block clear the object first. */
3744 else if (num_type_elements - num_nonzero_elements
3745 > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
3746 && num_nonzero_elements < num_type_elements/4)
3747 cleared = true;
3748 /* ??? This bit ought not be needed. For any element not present
3749 in the initializer, we should simply set them to zero. Except
3750 we'd need to *find* the elements that are not present, and that
3751 requires trickery to avoid quadratic compile-time behavior in
3752 large cases or excessive memory use in small cases. */
3753 else if (num_ctor_elements < num_type_elements)
3754 cleared = true;
3756 /* If there are "lots" of initialized elements, and all of them
3757 are valid address constants, then the entire initializer can
3758 be dropped to memory, and then memcpy'd out. Don't do this
3759 for sparse arrays, though, as it's more efficient to follow
3760 the standard CONSTRUCTOR behavior of memset followed by
3761 individual element initialization. Also don't do this for small
3762 all-zero initializers (which aren't big enough to merit
3763 clearing), and don't try to make bitwise copies of
3764 TREE_ADDRESSABLE types. */
3765 if (valid_const_initializer
3766 && !(cleared || num_nonzero_elements == 0)
3767 && !TREE_ADDRESSABLE (type))
3769 HOST_WIDE_INT size = int_size_in_bytes (type);
3770 unsigned int align;
3772 /* ??? We can still get unbounded array types, at least
3773 from the C++ front end. This seems wrong, but attempt
3774 to work around it for now. */
3775 if (size < 0)
3777 size = int_size_in_bytes (TREE_TYPE (object));
3778 if (size >= 0)
3779 TREE_TYPE (ctor) = type = TREE_TYPE (object);
3782 /* Find the maximum alignment we can assume for the object. */
3783 /* ??? Make use of DECL_OFFSET_ALIGN. */
3784 if (DECL_P (object))
3785 align = DECL_ALIGN (object);
3786 else
3787 align = TYPE_ALIGN (type);
3789 if (size > 0
3790 && num_nonzero_elements > 1
3791 && !can_move_by_pieces (size, align))
3793 tree new_tree;
3795 if (notify_temp_creation)
3796 return GS_ERROR;
3798 new_tree = create_tmp_var_raw (type, "C");
3800 gimple_add_tmp_var (new_tree);
3801 TREE_STATIC (new_tree) = 1;
3802 TREE_READONLY (new_tree) = 1;
3803 DECL_INITIAL (new_tree) = ctor;
3804 if (align > DECL_ALIGN (new_tree))
3806 DECL_ALIGN (new_tree) = align;
3807 DECL_USER_ALIGN (new_tree) = 1;
3809 walk_tree (&DECL_INITIAL (new_tree), force_labels_r, NULL, NULL);
3811 TREE_OPERAND (*expr_p, 1) = new_tree;
3813 /* This is no longer an assignment of a CONSTRUCTOR, but
3814 we still may have processing to do on the LHS. So
3815 pretend we didn't do anything here to let that happen. */
3816 return GS_UNHANDLED;
3820 if (notify_temp_creation)
3821 return GS_OK;
3823 /* If there are nonzero elements, pre-evaluate to capture elements
3824 overlapping with the lhs into temporaries. We must do this before
3825 clearing to fetch the values before they are zeroed-out. */
3826 if (num_nonzero_elements > 0)
3828 preeval_data.lhs_base_decl = get_base_address (object);
3829 if (!DECL_P (preeval_data.lhs_base_decl))
3830 preeval_data.lhs_base_decl = NULL;
3831 preeval_data.lhs_alias_set = get_alias_set (object);
3833 gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
3834 pre_p, post_p, &preeval_data);
3837 if (cleared)
3839 /* Zap the CONSTRUCTOR element list, which simplifies this case.
3840 Note that we still have to gimplify, in order to handle the
3841 case of variable sized types. Avoid shared tree structures. */
3842 CONSTRUCTOR_ELTS (ctor) = NULL;
3843 TREE_SIDE_EFFECTS (ctor) = 0;
3844 object = unshare_expr (object);
3845 gimplify_stmt (expr_p, pre_p);
3848 /* If we have not block cleared the object, or if there are nonzero
3849 elements in the constructor, add assignments to the individual
3850 scalar fields of the object. */
3851 if (!cleared || num_nonzero_elements > 0)
3852 gimplify_init_ctor_eval (object, elts, pre_p, cleared);
3854 *expr_p = NULL_TREE;
3856 break;
3858 case COMPLEX_TYPE:
3860 tree r, i;
3862 if (notify_temp_creation)
3863 return GS_OK;
3865 /* Extract the real and imaginary parts out of the ctor. */
3866 gcc_assert (VEC_length (constructor_elt, elts) == 2);
3867 r = VEC_index (constructor_elt, elts, 0)->value;
3868 i = VEC_index (constructor_elt, elts, 1)->value;
3869 if (r == NULL || i == NULL)
3871 tree zero = fold_convert (TREE_TYPE (type), integer_zero_node);
3872 if (r == NULL)
3873 r = zero;
3874 if (i == NULL)
3875 i = zero;
3878 /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
3879 represent creation of a complex value. */
3880 if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
3882 ctor = build_complex (type, r, i);
3883 TREE_OPERAND (*expr_p, 1) = ctor;
3885 else
3887 ctor = build2 (COMPLEX_EXPR, type, r, i);
3888 TREE_OPERAND (*expr_p, 1) = ctor;
3889 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1),
3890 pre_p,
3891 post_p,
3892 rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
3893 fb_rvalue);
3896 break;
3898 case VECTOR_TYPE:
3900 unsigned HOST_WIDE_INT ix;
3901 constructor_elt *ce;
3903 if (notify_temp_creation)
3904 return GS_OK;
3906 /* Go ahead and simplify constant constructors to VECTOR_CST. */
3907 if (TREE_CONSTANT (ctor))
3909 bool constant_p = true;
3910 tree value;
3912 /* Even when ctor is constant, it might contain non-*_CST
3913 elements, such as addresses or trapping values like
3914 1.0/0.0 - 1.0/0.0. Such expressions don't belong
3915 in VECTOR_CST nodes. */
3916 FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
3917 if (!CONSTANT_CLASS_P (value))
3919 constant_p = false;
3920 break;
3923 if (constant_p)
3925 TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts);
3926 break;
3929 /* Don't reduce an initializer constant even if we can't
3930 make a VECTOR_CST. It won't do anything for us, and it'll
3931 prevent us from representing it as a single constant. */
3932 if (initializer_constant_valid_p (ctor, type))
3933 break;
3935 TREE_CONSTANT (ctor) = 0;
3938 /* Vector types use CONSTRUCTOR all the way through gimple
3939 compilation as a general initializer. */
3940 for (ix = 0; VEC_iterate (constructor_elt, elts, ix, ce); ix++)
3942 enum gimplify_status tret;
3943 tret = gimplify_expr (&ce->value, pre_p, post_p, is_gimple_val,
3944 fb_rvalue);
3945 if (tret == GS_ERROR)
3946 ret = GS_ERROR;
3948 if (!is_gimple_reg (TREE_OPERAND (*expr_p, 0)))
3949 TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (ctor, pre_p);
3951 break;
3953 default:
3954 /* So how did we get a CONSTRUCTOR for a scalar type? */
3955 gcc_unreachable ();
3958 if (ret == GS_ERROR)
3959 return GS_ERROR;
3960 else if (want_value)
3962 *expr_p = object;
3963 return GS_OK;
3965 else
3967 /* If we have gimplified both sides of the initializer but have
3968 not emitted an assignment, do so now. */
3969 if (*expr_p)
3971 tree lhs = TREE_OPERAND (*expr_p, 0);
3972 tree rhs = TREE_OPERAND (*expr_p, 1);
3973 gimple init = gimple_build_assign (lhs, rhs);
3974 gimplify_seq_add_stmt (pre_p, init);
3975 *expr_p = NULL;
3978 return GS_ALL_DONE;
3982 /* Given a pointer value OP0, return a simplified version of an
3983 indirection through OP0, or NULL_TREE if no simplification is
3984 possible. Note that the resulting type may be different from
3985 the type pointed to in the sense that it is still compatible
3986 from the langhooks point of view. */
3988 tree
3989 gimple_fold_indirect_ref (tree t)
3991 tree type = TREE_TYPE (TREE_TYPE (t));
3992 tree sub = t;
3993 tree subtype;
3995 STRIP_USELESS_TYPE_CONVERSION (sub);
3996 subtype = TREE_TYPE (sub);
3997 if (!POINTER_TYPE_P (subtype))
3998 return NULL_TREE;
4000 if (TREE_CODE (sub) == ADDR_EXPR)
4002 tree op = TREE_OPERAND (sub, 0);
4003 tree optype = TREE_TYPE (op);
4004 /* *&p => p */
4005 if (useless_type_conversion_p (type, optype))
4006 return op;
4008 /* *(foo *)&fooarray => fooarray[0] */
4009 if (TREE_CODE (optype) == ARRAY_TYPE
4010 && useless_type_conversion_p (type, TREE_TYPE (optype)))
4012 tree type_domain = TYPE_DOMAIN (optype);
4013 tree min_val = size_zero_node;
4014 if (type_domain && TYPE_MIN_VALUE (type_domain))
4015 min_val = TYPE_MIN_VALUE (type_domain);
4016 return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
4020 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
4021 if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
4022 && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (subtype))))
4024 tree type_domain;
4025 tree min_val = size_zero_node;
4026 tree osub = sub;
4027 sub = gimple_fold_indirect_ref (sub);
4028 if (! sub)
4029 sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), osub);
4030 type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
4031 if (type_domain && TYPE_MIN_VALUE (type_domain))
4032 min_val = TYPE_MIN_VALUE (type_domain);
4033 return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
4036 return NULL_TREE;
4039 /* Given a pointer value OP0, return a simplified version of an
4040 indirection through OP0, or NULL_TREE if no simplification is
4041 possible. This may only be applied to a rhs of an expression.
4042 Note that the resulting type may be different from the type pointed
4043 to in the sense that it is still compatible from the langhooks
4044 point of view. */
4046 static tree
4047 gimple_fold_indirect_ref_rhs (tree t)
4049 return gimple_fold_indirect_ref (t);
4052 /* Subroutine of gimplify_modify_expr to do simplifications of
4053 MODIFY_EXPRs based on the code of the RHS. We loop for as long as
4054 something changes. */
4056 static enum gimplify_status
4057 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
4058 gimple_seq *pre_p, gimple_seq *post_p,
4059 bool want_value)
4061 enum gimplify_status ret = GS_OK;
4063 while (ret != GS_UNHANDLED)
4064 switch (TREE_CODE (*from_p))
4066 case VAR_DECL:
4067 /* If we're assigning from a read-only variable initialized with
4068 a constructor, do the direct assignment from the constructor,
4069 but only if neither source nor target are volatile since this
4070 latter assignment might end up being done on a per-field basis. */
4071 if (DECL_INITIAL (*from_p)
4072 && TREE_READONLY (*from_p)
4073 && !TREE_THIS_VOLATILE (*from_p)
4074 && !TREE_THIS_VOLATILE (*to_p)
4075 && TREE_CODE (DECL_INITIAL (*from_p)) == CONSTRUCTOR)
4077 tree old_from = *from_p;
4079 /* Move the constructor into the RHS. */
4080 *from_p = unshare_expr (DECL_INITIAL (*from_p));
4082 /* Let's see if gimplify_init_constructor will need to put
4083 it in memory. If so, revert the change. */
4084 ret = gimplify_init_constructor (expr_p, NULL, NULL, false, true);
4085 if (ret == GS_ERROR)
4087 *from_p = old_from;
4088 /* Fall through. */
4090 else
4092 ret = GS_OK;
4093 break;
4096 ret = GS_UNHANDLED;
4097 break;
4098 case INDIRECT_REF:
4100 /* If we have code like
4102 *(const A*)(A*)&x
4104 where the type of "x" is a (possibly cv-qualified variant
4105 of "A"), treat the entire expression as identical to "x".
4106 This kind of code arises in C++ when an object is bound
4107 to a const reference, and if "x" is a TARGET_EXPR we want
4108 to take advantage of the optimization below. */
4109 tree t = gimple_fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
4110 if (t)
4112 *from_p = t;
4113 ret = GS_OK;
4115 else
4116 ret = GS_UNHANDLED;
4117 break;
4120 case TARGET_EXPR:
4122 /* If we are initializing something from a TARGET_EXPR, strip the
4123 TARGET_EXPR and initialize it directly, if possible. This can't
4124 be done if the initializer is void, since that implies that the
4125 temporary is set in some non-trivial way.
4127 ??? What about code that pulls out the temp and uses it
4128 elsewhere? I think that such code never uses the TARGET_EXPR as
4129 an initializer. If I'm wrong, we'll die because the temp won't
4130 have any RTL. In that case, I guess we'll need to replace
4131 references somehow. */
4132 tree init = TARGET_EXPR_INITIAL (*from_p);
4134 if (init
4135 && !VOID_TYPE_P (TREE_TYPE (init)))
4137 *from_p = init;
4138 ret = GS_OK;
4140 else
4141 ret = GS_UNHANDLED;
4143 break;
4145 case COMPOUND_EXPR:
4146 /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
4147 caught. */
4148 gimplify_compound_expr (from_p, pre_p, true);
4149 ret = GS_OK;
4150 break;
4152 case CONSTRUCTOR:
4153 /* If we're initializing from a CONSTRUCTOR, break this into
4154 individual MODIFY_EXPRs. */
4155 return gimplify_init_constructor (expr_p, pre_p, post_p, want_value,
4156 false);
4158 case COND_EXPR:
4159 /* If we're assigning to a non-register type, push the assignment
4160 down into the branches. This is mandatory for ADDRESSABLE types,
4161 since we cannot generate temporaries for such, but it saves a
4162 copy in other cases as well. */
4163 if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
4165 /* This code should mirror the code in gimplify_cond_expr. */
4166 enum tree_code code = TREE_CODE (*expr_p);
4167 tree cond = *from_p;
4168 tree result = *to_p;
4170 ret = gimplify_expr (&result, pre_p, post_p,
4171 is_gimple_lvalue, fb_lvalue);
4172 if (ret != GS_ERROR)
4173 ret = GS_OK;
4175 if (TREE_TYPE (TREE_OPERAND (cond, 1)) != void_type_node)
4176 TREE_OPERAND (cond, 1)
4177 = build2 (code, void_type_node, result,
4178 TREE_OPERAND (cond, 1));
4179 if (TREE_TYPE (TREE_OPERAND (cond, 2)) != void_type_node)
4180 TREE_OPERAND (cond, 2)
4181 = build2 (code, void_type_node, unshare_expr (result),
4182 TREE_OPERAND (cond, 2));
4184 TREE_TYPE (cond) = void_type_node;
4185 recalculate_side_effects (cond);
4187 if (want_value)
4189 gimplify_and_add (cond, pre_p);
4190 *expr_p = unshare_expr (result);
4192 else
4193 *expr_p = cond;
4194 return ret;
4196 else
4197 ret = GS_UNHANDLED;
4198 break;
4200 case CALL_EXPR:
4201 /* For calls that return in memory, give *to_p as the CALL_EXPR's
4202 return slot so that we don't generate a temporary. */
4203 if (!CALL_EXPR_RETURN_SLOT_OPT (*from_p)
4204 && aggregate_value_p (*from_p, *from_p))
4206 bool use_target;
4208 if (!(rhs_predicate_for (*to_p))(*from_p))
4209 /* If we need a temporary, *to_p isn't accurate. */
4210 use_target = false;
4211 else if (TREE_CODE (*to_p) == RESULT_DECL
4212 && DECL_NAME (*to_p) == NULL_TREE
4213 && needs_to_live_in_memory (*to_p))
4214 /* It's OK to use the return slot directly unless it's an NRV. */
4215 use_target = true;
4216 else if (is_gimple_reg_type (TREE_TYPE (*to_p))
4217 || (DECL_P (*to_p) && DECL_REGISTER (*to_p)))
4218 /* Don't force regs into memory. */
4219 use_target = false;
4220 else if (TREE_CODE (*expr_p) == INIT_EXPR)
4221 /* It's OK to use the target directly if it's being
4222 initialized. */
4223 use_target = true;
4224 else if (!is_gimple_non_addressable (*to_p))
4225 /* Don't use the original target if it's already addressable;
4226 if its address escapes, and the called function uses the
4227 NRV optimization, a conforming program could see *to_p
4228 change before the called function returns; see c++/19317.
4229 When optimizing, the return_slot pass marks more functions
4230 as safe after we have escape info. */
4231 use_target = false;
4232 else
4233 use_target = true;
4235 if (use_target)
4237 CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
4238 mark_addressable (*to_p);
4242 ret = GS_UNHANDLED;
4243 break;
4245 /* If we're initializing from a container, push the initialization
4246 inside it. */
4247 case CLEANUP_POINT_EXPR:
4248 case BIND_EXPR:
4249 case STATEMENT_LIST:
4251 tree wrap = *from_p;
4252 tree t;
4254 ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_min_lval,
4255 fb_lvalue);
4256 if (ret != GS_ERROR)
4257 ret = GS_OK;
4259 t = voidify_wrapper_expr (wrap, *expr_p);
4260 gcc_assert (t == *expr_p);
4262 if (want_value)
4264 gimplify_and_add (wrap, pre_p);
4265 *expr_p = unshare_expr (*to_p);
4267 else
4268 *expr_p = wrap;
4269 return GS_OK;
4272 case COMPOUND_LITERAL_EXPR:
4274 tree complit = TREE_OPERAND (*expr_p, 1);
4275 tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (complit);
4276 tree decl = DECL_EXPR_DECL (decl_s);
4277 tree init = DECL_INITIAL (decl);
4279 /* struct T x = (struct T) { 0, 1, 2 } can be optimized
4280 into struct T x = { 0, 1, 2 } if the address of the
4281 compound literal has never been taken. */
4282 if (!TREE_ADDRESSABLE (complit)
4283 && !TREE_ADDRESSABLE (decl)
4284 && init)
4286 *expr_p = copy_node (*expr_p);
4287 TREE_OPERAND (*expr_p, 1) = init;
4288 return GS_OK;
4292 default:
4293 ret = GS_UNHANDLED;
4294 break;
4297 return ret;
4301 /* Promote partial stores to COMPLEX variables to total stores. *EXPR_P is
4302 a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
4303 DECL_GIMPLE_REG_P set.
4305 IMPORTANT NOTE: This promotion is performed by introducing a load of the
4306 other, unmodified part of the complex object just before the total store.
4307 As a consequence, if the object is still uninitialized, an undefined value
4308 will be loaded into a register, which may result in a spurious exception
4309 if the register is floating-point and the value happens to be a signaling
4310 NaN for example. Then the fully-fledged complex operations lowering pass
4311 followed by a DCE pass are necessary in order to fix things up. */
4313 static enum gimplify_status
4314 gimplify_modify_expr_complex_part (tree *expr_p, gimple_seq *pre_p,
4315 bool want_value)
4317 enum tree_code code, ocode;
4318 tree lhs, rhs, new_rhs, other, realpart, imagpart;
4320 lhs = TREE_OPERAND (*expr_p, 0);
4321 rhs = TREE_OPERAND (*expr_p, 1);
4322 code = TREE_CODE (lhs);
4323 lhs = TREE_OPERAND (lhs, 0);
4325 ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
4326 other = build1 (ocode, TREE_TYPE (rhs), lhs);
4327 other = get_formal_tmp_var (other, pre_p);
4329 realpart = code == REALPART_EXPR ? rhs : other;
4330 imagpart = code == REALPART_EXPR ? other : rhs;
4332 if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
4333 new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
4334 else
4335 new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
4337 gimplify_seq_add_stmt (pre_p, gimple_build_assign (lhs, new_rhs));
4338 *expr_p = (want_value) ? rhs : NULL_TREE;
4340 return GS_ALL_DONE;
4344 /* Gimplify the MODIFY_EXPR node pointed to by EXPR_P.
4346 modify_expr
4347 : varname '=' rhs
4348 | '*' ID '=' rhs
4350 PRE_P points to the list where side effects that must happen before
4351 *EXPR_P should be stored.
4353 POST_P points to the list where side effects that must happen after
4354 *EXPR_P should be stored.
4356 WANT_VALUE is nonzero iff we want to use the value of this expression
4357 in another expression. */
4359 static enum gimplify_status
4360 gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
4361 bool want_value)
4363 tree *from_p = &TREE_OPERAND (*expr_p, 1);
4364 tree *to_p = &TREE_OPERAND (*expr_p, 0);
4365 enum gimplify_status ret = GS_UNHANDLED;
4366 gimple assign;
4368 gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
4369 || TREE_CODE (*expr_p) == INIT_EXPR);
4371 /* Insert pointer conversions required by the middle-end that are not
4372 required by the frontend. This fixes middle-end type checking for
4373 for example gcc.dg/redecl-6.c. */
4374 if (POINTER_TYPE_P (TREE_TYPE (*to_p))
4375 && lang_hooks.types_compatible_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p)))
4377 STRIP_USELESS_TYPE_CONVERSION (*from_p);
4378 if (!useless_type_conversion_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p)))
4379 *from_p = fold_convert (TREE_TYPE (*to_p), *from_p);
4382 /* See if any simplifications can be done based on what the RHS is. */
4383 ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4384 want_value);
4385 if (ret != GS_UNHANDLED)
4386 return ret;
4388 /* For zero sized types only gimplify the left hand side and right hand
4389 side as statements and throw away the assignment. Do this after
4390 gimplify_modify_expr_rhs so we handle TARGET_EXPRs of addressable
4391 types properly. */
4392 if (zero_sized_type (TREE_TYPE (*from_p)) && !want_value)
4394 gimplify_stmt (from_p, pre_p);
4395 gimplify_stmt (to_p, pre_p);
4396 *expr_p = NULL_TREE;
4397 return GS_ALL_DONE;
4400 /* If the value being copied is of variable width, compute the length
4401 of the copy into a WITH_SIZE_EXPR. Note that we need to do this
4402 before gimplifying any of the operands so that we can resolve any
4403 PLACEHOLDER_EXPRs in the size. Also note that the RTL expander uses
4404 the size of the expression to be copied, not of the destination, so
4405 that is what we must do here. */
4406 maybe_with_size_expr (from_p);
4408 ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
4409 if (ret == GS_ERROR)
4410 return ret;
4412 /* As a special case, we have to temporarily allow for assignments
4413 with a CALL_EXPR on the RHS. Since in GIMPLE a function call is
4414 a toplevel statement, when gimplifying the GENERIC expression
4415 MODIFY_EXPR <a, CALL_EXPR <foo>>, we cannot create the tuple
4416 GIMPLE_ASSIGN <a, GIMPLE_CALL <foo>>.
4418 Instead, we need to create the tuple GIMPLE_CALL <a, foo>. To
4419 prevent gimplify_expr from trying to create a new temporary for
4420 foo's LHS, we tell it that it should only gimplify until it
4421 reaches the CALL_EXPR. On return from gimplify_expr, the newly
4422 created GIMPLE_CALL <foo> will be the last statement in *PRE_P
4423 and all we need to do here is set 'a' to be its LHS. */
4424 ret = gimplify_expr (from_p, pre_p, post_p, rhs_predicate_for (*to_p),
4425 fb_rvalue);
4426 if (ret == GS_ERROR)
4427 return ret;
4429 /* Now see if the above changed *from_p to something we handle specially. */
4430 ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4431 want_value);
4432 if (ret != GS_UNHANDLED)
4433 return ret;
4435 /* If we've got a variable sized assignment between two lvalues (i.e. does
4436 not involve a call), then we can make things a bit more straightforward
4437 by converting the assignment to memcpy or memset. */
4438 if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
4440 tree from = TREE_OPERAND (*from_p, 0);
4441 tree size = TREE_OPERAND (*from_p, 1);
4443 if (TREE_CODE (from) == CONSTRUCTOR)
4444 return gimplify_modify_expr_to_memset (expr_p, size, want_value, pre_p);
4446 if (is_gimple_addressable (from))
4448 *from_p = from;
4449 return gimplify_modify_expr_to_memcpy (expr_p, size, want_value,
4450 pre_p);
4454 /* Transform partial stores to non-addressable complex variables into
4455 total stores. This allows us to use real instead of virtual operands
4456 for these variables, which improves optimization. */
4457 if ((TREE_CODE (*to_p) == REALPART_EXPR
4458 || TREE_CODE (*to_p) == IMAGPART_EXPR)
4459 && is_gimple_reg (TREE_OPERAND (*to_p, 0)))
4460 return gimplify_modify_expr_complex_part (expr_p, pre_p, want_value);
4462 /* Try to alleviate the effects of the gimplification creating artificial
4463 temporaries (see for example is_gimple_reg_rhs) on the debug info. */
4464 if (!gimplify_ctxp->into_ssa
4465 && DECL_P (*from_p)
4466 && DECL_IGNORED_P (*from_p)
4467 && DECL_P (*to_p)
4468 && !DECL_IGNORED_P (*to_p))
4470 if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
4471 DECL_NAME (*from_p)
4472 = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
4473 DECL_DEBUG_EXPR_IS_FROM (*from_p) = 1;
4474 SET_DECL_DEBUG_EXPR (*from_p, *to_p);
4477 if (TREE_CODE (*from_p) == CALL_EXPR)
4479 /* Since the RHS is a CALL_EXPR, we need to create a GIMPLE_CALL
4480 instead of a GIMPLE_ASSIGN. */
4481 assign = gimple_build_call_from_tree (*from_p);
4482 gimple_call_set_lhs (assign, *to_p);
4484 else
4486 assign = gimple_build_assign (*to_p, *from_p);
4487 gimple_set_location (assign, EXPR_LOCATION (*expr_p));
4490 gimplify_seq_add_stmt (pre_p, assign);
4492 if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
4494 /* If we've somehow already got an SSA_NAME on the LHS, then
4495 we've probably modified it twice. Not good. */
4496 gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
4497 *to_p = make_ssa_name (*to_p, assign);
4498 gimple_set_lhs (assign, *to_p);
4501 if (want_value)
4503 *expr_p = unshare_expr (*to_p);
4504 return GS_OK;
4506 else
4507 *expr_p = NULL;
4509 return GS_ALL_DONE;
4512 /* Gimplify a comparison between two variable-sized objects. Do this
4513 with a call to BUILT_IN_MEMCMP. */
4515 static enum gimplify_status
4516 gimplify_variable_sized_compare (tree *expr_p)
4518 tree op0 = TREE_OPERAND (*expr_p, 0);
4519 tree op1 = TREE_OPERAND (*expr_p, 1);
4520 tree t, arg, dest, src;
4522 arg = TYPE_SIZE_UNIT (TREE_TYPE (op0));
4523 arg = unshare_expr (arg);
4524 arg = SUBSTITUTE_PLACEHOLDER_IN_EXPR (arg, op0);
4525 src = build_fold_addr_expr (op1);
4526 dest = build_fold_addr_expr (op0);
4527 t = implicit_built_in_decls[BUILT_IN_MEMCMP];
4528 t = build_call_expr (t, 3, dest, src, arg);
4529 *expr_p
4530 = build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
4532 return GS_OK;
4535 /* Gimplify a comparison between two aggregate objects of integral scalar
4536 mode as a comparison between the bitwise equivalent scalar values. */
4538 static enum gimplify_status
4539 gimplify_scalar_mode_aggregate_compare (tree *expr_p)
4541 tree op0 = TREE_OPERAND (*expr_p, 0);
4542 tree op1 = TREE_OPERAND (*expr_p, 1);
4544 tree type = TREE_TYPE (op0);
4545 tree scalar_type = lang_hooks.types.type_for_mode (TYPE_MODE (type), 1);
4547 op0 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op0);
4548 op1 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op1);
4550 *expr_p
4551 = fold_build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), op0, op1);
4553 return GS_OK;
4556 /* Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions. EXPR_P
4557 points to the expression to gimplify.
4559 Expressions of the form 'a && b' are gimplified to:
4561 a && b ? true : false
4563 LOCUS is the source location to be put on the generated COND_EXPR.
4564 gimplify_cond_expr will do the rest. */
4566 static enum gimplify_status
4567 gimplify_boolean_expr (tree *expr_p, location_t locus)
4569 /* Preserve the original type of the expression. */
4570 tree type = TREE_TYPE (*expr_p);
4572 *expr_p = build3 (COND_EXPR, type, *expr_p,
4573 fold_convert (type, boolean_true_node),
4574 fold_convert (type, boolean_false_node));
4576 SET_EXPR_LOCATION (*expr_p, locus);
4578 return GS_OK;
4581 /* Gimplifies an expression sequence. This function gimplifies each
4582 expression and re-writes the original expression with the last
4583 expression of the sequence in GIMPLE form.
4585 PRE_P points to the list where the side effects for all the
4586 expressions in the sequence will be emitted.
4588 WANT_VALUE is true when the result of the last COMPOUND_EXPR is used. */
4590 static enum gimplify_status
4591 gimplify_compound_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
4593 tree t = *expr_p;
4597 tree *sub_p = &TREE_OPERAND (t, 0);
4599 if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
4600 gimplify_compound_expr (sub_p, pre_p, false);
4601 else
4602 gimplify_stmt (sub_p, pre_p);
4604 t = TREE_OPERAND (t, 1);
4606 while (TREE_CODE (t) == COMPOUND_EXPR);
4608 *expr_p = t;
4609 if (want_value)
4610 return GS_OK;
4611 else
4613 gimplify_stmt (expr_p, pre_p);
4614 return GS_ALL_DONE;
4619 /* Gimplify a SAVE_EXPR node. EXPR_P points to the expression to
4620 gimplify. After gimplification, EXPR_P will point to a new temporary
4621 that holds the original value of the SAVE_EXPR node.
4623 PRE_P points to the list where side effects that must happen before
4624 *EXPR_P should be stored. */
4626 static enum gimplify_status
4627 gimplify_save_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4629 enum gimplify_status ret = GS_ALL_DONE;
4630 tree val;
4632 gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
4633 val = TREE_OPERAND (*expr_p, 0);
4635 /* If the SAVE_EXPR has not been resolved, then evaluate it once. */
4636 if (!SAVE_EXPR_RESOLVED_P (*expr_p))
4638 /* The operand may be a void-valued expression such as SAVE_EXPRs
4639 generated by the Java frontend for class initialization. It is
4640 being executed only for its side-effects. */
4641 if (TREE_TYPE (val) == void_type_node)
4643 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4644 is_gimple_stmt, fb_none);
4645 val = NULL;
4647 else
4648 val = get_initialized_tmp_var (val, pre_p, post_p);
4650 TREE_OPERAND (*expr_p, 0) = val;
4651 SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
4654 *expr_p = val;
4656 return ret;
4659 /* Re-write the ADDR_EXPR node pointed to by EXPR_P
4661 unary_expr
4662 : ...
4663 | '&' varname
4666 PRE_P points to the list where side effects that must happen before
4667 *EXPR_P should be stored.
4669 POST_P points to the list where side effects that must happen after
4670 *EXPR_P should be stored. */
4672 static enum gimplify_status
4673 gimplify_addr_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4675 tree expr = *expr_p;
4676 tree op0 = TREE_OPERAND (expr, 0);
4677 enum gimplify_status ret;
4679 switch (TREE_CODE (op0))
4681 case INDIRECT_REF:
4682 case MISALIGNED_INDIRECT_REF:
4683 do_indirect_ref:
4684 /* Check if we are dealing with an expression of the form '&*ptr'.
4685 While the front end folds away '&*ptr' into 'ptr', these
4686 expressions may be generated internally by the compiler (e.g.,
4687 builtins like __builtin_va_end). */
4688 /* Caution: the silent array decomposition semantics we allow for
4689 ADDR_EXPR means we can't always discard the pair. */
4690 /* Gimplification of the ADDR_EXPR operand may drop
4691 cv-qualification conversions, so make sure we add them if
4692 needed. */
4694 tree op00 = TREE_OPERAND (op0, 0);
4695 tree t_expr = TREE_TYPE (expr);
4696 tree t_op00 = TREE_TYPE (op00);
4698 if (!useless_type_conversion_p (t_expr, t_op00))
4699 op00 = fold_convert (TREE_TYPE (expr), op00);
4700 *expr_p = op00;
4701 ret = GS_OK;
4703 break;
4705 case VIEW_CONVERT_EXPR:
4706 /* Take the address of our operand and then convert it to the type of
4707 this ADDR_EXPR.
4709 ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
4710 all clear. The impact of this transformation is even less clear. */
4712 /* If the operand is a useless conversion, look through it. Doing so
4713 guarantees that the ADDR_EXPR and its operand will remain of the
4714 same type. */
4715 if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
4716 op0 = TREE_OPERAND (op0, 0);
4718 *expr_p = fold_convert (TREE_TYPE (expr),
4719 build_fold_addr_expr (TREE_OPERAND (op0, 0)));
4720 ret = GS_OK;
4721 break;
4723 default:
4724 /* We use fb_either here because the C frontend sometimes takes
4725 the address of a call that returns a struct; see
4726 gcc.dg/c99-array-lval-1.c. The gimplifier will correctly make
4727 the implied temporary explicit. */
4729 /* Mark the RHS addressable. */
4730 ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
4731 is_gimple_addressable, fb_either);
4732 if (ret == GS_ERROR)
4733 break;
4735 /* We cannot rely on making the RHS addressable if it is
4736 a temporary created by gimplification. In this case create a
4737 new temporary that is initialized by a copy (which will
4738 become a store after we mark it addressable).
4739 This mostly happens if the frontend passed us something that
4740 it could not mark addressable yet, like a fortran
4741 pass-by-reference parameter (int) floatvar. */
4742 if (is_gimple_reg (TREE_OPERAND (expr, 0)))
4743 TREE_OPERAND (expr, 0)
4744 = get_initialized_tmp_var (TREE_OPERAND (expr, 0), pre_p, post_p);
4746 op0 = TREE_OPERAND (expr, 0);
4748 /* For various reasons, the gimplification of the expression
4749 may have made a new INDIRECT_REF. */
4750 if (TREE_CODE (op0) == INDIRECT_REF)
4751 goto do_indirect_ref;
4753 /* Make sure TREE_CONSTANT and TREE_SIDE_EFFECTS are set properly. */
4754 recompute_tree_invariant_for_addr_expr (expr);
4756 mark_addressable (TREE_OPERAND (expr, 0));
4757 break;
4760 return ret;
4763 /* Gimplify the operands of an ASM_EXPR. Input operands should be a gimple
4764 value; output operands should be a gimple lvalue. */
4766 static enum gimplify_status
4767 gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4769 tree expr;
4770 int noutputs;
4771 const char **oconstraints;
4772 int i;
4773 tree link;
4774 const char *constraint;
4775 bool allows_mem, allows_reg, is_inout;
4776 enum gimplify_status ret, tret;
4777 gimple stmt;
4778 VEC(tree, gc) *inputs;
4779 VEC(tree, gc) *outputs;
4780 VEC(tree, gc) *clobbers;
4781 tree link_next;
4783 expr = *expr_p;
4784 noutputs = list_length (ASM_OUTPUTS (expr));
4785 oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
4787 inputs = outputs = clobbers = NULL;
4789 ret = GS_ALL_DONE;
4790 link_next = NULL_TREE;
4791 for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = link_next)
4793 bool ok;
4794 size_t constraint_len;
4796 link_next = TREE_CHAIN (link);
4798 oconstraints[i]
4799 = constraint
4800 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4801 constraint_len = strlen (constraint);
4802 if (constraint_len == 0)
4803 continue;
4805 ok = parse_output_constraint (&constraint, i, 0, 0,
4806 &allows_mem, &allows_reg, &is_inout);
4807 if (!ok)
4809 ret = GS_ERROR;
4810 is_inout = false;
4813 if (!allows_reg && allows_mem)
4814 mark_addressable (TREE_VALUE (link));
4816 tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4817 is_inout ? is_gimple_min_lval : is_gimple_lvalue,
4818 fb_lvalue | fb_mayfail);
4819 if (tret == GS_ERROR)
4821 error ("invalid lvalue in asm output %d", i);
4822 ret = tret;
4825 VEC_safe_push (tree, gc, outputs, link);
4826 TREE_CHAIN (link) = NULL_TREE;
4828 if (is_inout)
4830 /* An input/output operand. To give the optimizers more
4831 flexibility, split it into separate input and output
4832 operands. */
4833 tree input;
4834 char buf[10];
4836 /* Turn the in/out constraint into an output constraint. */
4837 char *p = xstrdup (constraint);
4838 p[0] = '=';
4839 TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
4841 /* And add a matching input constraint. */
4842 if (allows_reg)
4844 sprintf (buf, "%d", i);
4846 /* If there are multiple alternatives in the constraint,
4847 handle each of them individually. Those that allow register
4848 will be replaced with operand number, the others will stay
4849 unchanged. */
4850 if (strchr (p, ',') != NULL)
4852 size_t len = 0, buflen = strlen (buf);
4853 char *beg, *end, *str, *dst;
4855 for (beg = p + 1;;)
4857 end = strchr (beg, ',');
4858 if (end == NULL)
4859 end = strchr (beg, '\0');
4860 if ((size_t) (end - beg) < buflen)
4861 len += buflen + 1;
4862 else
4863 len += end - beg + 1;
4864 if (*end)
4865 beg = end + 1;
4866 else
4867 break;
4870 str = (char *) alloca (len);
4871 for (beg = p + 1, dst = str;;)
4873 const char *tem;
4874 bool mem_p, reg_p, inout_p;
4876 end = strchr (beg, ',');
4877 if (end)
4878 *end = '\0';
4879 beg[-1] = '=';
4880 tem = beg - 1;
4881 parse_output_constraint (&tem, i, 0, 0,
4882 &mem_p, &reg_p, &inout_p);
4883 if (dst != str)
4884 *dst++ = ',';
4885 if (reg_p)
4887 memcpy (dst, buf, buflen);
4888 dst += buflen;
4890 else
4892 if (end)
4893 len = end - beg;
4894 else
4895 len = strlen (beg);
4896 memcpy (dst, beg, len);
4897 dst += len;
4899 if (end)
4900 beg = end + 1;
4901 else
4902 break;
4904 *dst = '\0';
4905 input = build_string (dst - str, str);
4907 else
4908 input = build_string (strlen (buf), buf);
4910 else
4911 input = build_string (constraint_len - 1, constraint + 1);
4913 free (p);
4915 input = build_tree_list (build_tree_list (NULL_TREE, input),
4916 unshare_expr (TREE_VALUE (link)));
4917 ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
4921 link_next = NULL_TREE;
4922 for (link = ASM_INPUTS (expr); link; ++i, link = link_next)
4924 link_next = TREE_CHAIN (link);
4925 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4926 parse_input_constraint (&constraint, 0, 0, noutputs, 0,
4927 oconstraints, &allows_mem, &allows_reg);
4929 /* If we can't make copies, we can only accept memory. */
4930 if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
4932 if (allows_mem)
4933 allows_reg = 0;
4934 else
4936 error ("impossible constraint in %<asm%>");
4937 error ("non-memory input %d must stay in memory", i);
4938 return GS_ERROR;
4942 /* If the operand is a memory input, it should be an lvalue. */
4943 if (!allows_reg && allows_mem)
4945 tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4946 is_gimple_lvalue, fb_lvalue | fb_mayfail);
4947 mark_addressable (TREE_VALUE (link));
4948 if (tret == GS_ERROR)
4950 if (EXPR_HAS_LOCATION (TREE_VALUE (link)))
4951 input_location = EXPR_LOCATION (TREE_VALUE (link));
4952 error ("memory input %d is not directly addressable", i);
4953 ret = tret;
4956 else
4958 tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4959 is_gimple_asm_val, fb_rvalue);
4960 if (tret == GS_ERROR)
4961 ret = tret;
4964 TREE_CHAIN (link) = NULL_TREE;
4965 VEC_safe_push (tree, gc, inputs, link);
4968 for (link = ASM_CLOBBERS (expr); link; ++i, link = TREE_CHAIN (link))
4969 VEC_safe_push (tree, gc, clobbers, link);
4971 stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
4972 inputs, outputs, clobbers);
4974 gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr));
4975 gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
4977 gimplify_seq_add_stmt (pre_p, stmt);
4979 return ret;
4982 /* Gimplify a CLEANUP_POINT_EXPR. Currently this works by adding
4983 GIMPLE_WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
4984 gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
4985 return to this function.
4987 FIXME should we complexify the prequeue handling instead? Or use flags
4988 for all the cleanups and let the optimizer tighten them up? The current
4989 code seems pretty fragile; it will break on a cleanup within any
4990 non-conditional nesting. But any such nesting would be broken, anyway;
4991 we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
4992 and continues out of it. We can do that at the RTL level, though, so
4993 having an optimizer to tighten up try/finally regions would be a Good
4994 Thing. */
4996 static enum gimplify_status
4997 gimplify_cleanup_point_expr (tree *expr_p, gimple_seq *pre_p)
4999 gimple_stmt_iterator iter;
5000 gimple_seq body_sequence = NULL;
5002 tree temp = voidify_wrapper_expr (*expr_p, NULL);
5004 /* We only care about the number of conditions between the innermost
5005 CLEANUP_POINT_EXPR and the cleanup. So save and reset the count and
5006 any cleanups collected outside the CLEANUP_POINT_EXPR. */
5007 int old_conds = gimplify_ctxp->conditions;
5008 gimple_seq old_cleanups = gimplify_ctxp->conditional_cleanups;
5009 gimplify_ctxp->conditions = 0;
5010 gimplify_ctxp->conditional_cleanups = NULL;
5012 gimplify_stmt (&TREE_OPERAND (*expr_p, 0), &body_sequence);
5014 gimplify_ctxp->conditions = old_conds;
5015 gimplify_ctxp->conditional_cleanups = old_cleanups;
5017 for (iter = gsi_start (body_sequence); !gsi_end_p (iter); )
5019 gimple wce = gsi_stmt (iter);
5021 if (gimple_code (wce) == GIMPLE_WITH_CLEANUP_EXPR)
5023 if (gsi_one_before_end_p (iter))
5025 /* Note that gsi_insert_seq_before and gsi_remove do not
5026 scan operands, unlike some other sequence mutators. */
5027 gsi_insert_seq_before_without_update (&iter,
5028 gimple_wce_cleanup (wce),
5029 GSI_SAME_STMT);
5030 gsi_remove (&iter, true);
5031 break;
5033 else
5035 gimple gtry;
5036 gimple_seq seq;
5037 enum gimple_try_flags kind;
5039 if (gimple_wce_cleanup_eh_only (wce))
5040 kind = GIMPLE_TRY_CATCH;
5041 else
5042 kind = GIMPLE_TRY_FINALLY;
5043 seq = gsi_split_seq_after (iter);
5045 gtry = gimple_build_try (seq, gimple_wce_cleanup (wce), kind);
5046 /* Do not use gsi_replace here, as it may scan operands.
5047 We want to do a simple structural modification only. */
5048 *gsi_stmt_ptr (&iter) = gtry;
5049 iter = gsi_start (seq);
5052 else
5053 gsi_next (&iter);
5056 gimplify_seq_add_seq (pre_p, body_sequence);
5057 if (temp)
5059 *expr_p = temp;
5060 return GS_OK;
5062 else
5064 *expr_p = NULL;
5065 return GS_ALL_DONE;
5069 /* Insert a cleanup marker for gimplify_cleanup_point_expr. CLEANUP
5070 is the cleanup action required. EH_ONLY is true if the cleanup should
5071 only be executed if an exception is thrown, not on normal exit. */
5073 static void
5074 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p)
5076 gimple wce;
5077 gimple_seq cleanup_stmts = NULL;
5079 /* Errors can result in improperly nested cleanups. Which results in
5080 confusion when trying to resolve the GIMPLE_WITH_CLEANUP_EXPR. */
5081 if (errorcount || sorrycount)
5082 return;
5084 if (gimple_conditional_context ())
5086 /* If we're in a conditional context, this is more complex. We only
5087 want to run the cleanup if we actually ran the initialization that
5088 necessitates it, but we want to run it after the end of the
5089 conditional context. So we wrap the try/finally around the
5090 condition and use a flag to determine whether or not to actually
5091 run the destructor. Thus
5093 test ? f(A()) : 0
5095 becomes (approximately)
5097 flag = 0;
5098 try {
5099 if (test) { A::A(temp); flag = 1; val = f(temp); }
5100 else { val = 0; }
5101 } finally {
5102 if (flag) A::~A(temp);
5106 tree flag = create_tmp_var (boolean_type_node, "cleanup");
5107 gimple ffalse = gimple_build_assign (flag, boolean_false_node);
5108 gimple ftrue = gimple_build_assign (flag, boolean_true_node);
5110 cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
5111 gimplify_stmt (&cleanup, &cleanup_stmts);
5112 wce = gimple_build_wce (cleanup_stmts);
5114 gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, ffalse);
5115 gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
5116 gimplify_seq_add_stmt (pre_p, ftrue);
5118 /* Because of this manipulation, and the EH edges that jump
5119 threading cannot redirect, the temporary (VAR) will appear
5120 to be used uninitialized. Don't warn. */
5121 TREE_NO_WARNING (var) = 1;
5123 else
5125 gimplify_stmt (&cleanup, &cleanup_stmts);
5126 wce = gimple_build_wce (cleanup_stmts);
5127 gimple_wce_set_cleanup_eh_only (wce, eh_only);
5128 gimplify_seq_add_stmt (pre_p, wce);
5132 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR. */
5134 static enum gimplify_status
5135 gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
5137 tree targ = *expr_p;
5138 tree temp = TARGET_EXPR_SLOT (targ);
5139 tree init = TARGET_EXPR_INITIAL (targ);
5140 enum gimplify_status ret;
5142 if (init)
5144 /* TARGET_EXPR temps aren't part of the enclosing block, so add it
5145 to the temps list. Handle also variable length TARGET_EXPRs. */
5146 if (TREE_CODE (DECL_SIZE (temp)) != INTEGER_CST)
5148 if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (temp)))
5149 gimplify_type_sizes (TREE_TYPE (temp), pre_p);
5150 gimplify_vla_decl (temp, pre_p);
5152 else
5153 gimple_add_tmp_var (temp);
5155 /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
5156 expression is supposed to initialize the slot. */
5157 if (VOID_TYPE_P (TREE_TYPE (init)))
5158 ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5159 else
5161 tree init_expr = build2 (INIT_EXPR, void_type_node, temp, init);
5162 init = init_expr;
5163 ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5164 init = NULL;
5165 ggc_free (init_expr);
5167 if (ret == GS_ERROR)
5169 /* PR c++/28266 Make sure this is expanded only once. */
5170 TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5171 return GS_ERROR;
5173 if (init)
5174 gimplify_and_add (init, pre_p);
5176 /* If needed, push the cleanup for the temp. */
5177 if (TARGET_EXPR_CLEANUP (targ))
5178 gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
5179 CLEANUP_EH_ONLY (targ), pre_p);
5181 /* Only expand this once. */
5182 TREE_OPERAND (targ, 3) = init;
5183 TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5185 else
5186 /* We should have expanded this before. */
5187 gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
5189 *expr_p = temp;
5190 return GS_OK;
5193 /* Gimplification of expression trees. */
5195 /* Gimplify an expression which appears at statement context. The
5196 corresponding GIMPLE statements are added to *SEQ_P. If *SEQ_P is
5197 NULL, a new sequence is allocated.
5199 Return true if we actually added a statement to the queue. */
5201 bool
5202 gimplify_stmt (tree *stmt_p, gimple_seq *seq_p)
5204 gimple_seq_node last;
5206 if (!*seq_p)
5207 *seq_p = gimple_seq_alloc ();
5209 last = gimple_seq_last (*seq_p);
5210 gimplify_expr (stmt_p, seq_p, NULL, is_gimple_stmt, fb_none);
5211 return last != gimple_seq_last (*seq_p);
5215 /* Add FIRSTPRIVATE entries for DECL in the OpenMP the surrounding parallels
5216 to CTX. If entries already exist, force them to be some flavor of private.
5217 If there is no enclosing parallel, do nothing. */
5219 void
5220 omp_firstprivatize_variable (struct gimplify_omp_ctx *ctx, tree decl)
5222 splay_tree_node n;
5224 if (decl == NULL || !DECL_P (decl))
5225 return;
5229 n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5230 if (n != NULL)
5232 if (n->value & GOVD_SHARED)
5233 n->value = GOVD_FIRSTPRIVATE | (n->value & GOVD_SEEN);
5234 else
5235 return;
5237 else if (ctx->region_type != ORT_WORKSHARE)
5238 omp_add_variable (ctx, decl, GOVD_FIRSTPRIVATE);
5240 ctx = ctx->outer_context;
5242 while (ctx);
5245 /* Similarly for each of the type sizes of TYPE. */
5247 static void
5248 omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *ctx, tree type)
5250 if (type == NULL || type == error_mark_node)
5251 return;
5252 type = TYPE_MAIN_VARIANT (type);
5254 if (pointer_set_insert (ctx->privatized_types, type))
5255 return;
5257 switch (TREE_CODE (type))
5259 case INTEGER_TYPE:
5260 case ENUMERAL_TYPE:
5261 case BOOLEAN_TYPE:
5262 case REAL_TYPE:
5263 case FIXED_POINT_TYPE:
5264 omp_firstprivatize_variable (ctx, TYPE_MIN_VALUE (type));
5265 omp_firstprivatize_variable (ctx, TYPE_MAX_VALUE (type));
5266 break;
5268 case ARRAY_TYPE:
5269 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5270 omp_firstprivatize_type_sizes (ctx, TYPE_DOMAIN (type));
5271 break;
5273 case RECORD_TYPE:
5274 case UNION_TYPE:
5275 case QUAL_UNION_TYPE:
5277 tree field;
5278 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5279 if (TREE_CODE (field) == FIELD_DECL)
5281 omp_firstprivatize_variable (ctx, DECL_FIELD_OFFSET (field));
5282 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (field));
5285 break;
5287 case POINTER_TYPE:
5288 case REFERENCE_TYPE:
5289 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5290 break;
5292 default:
5293 break;
5296 omp_firstprivatize_variable (ctx, TYPE_SIZE (type));
5297 omp_firstprivatize_variable (ctx, TYPE_SIZE_UNIT (type));
5298 lang_hooks.types.omp_firstprivatize_type_sizes (ctx, type);
5301 /* Add an entry for DECL in the OpenMP context CTX with FLAGS. */
5303 static void
5304 omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
5306 splay_tree_node n;
5307 unsigned int nflags;
5308 tree t;
5310 if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5311 return;
5313 /* Never elide decls whose type has TREE_ADDRESSABLE set. This means
5314 there are constructors involved somewhere. */
5315 if (TREE_ADDRESSABLE (TREE_TYPE (decl))
5316 || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
5317 flags |= GOVD_SEEN;
5319 n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5320 if (n != NULL)
5322 /* We shouldn't be re-adding the decl with the same data
5323 sharing class. */
5324 gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
5325 /* The only combination of data sharing classes we should see is
5326 FIRSTPRIVATE and LASTPRIVATE. */
5327 nflags = n->value | flags;
5328 gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
5329 == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE));
5330 n->value = nflags;
5331 return;
5334 /* When adding a variable-sized variable, we have to handle all sorts
5335 of additional bits of data: the pointer replacement variable, and
5336 the parameters of the type. */
5337 if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5339 /* Add the pointer replacement variable as PRIVATE if the variable
5340 replacement is private, else FIRSTPRIVATE since we'll need the
5341 address of the original variable either for SHARED, or for the
5342 copy into or out of the context. */
5343 if (!(flags & GOVD_LOCAL))
5345 nflags = flags & GOVD_PRIVATE ? GOVD_PRIVATE : GOVD_FIRSTPRIVATE;
5346 nflags |= flags & GOVD_SEEN;
5347 t = DECL_VALUE_EXPR (decl);
5348 gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5349 t = TREE_OPERAND (t, 0);
5350 gcc_assert (DECL_P (t));
5351 omp_add_variable (ctx, t, nflags);
5354 /* Add all of the variable and type parameters (which should have
5355 been gimplified to a formal temporary) as FIRSTPRIVATE. */
5356 omp_firstprivatize_variable (ctx, DECL_SIZE_UNIT (decl));
5357 omp_firstprivatize_variable (ctx, DECL_SIZE (decl));
5358 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5360 /* The variable-sized variable itself is never SHARED, only some form
5361 of PRIVATE. The sharing would take place via the pointer variable
5362 which we remapped above. */
5363 if (flags & GOVD_SHARED)
5364 flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
5365 | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
5367 /* We're going to make use of the TYPE_SIZE_UNIT at least in the
5368 alloca statement we generate for the variable, so make sure it
5369 is available. This isn't automatically needed for the SHARED
5370 case, since we won't be allocating local storage then.
5371 For local variables TYPE_SIZE_UNIT might not be gimplified yet,
5372 in this case omp_notice_variable will be called later
5373 on when it is gimplified. */
5374 else if (! (flags & GOVD_LOCAL))
5375 omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
5377 else if (lang_hooks.decls.omp_privatize_by_reference (decl))
5379 gcc_assert ((flags & GOVD_LOCAL) == 0);
5380 omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5382 /* Similar to the direct variable sized case above, we'll need the
5383 size of references being privatized. */
5384 if ((flags & GOVD_SHARED) == 0)
5386 t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
5387 if (TREE_CODE (t) != INTEGER_CST)
5388 omp_notice_variable (ctx, t, true);
5392 splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
5395 /* Record the fact that DECL was used within the OpenMP context CTX.
5396 IN_CODE is true when real code uses DECL, and false when we should
5397 merely emit default(none) errors. Return true if DECL is going to
5398 be remapped and thus DECL shouldn't be gimplified into its
5399 DECL_VALUE_EXPR (if any). */
5401 static bool
5402 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
5404 splay_tree_node n;
5405 unsigned flags = in_code ? GOVD_SEEN : 0;
5406 bool ret = false, shared;
5408 if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5409 return false;
5411 /* Threadprivate variables are predetermined. */
5412 if (is_global_var (decl))
5414 if (DECL_THREAD_LOCAL_P (decl))
5415 return false;
5417 if (DECL_HAS_VALUE_EXPR_P (decl))
5419 tree value = get_base_address (DECL_VALUE_EXPR (decl));
5421 if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
5422 return false;
5426 n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5427 if (n == NULL)
5429 enum omp_clause_default_kind default_kind, kind;
5430 struct gimplify_omp_ctx *octx;
5432 if (ctx->region_type == ORT_WORKSHARE)
5433 goto do_outer;
5435 /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
5436 remapped firstprivate instead of shared. To some extent this is
5437 addressed in omp_firstprivatize_type_sizes, but not effectively. */
5438 default_kind = ctx->default_kind;
5439 kind = lang_hooks.decls.omp_predetermined_sharing (decl);
5440 if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
5441 default_kind = kind;
5443 switch (default_kind)
5445 case OMP_CLAUSE_DEFAULT_NONE:
5446 error ("%qE not specified in enclosing parallel",
5447 DECL_NAME (decl));
5448 error ("%Henclosing parallel", &ctx->location);
5449 /* FALLTHRU */
5450 case OMP_CLAUSE_DEFAULT_SHARED:
5451 flags |= GOVD_SHARED;
5452 break;
5453 case OMP_CLAUSE_DEFAULT_PRIVATE:
5454 flags |= GOVD_PRIVATE;
5455 break;
5456 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
5457 flags |= GOVD_FIRSTPRIVATE;
5458 break;
5459 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
5460 /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED. */
5461 gcc_assert (ctx->region_type == ORT_TASK);
5462 if (ctx->outer_context)
5463 omp_notice_variable (ctx->outer_context, decl, in_code);
5464 for (octx = ctx->outer_context; octx; octx = octx->outer_context)
5466 splay_tree_node n2;
5468 n2 = splay_tree_lookup (octx->variables, (splay_tree_key) decl);
5469 if (n2 && (n2->value & GOVD_DATA_SHARE_CLASS) != GOVD_SHARED)
5471 flags |= GOVD_FIRSTPRIVATE;
5472 break;
5474 if ((octx->region_type & ORT_PARALLEL) != 0)
5475 break;
5477 if (flags & GOVD_FIRSTPRIVATE)
5478 break;
5479 if (octx == NULL
5480 && (TREE_CODE (decl) == PARM_DECL
5481 || (!is_global_var (decl)
5482 && DECL_CONTEXT (decl) == current_function_decl)))
5484 flags |= GOVD_FIRSTPRIVATE;
5485 break;
5487 flags |= GOVD_SHARED;
5488 break;
5489 default:
5490 gcc_unreachable ();
5493 if ((flags & GOVD_PRIVATE)
5494 && lang_hooks.decls.omp_private_outer_ref (decl))
5495 flags |= GOVD_PRIVATE_OUTER_REF;
5497 omp_add_variable (ctx, decl, flags);
5499 shared = (flags & GOVD_SHARED) != 0;
5500 ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5501 goto do_outer;
5504 if ((n->value & (GOVD_SEEN | GOVD_LOCAL)) == 0
5505 && (flags & (GOVD_SEEN | GOVD_LOCAL)) == GOVD_SEEN
5506 && DECL_SIZE (decl)
5507 && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5509 splay_tree_node n2;
5510 tree t = DECL_VALUE_EXPR (decl);
5511 gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5512 t = TREE_OPERAND (t, 0);
5513 gcc_assert (DECL_P (t));
5514 n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
5515 n2->value |= GOVD_SEEN;
5518 shared = ((flags | n->value) & GOVD_SHARED) != 0;
5519 ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5521 /* If nothing changed, there's nothing left to do. */
5522 if ((n->value & flags) == flags)
5523 return ret;
5524 flags |= n->value;
5525 n->value = flags;
5527 do_outer:
5528 /* If the variable is private in the current context, then we don't
5529 need to propagate anything to an outer context. */
5530 if ((flags & GOVD_PRIVATE) && !(flags & GOVD_PRIVATE_OUTER_REF))
5531 return ret;
5532 if (ctx->outer_context
5533 && omp_notice_variable (ctx->outer_context, decl, in_code))
5534 return true;
5535 return ret;
5538 /* Verify that DECL is private within CTX. If there's specific information
5539 to the contrary in the innermost scope, generate an error. */
5541 static bool
5542 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
5544 splay_tree_node n;
5546 n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5547 if (n != NULL)
5549 if (n->value & GOVD_SHARED)
5551 if (ctx == gimplify_omp_ctxp)
5553 error ("iteration variable %qE should be private",
5554 DECL_NAME (decl));
5555 n->value = GOVD_PRIVATE;
5556 return true;
5558 else
5559 return false;
5561 else if ((n->value & GOVD_EXPLICIT) != 0
5562 && (ctx == gimplify_omp_ctxp
5563 || (ctx->region_type == ORT_COMBINED_PARALLEL
5564 && gimplify_omp_ctxp->outer_context == ctx)))
5566 if ((n->value & GOVD_FIRSTPRIVATE) != 0)
5567 error ("iteration variable %qE should not be firstprivate",
5568 DECL_NAME (decl));
5569 else if ((n->value & GOVD_REDUCTION) != 0)
5570 error ("iteration variable %qE should not be reduction",
5571 DECL_NAME (decl));
5573 return (ctx == gimplify_omp_ctxp
5574 || (ctx->region_type == ORT_COMBINED_PARALLEL
5575 && gimplify_omp_ctxp->outer_context == ctx));
5578 if (ctx->region_type != ORT_WORKSHARE)
5579 return false;
5580 else if (ctx->outer_context)
5581 return omp_is_private (ctx->outer_context, decl);
5582 return false;
5585 /* Return true if DECL is private within a parallel region
5586 that binds to the current construct's context or in parallel
5587 region's REDUCTION clause. */
5589 static bool
5590 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
5592 splay_tree_node n;
5596 ctx = ctx->outer_context;
5597 if (ctx == NULL)
5598 return !(is_global_var (decl)
5599 /* References might be private, but might be shared too. */
5600 || lang_hooks.decls.omp_privatize_by_reference (decl));
5602 n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5603 if (n != NULL)
5604 return (n->value & GOVD_SHARED) == 0;
5606 while (ctx->region_type == ORT_WORKSHARE);
5607 return false;
5610 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
5611 and previous omp contexts. */
5613 static void
5614 gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
5615 enum omp_region_type region_type)
5617 struct gimplify_omp_ctx *ctx, *outer_ctx;
5618 struct gimplify_ctx gctx;
5619 tree c;
5621 ctx = new_omp_context (region_type);
5622 outer_ctx = ctx->outer_context;
5624 while ((c = *list_p) != NULL)
5626 bool remove = false;
5627 bool notice_outer = true;
5628 const char *check_non_private = NULL;
5629 unsigned int flags;
5630 tree decl;
5632 switch (OMP_CLAUSE_CODE (c))
5634 case OMP_CLAUSE_PRIVATE:
5635 flags = GOVD_PRIVATE | GOVD_EXPLICIT;
5636 if (lang_hooks.decls.omp_private_outer_ref (OMP_CLAUSE_DECL (c)))
5638 flags |= GOVD_PRIVATE_OUTER_REF;
5639 OMP_CLAUSE_PRIVATE_OUTER_REF (c) = 1;
5641 else
5642 notice_outer = false;
5643 goto do_add;
5644 case OMP_CLAUSE_SHARED:
5645 flags = GOVD_SHARED | GOVD_EXPLICIT;
5646 goto do_add;
5647 case OMP_CLAUSE_FIRSTPRIVATE:
5648 flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
5649 check_non_private = "firstprivate";
5650 goto do_add;
5651 case OMP_CLAUSE_LASTPRIVATE:
5652 flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
5653 check_non_private = "lastprivate";
5654 goto do_add;
5655 case OMP_CLAUSE_REDUCTION:
5656 flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
5657 check_non_private = "reduction";
5658 goto do_add;
5660 do_add:
5661 decl = OMP_CLAUSE_DECL (c);
5662 if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5664 remove = true;
5665 break;
5667 omp_add_variable (ctx, decl, flags);
5668 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5669 && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
5671 omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
5672 GOVD_LOCAL | GOVD_SEEN);
5673 gimplify_omp_ctxp = ctx;
5674 push_gimplify_context (&gctx);
5676 OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c) = gimple_seq_alloc ();
5677 OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c) = gimple_seq_alloc ();
5679 gimplify_and_add (OMP_CLAUSE_REDUCTION_INIT (c),
5680 &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c));
5681 pop_gimplify_context
5682 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c)));
5683 push_gimplify_context (&gctx);
5684 gimplify_and_add (OMP_CLAUSE_REDUCTION_MERGE (c),
5685 &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c));
5686 pop_gimplify_context
5687 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c)));
5688 OMP_CLAUSE_REDUCTION_INIT (c) = NULL_TREE;
5689 OMP_CLAUSE_REDUCTION_MERGE (c) = NULL_TREE;
5691 gimplify_omp_ctxp = outer_ctx;
5693 else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
5694 && OMP_CLAUSE_LASTPRIVATE_STMT (c))
5696 gimplify_omp_ctxp = ctx;
5697 push_gimplify_context (&gctx);
5698 if (TREE_CODE (OMP_CLAUSE_LASTPRIVATE_STMT (c)) != BIND_EXPR)
5700 tree bind = build3 (BIND_EXPR, void_type_node, NULL,
5701 NULL, NULL);
5702 TREE_SIDE_EFFECTS (bind) = 1;
5703 BIND_EXPR_BODY (bind) = OMP_CLAUSE_LASTPRIVATE_STMT (c);
5704 OMP_CLAUSE_LASTPRIVATE_STMT (c) = bind;
5706 gimplify_and_add (OMP_CLAUSE_LASTPRIVATE_STMT (c),
5707 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
5708 pop_gimplify_context
5709 (gimple_seq_first_stmt (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)));
5710 OMP_CLAUSE_LASTPRIVATE_STMT (c) = NULL_TREE;
5712 gimplify_omp_ctxp = outer_ctx;
5714 if (notice_outer)
5715 goto do_notice;
5716 break;
5718 case OMP_CLAUSE_COPYIN:
5719 case OMP_CLAUSE_COPYPRIVATE:
5720 decl = OMP_CLAUSE_DECL (c);
5721 if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5723 remove = true;
5724 break;
5726 do_notice:
5727 if (outer_ctx)
5728 omp_notice_variable (outer_ctx, decl, true);
5729 if (check_non_private
5730 && region_type == ORT_WORKSHARE
5731 && omp_check_private (ctx, decl))
5733 error ("%s variable %qE is private in outer context",
5734 check_non_private, DECL_NAME (decl));
5735 remove = true;
5737 break;
5739 case OMP_CLAUSE_IF:
5740 OMP_CLAUSE_OPERAND (c, 0)
5741 = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
5742 /* Fall through. */
5744 case OMP_CLAUSE_SCHEDULE:
5745 case OMP_CLAUSE_NUM_THREADS:
5746 if (gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
5747 is_gimple_val, fb_rvalue) == GS_ERROR)
5748 remove = true;
5749 break;
5751 case OMP_CLAUSE_NOWAIT:
5752 case OMP_CLAUSE_ORDERED:
5753 case OMP_CLAUSE_UNTIED:
5754 case OMP_CLAUSE_COLLAPSE:
5755 break;
5757 case OMP_CLAUSE_DEFAULT:
5758 ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
5759 break;
5761 default:
5762 gcc_unreachable ();
5765 if (remove)
5766 *list_p = OMP_CLAUSE_CHAIN (c);
5767 else
5768 list_p = &OMP_CLAUSE_CHAIN (c);
5771 gimplify_omp_ctxp = ctx;
5774 /* For all variables that were not actually used within the context,
5775 remove PRIVATE, SHARED, and FIRSTPRIVATE clauses. */
5777 static int
5778 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
5780 tree *list_p = (tree *) data;
5781 tree decl = (tree) n->key;
5782 unsigned flags = n->value;
5783 enum omp_clause_code code;
5784 tree clause;
5785 bool private_debug;
5787 if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
5788 return 0;
5789 if ((flags & GOVD_SEEN) == 0)
5790 return 0;
5791 if (flags & GOVD_DEBUG_PRIVATE)
5793 gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
5794 private_debug = true;
5796 else
5797 private_debug
5798 = lang_hooks.decls.omp_private_debug_clause (decl,
5799 !!(flags & GOVD_SHARED));
5800 if (private_debug)
5801 code = OMP_CLAUSE_PRIVATE;
5802 else if (flags & GOVD_SHARED)
5804 if (is_global_var (decl))
5806 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
5807 while (ctx != NULL)
5809 splay_tree_node on
5810 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5811 if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
5812 | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
5813 break;
5814 ctx = ctx->outer_context;
5816 if (ctx == NULL)
5817 return 0;
5819 code = OMP_CLAUSE_SHARED;
5821 else if (flags & GOVD_PRIVATE)
5822 code = OMP_CLAUSE_PRIVATE;
5823 else if (flags & GOVD_FIRSTPRIVATE)
5824 code = OMP_CLAUSE_FIRSTPRIVATE;
5825 else
5826 gcc_unreachable ();
5828 clause = build_omp_clause (input_location, code);
5829 OMP_CLAUSE_DECL (clause) = decl;
5830 OMP_CLAUSE_CHAIN (clause) = *list_p;
5831 if (private_debug)
5832 OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
5833 else if (code == OMP_CLAUSE_PRIVATE && (flags & GOVD_PRIVATE_OUTER_REF))
5834 OMP_CLAUSE_PRIVATE_OUTER_REF (clause) = 1;
5835 *list_p = clause;
5836 lang_hooks.decls.omp_finish_clause (clause);
5838 return 0;
5841 static void
5842 gimplify_adjust_omp_clauses (tree *list_p)
5844 struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
5845 tree c, decl;
5847 while ((c = *list_p) != NULL)
5849 splay_tree_node n;
5850 bool remove = false;
5852 switch (OMP_CLAUSE_CODE (c))
5854 case OMP_CLAUSE_PRIVATE:
5855 case OMP_CLAUSE_SHARED:
5856 case OMP_CLAUSE_FIRSTPRIVATE:
5857 decl = OMP_CLAUSE_DECL (c);
5858 n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5859 remove = !(n->value & GOVD_SEEN);
5860 if (! remove)
5862 bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
5863 if ((n->value & GOVD_DEBUG_PRIVATE)
5864 || lang_hooks.decls.omp_private_debug_clause (decl, shared))
5866 gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
5867 || ((n->value & GOVD_DATA_SHARE_CLASS)
5868 == GOVD_PRIVATE));
5869 OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
5870 OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
5873 break;
5875 case OMP_CLAUSE_LASTPRIVATE:
5876 /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
5877 accurately reflect the presence of a FIRSTPRIVATE clause. */
5878 decl = OMP_CLAUSE_DECL (c);
5879 n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5880 OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
5881 = (n->value & GOVD_FIRSTPRIVATE) != 0;
5882 break;
5884 case OMP_CLAUSE_REDUCTION:
5885 case OMP_CLAUSE_COPYIN:
5886 case OMP_CLAUSE_COPYPRIVATE:
5887 case OMP_CLAUSE_IF:
5888 case OMP_CLAUSE_NUM_THREADS:
5889 case OMP_CLAUSE_SCHEDULE:
5890 case OMP_CLAUSE_NOWAIT:
5891 case OMP_CLAUSE_ORDERED:
5892 case OMP_CLAUSE_DEFAULT:
5893 case OMP_CLAUSE_UNTIED:
5894 case OMP_CLAUSE_COLLAPSE:
5895 break;
5897 default:
5898 gcc_unreachable ();
5901 if (remove)
5902 *list_p = OMP_CLAUSE_CHAIN (c);
5903 else
5904 list_p = &OMP_CLAUSE_CHAIN (c);
5907 /* Add in any implicit data sharing. */
5908 splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
5910 gimplify_omp_ctxp = ctx->outer_context;
5911 delete_omp_context (ctx);
5914 /* Gimplify the contents of an OMP_PARALLEL statement. This involves
5915 gimplification of the body, as well as scanning the body for used
5916 variables. We need to do this scan now, because variable-sized
5917 decls will be decomposed during gimplification. */
5919 static void
5920 gimplify_omp_parallel (tree *expr_p, gimple_seq *pre_p)
5922 tree expr = *expr_p;
5923 gimple g;
5924 gimple_seq body = NULL;
5925 struct gimplify_ctx gctx;
5927 gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p,
5928 OMP_PARALLEL_COMBINED (expr)
5929 ? ORT_COMBINED_PARALLEL
5930 : ORT_PARALLEL);
5932 push_gimplify_context (&gctx);
5934 g = gimplify_and_return_first (OMP_PARALLEL_BODY (expr), &body);
5935 if (gimple_code (g) == GIMPLE_BIND)
5936 pop_gimplify_context (g);
5937 else
5938 pop_gimplify_context (NULL);
5940 gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
5942 g = gimple_build_omp_parallel (body,
5943 OMP_PARALLEL_CLAUSES (expr),
5944 NULL_TREE, NULL_TREE);
5945 if (OMP_PARALLEL_COMBINED (expr))
5946 gimple_omp_set_subcode (g, GF_OMP_PARALLEL_COMBINED);
5947 gimplify_seq_add_stmt (pre_p, g);
5948 *expr_p = NULL_TREE;
5951 /* Gimplify the contents of an OMP_TASK statement. This involves
5952 gimplification of the body, as well as scanning the body for used
5953 variables. We need to do this scan now, because variable-sized
5954 decls will be decomposed during gimplification. */
5956 static void
5957 gimplify_omp_task (tree *expr_p, gimple_seq *pre_p)
5959 tree expr = *expr_p;
5960 gimple g;
5961 gimple_seq body = NULL;
5962 struct gimplify_ctx gctx;
5964 gimplify_scan_omp_clauses (&OMP_TASK_CLAUSES (expr), pre_p, ORT_TASK);
5966 push_gimplify_context (&gctx);
5968 g = gimplify_and_return_first (OMP_TASK_BODY (expr), &body);
5969 if (gimple_code (g) == GIMPLE_BIND)
5970 pop_gimplify_context (g);
5971 else
5972 pop_gimplify_context (NULL);
5974 gimplify_adjust_omp_clauses (&OMP_TASK_CLAUSES (expr));
5976 g = gimple_build_omp_task (body,
5977 OMP_TASK_CLAUSES (expr),
5978 NULL_TREE, NULL_TREE,
5979 NULL_TREE, NULL_TREE, NULL_TREE);
5980 gimplify_seq_add_stmt (pre_p, g);
5981 *expr_p = NULL_TREE;
5984 /* Gimplify the gross structure of an OMP_FOR statement. */
5986 static enum gimplify_status
5987 gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
5989 tree for_stmt, decl, var, t;
5990 enum gimplify_status ret = GS_ALL_DONE;
5991 enum gimplify_status tret;
5992 gimple gfor;
5993 gimple_seq for_body, for_pre_body;
5994 int i;
5996 for_stmt = *expr_p;
5998 gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
5999 ORT_WORKSHARE);
6001 /* Handle OMP_FOR_INIT. */
6002 for_pre_body = NULL;
6003 gimplify_and_add (OMP_FOR_PRE_BODY (for_stmt), &for_pre_body);
6004 OMP_FOR_PRE_BODY (for_stmt) = NULL_TREE;
6006 for_body = gimple_seq_alloc ();
6007 gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
6008 == TREE_VEC_LENGTH (OMP_FOR_COND (for_stmt)));
6009 gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
6010 == TREE_VEC_LENGTH (OMP_FOR_INCR (for_stmt)));
6011 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6013 t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6014 gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6015 decl = TREE_OPERAND (t, 0);
6016 gcc_assert (DECL_P (decl));
6017 gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl))
6018 || POINTER_TYPE_P (TREE_TYPE (decl)));
6020 /* Make sure the iteration variable is private. */
6021 if (omp_is_private (gimplify_omp_ctxp, decl))
6022 omp_notice_variable (gimplify_omp_ctxp, decl, true);
6023 else
6024 omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
6026 /* If DECL is not a gimple register, create a temporary variable to act
6027 as an iteration counter. This is valid, since DECL cannot be
6028 modified in the body of the loop. */
6029 if (!is_gimple_reg (decl))
6031 var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
6032 TREE_OPERAND (t, 0) = var;
6034 gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var));
6036 omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
6038 else
6039 var = decl;
6041 tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6042 is_gimple_val, fb_rvalue);
6043 ret = MIN (ret, tret);
6044 if (ret == GS_ERROR)
6045 return ret;
6047 /* Handle OMP_FOR_COND. */
6048 t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6049 gcc_assert (COMPARISON_CLASS_P (t));
6050 gcc_assert (TREE_OPERAND (t, 0) == decl);
6052 tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6053 is_gimple_val, fb_rvalue);
6054 ret = MIN (ret, tret);
6056 /* Handle OMP_FOR_INCR. */
6057 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6058 switch (TREE_CODE (t))
6060 case PREINCREMENT_EXPR:
6061 case POSTINCREMENT_EXPR:
6062 t = build_int_cst (TREE_TYPE (decl), 1);
6063 t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6064 t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6065 TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6066 break;
6068 case PREDECREMENT_EXPR:
6069 case POSTDECREMENT_EXPR:
6070 t = build_int_cst (TREE_TYPE (decl), -1);
6071 t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6072 t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6073 TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6074 break;
6076 case MODIFY_EXPR:
6077 gcc_assert (TREE_OPERAND (t, 0) == decl);
6078 TREE_OPERAND (t, 0) = var;
6080 t = TREE_OPERAND (t, 1);
6081 switch (TREE_CODE (t))
6083 case PLUS_EXPR:
6084 if (TREE_OPERAND (t, 1) == decl)
6086 TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
6087 TREE_OPERAND (t, 0) = var;
6088 break;
6091 /* Fallthru. */
6092 case MINUS_EXPR:
6093 case POINTER_PLUS_EXPR:
6094 gcc_assert (TREE_OPERAND (t, 0) == decl);
6095 TREE_OPERAND (t, 0) = var;
6096 break;
6097 default:
6098 gcc_unreachable ();
6101 tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6102 is_gimple_val, fb_rvalue);
6103 ret = MIN (ret, tret);
6104 break;
6106 default:
6107 gcc_unreachable ();
6110 if (var != decl || TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1)
6112 tree c;
6113 for (c = OMP_FOR_CLAUSES (for_stmt); c ; c = OMP_CLAUSE_CHAIN (c))
6114 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
6115 && OMP_CLAUSE_DECL (c) == decl
6116 && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL)
6118 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6119 gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6120 gcc_assert (TREE_OPERAND (t, 0) == var);
6121 t = TREE_OPERAND (t, 1);
6122 gcc_assert (TREE_CODE (t) == PLUS_EXPR
6123 || TREE_CODE (t) == MINUS_EXPR
6124 || TREE_CODE (t) == POINTER_PLUS_EXPR);
6125 gcc_assert (TREE_OPERAND (t, 0) == var);
6126 t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl,
6127 TREE_OPERAND (t, 1));
6128 gimplify_assign (decl, t,
6129 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
6134 gimplify_and_add (OMP_FOR_BODY (for_stmt), &for_body);
6136 gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
6138 gfor = gimple_build_omp_for (for_body, OMP_FOR_CLAUSES (for_stmt),
6139 TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)),
6140 for_pre_body);
6142 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6144 t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6145 gimple_omp_for_set_index (gfor, i, TREE_OPERAND (t, 0));
6146 gimple_omp_for_set_initial (gfor, i, TREE_OPERAND (t, 1));
6147 t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6148 gimple_omp_for_set_cond (gfor, i, TREE_CODE (t));
6149 gimple_omp_for_set_final (gfor, i, TREE_OPERAND (t, 1));
6150 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6151 gimple_omp_for_set_incr (gfor, i, TREE_OPERAND (t, 1));
6154 gimplify_seq_add_stmt (pre_p, gfor);
6155 return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
6158 /* Gimplify the gross structure of other OpenMP worksharing constructs.
6159 In particular, OMP_SECTIONS and OMP_SINGLE. */
6161 static void
6162 gimplify_omp_workshare (tree *expr_p, gimple_seq *pre_p)
6164 tree expr = *expr_p;
6165 gimple stmt;
6166 gimple_seq body = NULL;
6168 gimplify_scan_omp_clauses (&OMP_CLAUSES (expr), pre_p, ORT_WORKSHARE);
6169 gimplify_and_add (OMP_BODY (expr), &body);
6170 gimplify_adjust_omp_clauses (&OMP_CLAUSES (expr));
6172 if (TREE_CODE (expr) == OMP_SECTIONS)
6173 stmt = gimple_build_omp_sections (body, OMP_CLAUSES (expr));
6174 else if (TREE_CODE (expr) == OMP_SINGLE)
6175 stmt = gimple_build_omp_single (body, OMP_CLAUSES (expr));
6176 else
6177 gcc_unreachable ();
6179 gimplify_seq_add_stmt (pre_p, stmt);
6182 /* A subroutine of gimplify_omp_atomic. The front end is supposed to have
6183 stabilized the lhs of the atomic operation as *ADDR. Return true if
6184 EXPR is this stabilized form. */
6186 static bool
6187 goa_lhs_expr_p (tree expr, tree addr)
6189 /* Also include casts to other type variants. The C front end is fond
6190 of adding these for e.g. volatile variables. This is like
6191 STRIP_TYPE_NOPS but includes the main variant lookup. */
6192 while ((CONVERT_EXPR_P (expr)
6193 || TREE_CODE (expr) == NON_LVALUE_EXPR)
6194 && TREE_OPERAND (expr, 0) != error_mark_node
6195 && (TYPE_MAIN_VARIANT (TREE_TYPE (expr))
6196 == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (expr, 0)))))
6197 expr = TREE_OPERAND (expr, 0);
6199 if (TREE_CODE (expr) == INDIRECT_REF)
6201 expr = TREE_OPERAND (expr, 0);
6202 while (expr != addr
6203 && (CONVERT_EXPR_P (expr)
6204 || TREE_CODE (expr) == NON_LVALUE_EXPR)
6205 && TREE_CODE (expr) == TREE_CODE (addr)
6206 && TYPE_MAIN_VARIANT (TREE_TYPE (expr))
6207 == TYPE_MAIN_VARIANT (TREE_TYPE (addr)))
6209 expr = TREE_OPERAND (expr, 0);
6210 addr = TREE_OPERAND (addr, 0);
6212 if (expr == addr)
6213 return true;
6214 return (TREE_CODE (addr) == ADDR_EXPR
6215 && TREE_CODE (expr) == ADDR_EXPR
6216 && TREE_OPERAND (addr, 0) == TREE_OPERAND (expr, 0));
6218 if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
6219 return true;
6220 return false;
6223 /* Walk *EXPR_P and replace
6224 appearances of *LHS_ADDR with LHS_VAR. If an expression does not involve
6225 the lhs, evaluate it into a temporary. Return 1 if the lhs appeared as
6226 a subexpression, 0 if it did not, or -1 if an error was encountered. */
6228 static int
6229 goa_stabilize_expr (tree *expr_p, gimple_seq *pre_p, tree lhs_addr,
6230 tree lhs_var)
6232 tree expr = *expr_p;
6233 int saw_lhs;
6235 if (goa_lhs_expr_p (expr, lhs_addr))
6237 *expr_p = lhs_var;
6238 return 1;
6240 if (is_gimple_val (expr))
6241 return 0;
6243 saw_lhs = 0;
6244 switch (TREE_CODE_CLASS (TREE_CODE (expr)))
6246 case tcc_binary:
6247 case tcc_comparison:
6248 saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p, lhs_addr,
6249 lhs_var);
6250 case tcc_unary:
6251 saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p, lhs_addr,
6252 lhs_var);
6253 break;
6254 case tcc_expression:
6255 switch (TREE_CODE (expr))
6257 case TRUTH_ANDIF_EXPR:
6258 case TRUTH_ORIF_EXPR:
6259 saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
6260 lhs_addr, lhs_var);
6261 saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
6262 lhs_addr, lhs_var);
6263 break;
6264 default:
6265 break;
6267 break;
6268 default:
6269 break;
6272 if (saw_lhs == 0)
6274 enum gimplify_status gs;
6275 gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
6276 if (gs != GS_ALL_DONE)
6277 saw_lhs = -1;
6280 return saw_lhs;
6284 /* Gimplify an OMP_ATOMIC statement. */
6286 static enum gimplify_status
6287 gimplify_omp_atomic (tree *expr_p, gimple_seq *pre_p)
6289 tree addr = TREE_OPERAND (*expr_p, 0);
6290 tree rhs = TREE_OPERAND (*expr_p, 1);
6291 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
6292 tree tmp_load;
6294 tmp_load = create_tmp_var (type, NULL);
6295 if (goa_stabilize_expr (&rhs, pre_p, addr, tmp_load) < 0)
6296 return GS_ERROR;
6298 if (gimplify_expr (&addr, pre_p, NULL, is_gimple_val, fb_rvalue)
6299 != GS_ALL_DONE)
6300 return GS_ERROR;
6302 gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_load (tmp_load, addr));
6303 if (gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue)
6304 != GS_ALL_DONE)
6305 return GS_ERROR;
6306 gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_store (rhs));
6307 *expr_p = NULL;
6309 return GS_ALL_DONE;
6313 /* Converts the GENERIC expression tree *EXPR_P to GIMPLE. If the
6314 expression produces a value to be used as an operand inside a GIMPLE
6315 statement, the value will be stored back in *EXPR_P. This value will
6316 be a tree of class tcc_declaration, tcc_constant, tcc_reference or
6317 an SSA_NAME. The corresponding sequence of GIMPLE statements is
6318 emitted in PRE_P and POST_P.
6320 Additionally, this process may overwrite parts of the input
6321 expression during gimplification. Ideally, it should be
6322 possible to do non-destructive gimplification.
6324 EXPR_P points to the GENERIC expression to convert to GIMPLE. If
6325 the expression needs to evaluate to a value to be used as
6326 an operand in a GIMPLE statement, this value will be stored in
6327 *EXPR_P on exit. This happens when the caller specifies one
6328 of fb_lvalue or fb_rvalue fallback flags.
6330 PRE_P will contain the sequence of GIMPLE statements corresponding
6331 to the evaluation of EXPR and all the side-effects that must
6332 be executed before the main expression. On exit, the last
6333 statement of PRE_P is the core statement being gimplified. For
6334 instance, when gimplifying 'if (++a)' the last statement in
6335 PRE_P will be 'if (t.1)' where t.1 is the result of
6336 pre-incrementing 'a'.
6338 POST_P will contain the sequence of GIMPLE statements corresponding
6339 to the evaluation of all the side-effects that must be executed
6340 after the main expression. If this is NULL, the post
6341 side-effects are stored at the end of PRE_P.
6343 The reason why the output is split in two is to handle post
6344 side-effects explicitly. In some cases, an expression may have
6345 inner and outer post side-effects which need to be emitted in
6346 an order different from the one given by the recursive
6347 traversal. For instance, for the expression (*p--)++ the post
6348 side-effects of '--' must actually occur *after* the post
6349 side-effects of '++'. However, gimplification will first visit
6350 the inner expression, so if a separate POST sequence was not
6351 used, the resulting sequence would be:
6353 1 t.1 = *p
6354 2 p = p - 1
6355 3 t.2 = t.1 + 1
6356 4 *p = t.2
6358 However, the post-decrement operation in line #2 must not be
6359 evaluated until after the store to *p at line #4, so the
6360 correct sequence should be:
6362 1 t.1 = *p
6363 2 t.2 = t.1 + 1
6364 3 *p = t.2
6365 4 p = p - 1
6367 So, by specifying a separate post queue, it is possible
6368 to emit the post side-effects in the correct order.
6369 If POST_P is NULL, an internal queue will be used. Before
6370 returning to the caller, the sequence POST_P is appended to
6371 the main output sequence PRE_P.
6373 GIMPLE_TEST_F points to a function that takes a tree T and
6374 returns nonzero if T is in the GIMPLE form requested by the
6375 caller. The GIMPLE predicates are in tree-gimple.c.
6377 FALLBACK tells the function what sort of a temporary we want if
6378 gimplification cannot produce an expression that complies with
6379 GIMPLE_TEST_F.
6381 fb_none means that no temporary should be generated
6382 fb_rvalue means that an rvalue is OK to generate
6383 fb_lvalue means that an lvalue is OK to generate
6384 fb_either means that either is OK, but an lvalue is preferable.
6385 fb_mayfail means that gimplification may fail (in which case
6386 GS_ERROR will be returned)
6388 The return value is either GS_ERROR or GS_ALL_DONE, since this
6389 function iterates until EXPR is completely gimplified or an error
6390 occurs. */
6392 enum gimplify_status
6393 gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
6394 bool (*gimple_test_f) (tree), fallback_t fallback)
6396 tree tmp;
6397 gimple_seq internal_pre = NULL;
6398 gimple_seq internal_post = NULL;
6399 tree save_expr;
6400 bool is_statement;
6401 location_t saved_location;
6402 enum gimplify_status ret;
6403 gimple_stmt_iterator pre_last_gsi, post_last_gsi;
6405 save_expr = *expr_p;
6406 if (save_expr == NULL_TREE)
6407 return GS_ALL_DONE;
6409 /* If we are gimplifying a top-level statement, PRE_P must be valid. */
6410 is_statement = gimple_test_f == is_gimple_stmt;
6411 if (is_statement)
6412 gcc_assert (pre_p);
6414 /* Consistency checks. */
6415 if (gimple_test_f == is_gimple_reg)
6416 gcc_assert (fallback & (fb_rvalue | fb_lvalue));
6417 else if (gimple_test_f == is_gimple_val
6418 || gimple_test_f == is_gimple_call_addr
6419 || gimple_test_f == is_gimple_condexpr
6420 || gimple_test_f == is_gimple_mem_rhs
6421 || gimple_test_f == is_gimple_mem_rhs_or_call
6422 || gimple_test_f == is_gimple_reg_rhs
6423 || gimple_test_f == is_gimple_reg_rhs_or_call
6424 || gimple_test_f == is_gimple_asm_val)
6425 gcc_assert (fallback & fb_rvalue);
6426 else if (gimple_test_f == is_gimple_min_lval
6427 || gimple_test_f == is_gimple_lvalue)
6428 gcc_assert (fallback & fb_lvalue);
6429 else if (gimple_test_f == is_gimple_addressable)
6430 gcc_assert (fallback & fb_either);
6431 else if (gimple_test_f == is_gimple_stmt)
6432 gcc_assert (fallback == fb_none);
6433 else
6435 /* We should have recognized the GIMPLE_TEST_F predicate to
6436 know what kind of fallback to use in case a temporary is
6437 needed to hold the value or address of *EXPR_P. */
6438 gcc_unreachable ();
6441 /* We used to check the predicate here and return immediately if it
6442 succeeds. This is wrong; the design is for gimplification to be
6443 idempotent, and for the predicates to only test for valid forms, not
6444 whether they are fully simplified. */
6445 if (pre_p == NULL)
6446 pre_p = &internal_pre;
6448 if (post_p == NULL)
6449 post_p = &internal_post;
6451 /* Remember the last statements added to PRE_P and POST_P. Every
6452 new statement added by the gimplification helpers needs to be
6453 annotated with location information. To centralize the
6454 responsibility, we remember the last statement that had been
6455 added to both queues before gimplifying *EXPR_P. If
6456 gimplification produces new statements in PRE_P and POST_P, those
6457 statements will be annotated with the same location information
6458 as *EXPR_P. */
6459 pre_last_gsi = gsi_last (*pre_p);
6460 post_last_gsi = gsi_last (*post_p);
6462 saved_location = input_location;
6463 if (save_expr != error_mark_node
6464 && EXPR_HAS_LOCATION (*expr_p))
6465 input_location = EXPR_LOCATION (*expr_p);
6467 /* Loop over the specific gimplifiers until the toplevel node
6468 remains the same. */
6471 /* Strip away as many useless type conversions as possible
6472 at the toplevel. */
6473 STRIP_USELESS_TYPE_CONVERSION (*expr_p);
6475 /* Remember the expr. */
6476 save_expr = *expr_p;
6478 /* Die, die, die, my darling. */
6479 if (save_expr == error_mark_node
6480 || (TREE_TYPE (save_expr)
6481 && TREE_TYPE (save_expr) == error_mark_node))
6483 ret = GS_ERROR;
6484 break;
6487 /* Do any language-specific gimplification. */
6488 ret = ((enum gimplify_status)
6489 lang_hooks.gimplify_expr (expr_p, pre_p, post_p));
6490 if (ret == GS_OK)
6492 if (*expr_p == NULL_TREE)
6493 break;
6494 if (*expr_p != save_expr)
6495 continue;
6497 else if (ret != GS_UNHANDLED)
6498 break;
6500 ret = GS_OK;
6501 switch (TREE_CODE (*expr_p))
6503 /* First deal with the special cases. */
6505 case POSTINCREMENT_EXPR:
6506 case POSTDECREMENT_EXPR:
6507 case PREINCREMENT_EXPR:
6508 case PREDECREMENT_EXPR:
6509 ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
6510 fallback != fb_none);
6511 break;
6513 case ARRAY_REF:
6514 case ARRAY_RANGE_REF:
6515 case REALPART_EXPR:
6516 case IMAGPART_EXPR:
6517 case COMPONENT_REF:
6518 case VIEW_CONVERT_EXPR:
6519 ret = gimplify_compound_lval (expr_p, pre_p, post_p,
6520 fallback ? fallback : fb_rvalue);
6521 break;
6523 case COND_EXPR:
6524 ret = gimplify_cond_expr (expr_p, pre_p, fallback);
6526 /* C99 code may assign to an array in a structure value of a
6527 conditional expression, and this has undefined behavior
6528 only on execution, so create a temporary if an lvalue is
6529 required. */
6530 if (fallback == fb_lvalue)
6532 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6533 mark_addressable (*expr_p);
6535 break;
6537 case CALL_EXPR:
6538 ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
6540 /* C99 code may assign to an array in a structure returned
6541 from a function, and this has undefined behavior only on
6542 execution, so create a temporary if an lvalue is
6543 required. */
6544 if (fallback == fb_lvalue)
6546 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6547 mark_addressable (*expr_p);
6549 break;
6551 case TREE_LIST:
6552 gcc_unreachable ();
6554 case COMPOUND_EXPR:
6555 ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
6556 break;
6558 case COMPOUND_LITERAL_EXPR:
6559 ret = gimplify_compound_literal_expr (expr_p, pre_p);
6560 break;
6562 case MODIFY_EXPR:
6563 case INIT_EXPR:
6564 ret = gimplify_modify_expr (expr_p, pre_p, post_p,
6565 fallback != fb_none);
6566 break;
6568 case TRUTH_ANDIF_EXPR:
6569 case TRUTH_ORIF_EXPR:
6570 /* Pass the source location of the outer expression. */
6571 ret = gimplify_boolean_expr (expr_p, saved_location);
6572 break;
6574 case TRUTH_NOT_EXPR:
6575 if (TREE_CODE (TREE_TYPE (*expr_p)) != BOOLEAN_TYPE)
6577 tree type = TREE_TYPE (*expr_p);
6578 *expr_p = fold_convert (type, gimple_boolify (*expr_p));
6579 ret = GS_OK;
6580 break;
6583 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6584 is_gimple_val, fb_rvalue);
6585 recalculate_side_effects (*expr_p);
6586 break;
6588 case ADDR_EXPR:
6589 ret = gimplify_addr_expr (expr_p, pre_p, post_p);
6590 break;
6592 case VA_ARG_EXPR:
6593 ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
6594 break;
6596 CASE_CONVERT:
6597 if (IS_EMPTY_STMT (*expr_p))
6599 ret = GS_ALL_DONE;
6600 break;
6603 if (VOID_TYPE_P (TREE_TYPE (*expr_p))
6604 || fallback == fb_none)
6606 /* Just strip a conversion to void (or in void context) and
6607 try again. */
6608 *expr_p = TREE_OPERAND (*expr_p, 0);
6609 break;
6612 ret = gimplify_conversion (expr_p);
6613 if (ret == GS_ERROR)
6614 break;
6615 if (*expr_p != save_expr)
6616 break;
6617 /* FALLTHRU */
6619 case FIX_TRUNC_EXPR:
6620 /* unary_expr: ... | '(' cast ')' val | ... */
6621 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6622 is_gimple_val, fb_rvalue);
6623 recalculate_side_effects (*expr_p);
6624 break;
6626 case INDIRECT_REF:
6627 *expr_p = fold_indirect_ref (*expr_p);
6628 if (*expr_p != save_expr)
6629 break;
6630 /* else fall through. */
6631 case ALIGN_INDIRECT_REF:
6632 case MISALIGNED_INDIRECT_REF:
6633 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6634 is_gimple_reg, fb_rvalue);
6635 recalculate_side_effects (*expr_p);
6636 break;
6638 /* Constants need not be gimplified. */
6639 case INTEGER_CST:
6640 case REAL_CST:
6641 case FIXED_CST:
6642 case STRING_CST:
6643 case COMPLEX_CST:
6644 case VECTOR_CST:
6645 ret = GS_ALL_DONE;
6646 break;
6648 case CONST_DECL:
6649 /* If we require an lvalue, such as for ADDR_EXPR, retain the
6650 CONST_DECL node. Otherwise the decl is replaceable by its
6651 value. */
6652 /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either. */
6653 if (fallback & fb_lvalue)
6654 ret = GS_ALL_DONE;
6655 else
6656 *expr_p = DECL_INITIAL (*expr_p);
6657 break;
6659 case DECL_EXPR:
6660 ret = gimplify_decl_expr (expr_p, pre_p);
6661 break;
6663 case EXC_PTR_EXPR:
6664 /* FIXME make this a decl. */
6665 ret = GS_ALL_DONE;
6666 break;
6668 case BIND_EXPR:
6669 ret = gimplify_bind_expr (expr_p, pre_p);
6670 break;
6672 case LOOP_EXPR:
6673 ret = gimplify_loop_expr (expr_p, pre_p);
6674 break;
6676 case SWITCH_EXPR:
6677 ret = gimplify_switch_expr (expr_p, pre_p);
6678 break;
6680 case EXIT_EXPR:
6681 ret = gimplify_exit_expr (expr_p);
6682 break;
6684 case GOTO_EXPR:
6685 /* If the target is not LABEL, then it is a computed jump
6686 and the target needs to be gimplified. */
6687 if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
6689 ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
6690 NULL, is_gimple_val, fb_rvalue);
6691 if (ret == GS_ERROR)
6692 break;
6694 gimplify_seq_add_stmt (pre_p,
6695 gimple_build_goto (GOTO_DESTINATION (*expr_p)));
6696 break;
6698 case PREDICT_EXPR:
6699 gimplify_seq_add_stmt (pre_p,
6700 gimple_build_predict (PREDICT_EXPR_PREDICTOR (*expr_p),
6701 PREDICT_EXPR_OUTCOME (*expr_p)));
6702 ret = GS_ALL_DONE;
6703 break;
6705 case LABEL_EXPR:
6706 ret = GS_ALL_DONE;
6707 gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
6708 == current_function_decl);
6709 gimplify_seq_add_stmt (pre_p,
6710 gimple_build_label (LABEL_EXPR_LABEL (*expr_p)));
6711 break;
6713 case CASE_LABEL_EXPR:
6714 ret = gimplify_case_label_expr (expr_p, pre_p);
6715 break;
6717 case RETURN_EXPR:
6718 ret = gimplify_return_expr (*expr_p, pre_p);
6719 break;
6721 case CONSTRUCTOR:
6722 /* Don't reduce this in place; let gimplify_init_constructor work its
6723 magic. Buf if we're just elaborating this for side effects, just
6724 gimplify any element that has side-effects. */
6725 if (fallback == fb_none)
6727 unsigned HOST_WIDE_INT ix;
6728 constructor_elt *ce;
6729 tree temp = NULL_TREE;
6730 for (ix = 0;
6731 VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
6732 ix, ce);
6733 ix++)
6734 if (TREE_SIDE_EFFECTS (ce->value))
6735 append_to_statement_list (ce->value, &temp);
6737 *expr_p = temp;
6738 ret = GS_OK;
6740 /* C99 code may assign to an array in a constructed
6741 structure or union, and this has undefined behavior only
6742 on execution, so create a temporary if an lvalue is
6743 required. */
6744 else if (fallback == fb_lvalue)
6746 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6747 mark_addressable (*expr_p);
6749 else
6750 ret = GS_ALL_DONE;
6751 break;
6753 /* The following are special cases that are not handled by the
6754 original GIMPLE grammar. */
6756 /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
6757 eliminated. */
6758 case SAVE_EXPR:
6759 ret = gimplify_save_expr (expr_p, pre_p, post_p);
6760 break;
6762 case BIT_FIELD_REF:
6764 enum gimplify_status r0, r1, r2;
6766 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6767 post_p, is_gimple_lvalue, fb_either);
6768 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
6769 post_p, is_gimple_val, fb_rvalue);
6770 r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
6771 post_p, is_gimple_val, fb_rvalue);
6772 recalculate_side_effects (*expr_p);
6774 ret = MIN (r0, MIN (r1, r2));
6776 break;
6778 case TARGET_MEM_REF:
6780 enum gimplify_status r0 = GS_ALL_DONE, r1 = GS_ALL_DONE;
6782 if (TMR_SYMBOL (*expr_p))
6783 r0 = gimplify_expr (&TMR_SYMBOL (*expr_p), pre_p,
6784 post_p, is_gimple_lvalue, fb_either);
6785 else if (TMR_BASE (*expr_p))
6786 r0 = gimplify_expr (&TMR_BASE (*expr_p), pre_p,
6787 post_p, is_gimple_val, fb_either);
6788 if (TMR_INDEX (*expr_p))
6789 r1 = gimplify_expr (&TMR_INDEX (*expr_p), pre_p,
6790 post_p, is_gimple_val, fb_rvalue);
6791 /* TMR_STEP and TMR_OFFSET are always integer constants. */
6792 ret = MIN (r0, r1);
6794 break;
6796 case NON_LVALUE_EXPR:
6797 /* This should have been stripped above. */
6798 gcc_unreachable ();
6800 case ASM_EXPR:
6801 ret = gimplify_asm_expr (expr_p, pre_p, post_p);
6802 break;
6804 case TRY_FINALLY_EXPR:
6805 case TRY_CATCH_EXPR:
6807 gimple_seq eval, cleanup;
6808 gimple try_;
6810 eval = cleanup = NULL;
6811 gimplify_and_add (TREE_OPERAND (*expr_p, 0), &eval);
6812 gimplify_and_add (TREE_OPERAND (*expr_p, 1), &cleanup);
6813 /* Don't create bogus GIMPLE_TRY with empty cleanup. */
6814 if (gimple_seq_empty_p (cleanup))
6816 gimple_seq_add_seq (pre_p, eval);
6817 ret = GS_ALL_DONE;
6818 break;
6820 try_ = gimple_build_try (eval, cleanup,
6821 TREE_CODE (*expr_p) == TRY_FINALLY_EXPR
6822 ? GIMPLE_TRY_FINALLY
6823 : GIMPLE_TRY_CATCH);
6824 if (TREE_CODE (*expr_p) == TRY_CATCH_EXPR)
6825 gimple_try_set_catch_is_cleanup (try_,
6826 TRY_CATCH_IS_CLEANUP (*expr_p));
6827 gimplify_seq_add_stmt (pre_p, try_);
6828 ret = GS_ALL_DONE;
6829 break;
6832 case CLEANUP_POINT_EXPR:
6833 ret = gimplify_cleanup_point_expr (expr_p, pre_p);
6834 break;
6836 case TARGET_EXPR:
6837 ret = gimplify_target_expr (expr_p, pre_p, post_p);
6838 break;
6840 case CATCH_EXPR:
6842 gimple c;
6843 gimple_seq handler = NULL;
6844 gimplify_and_add (CATCH_BODY (*expr_p), &handler);
6845 c = gimple_build_catch (CATCH_TYPES (*expr_p), handler);
6846 gimplify_seq_add_stmt (pre_p, c);
6847 ret = GS_ALL_DONE;
6848 break;
6851 case EH_FILTER_EXPR:
6853 gimple ehf;
6854 gimple_seq failure = NULL;
6856 gimplify_and_add (EH_FILTER_FAILURE (*expr_p), &failure);
6857 ehf = gimple_build_eh_filter (EH_FILTER_TYPES (*expr_p), failure);
6858 gimple_eh_filter_set_must_not_throw
6859 (ehf, EH_FILTER_MUST_NOT_THROW (*expr_p));
6860 gimplify_seq_add_stmt (pre_p, ehf);
6861 ret = GS_ALL_DONE;
6862 break;
6865 case OBJ_TYPE_REF:
6867 enum gimplify_status r0, r1;
6868 r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p,
6869 post_p, is_gimple_val, fb_rvalue);
6870 r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p,
6871 post_p, is_gimple_val, fb_rvalue);
6872 TREE_SIDE_EFFECTS (*expr_p) = 0;
6873 ret = MIN (r0, r1);
6875 break;
6877 case LABEL_DECL:
6878 /* We get here when taking the address of a label. We mark
6879 the label as "forced"; meaning it can never be removed and
6880 it is a potential target for any computed goto. */
6881 FORCED_LABEL (*expr_p) = 1;
6882 ret = GS_ALL_DONE;
6883 break;
6885 case STATEMENT_LIST:
6886 ret = gimplify_statement_list (expr_p, pre_p);
6887 break;
6889 case WITH_SIZE_EXPR:
6891 gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6892 post_p == &internal_post ? NULL : post_p,
6893 gimple_test_f, fallback);
6894 gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
6895 is_gimple_val, fb_rvalue);
6897 break;
6899 case VAR_DECL:
6900 case PARM_DECL:
6901 ret = gimplify_var_or_parm_decl (expr_p);
6902 break;
6904 case RESULT_DECL:
6905 /* When within an OpenMP context, notice uses of variables. */
6906 if (gimplify_omp_ctxp)
6907 omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
6908 ret = GS_ALL_DONE;
6909 break;
6911 case SSA_NAME:
6912 /* Allow callbacks into the gimplifier during optimization. */
6913 ret = GS_ALL_DONE;
6914 break;
6916 case OMP_PARALLEL:
6917 gimplify_omp_parallel (expr_p, pre_p);
6918 ret = GS_ALL_DONE;
6919 break;
6921 case OMP_TASK:
6922 gimplify_omp_task (expr_p, pre_p);
6923 ret = GS_ALL_DONE;
6924 break;
6926 case OMP_FOR:
6927 ret = gimplify_omp_for (expr_p, pre_p);
6928 break;
6930 case OMP_SECTIONS:
6931 case OMP_SINGLE:
6932 gimplify_omp_workshare (expr_p, pre_p);
6933 ret = GS_ALL_DONE;
6934 break;
6936 case OMP_SECTION:
6937 case OMP_MASTER:
6938 case OMP_ORDERED:
6939 case OMP_CRITICAL:
6941 gimple_seq body = NULL;
6942 gimple g;
6944 gimplify_and_add (OMP_BODY (*expr_p), &body);
6945 switch (TREE_CODE (*expr_p))
6947 case OMP_SECTION:
6948 g = gimple_build_omp_section (body);
6949 break;
6950 case OMP_MASTER:
6951 g = gimple_build_omp_master (body);
6952 break;
6953 case OMP_ORDERED:
6954 g = gimple_build_omp_ordered (body);
6955 break;
6956 case OMP_CRITICAL:
6957 g = gimple_build_omp_critical (body,
6958 OMP_CRITICAL_NAME (*expr_p));
6959 break;
6960 default:
6961 gcc_unreachable ();
6963 gimplify_seq_add_stmt (pre_p, g);
6964 ret = GS_ALL_DONE;
6965 break;
6968 case OMP_ATOMIC:
6969 ret = gimplify_omp_atomic (expr_p, pre_p);
6970 break;
6972 case POINTER_PLUS_EXPR:
6973 /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
6974 The second is gimple immediate saving a need for extra statement.
6976 if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6977 && (tmp = maybe_fold_offset_to_address
6978 (EXPR_LOCATION (*expr_p),
6979 TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
6980 TREE_TYPE (*expr_p))))
6982 *expr_p = tmp;
6983 break;
6985 /* Convert (void *)&a + 4 into (void *)&a[1]. */
6986 if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
6987 && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6988 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
6989 0),0)))
6990 && (tmp = maybe_fold_offset_to_address
6991 (EXPR_LOCATION (*expr_p),
6992 TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
6993 TREE_OPERAND (*expr_p, 1),
6994 TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
6995 0)))))
6997 *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
6998 break;
7000 /* FALLTHRU */
7002 default:
7003 switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
7005 case tcc_comparison:
7006 /* Handle comparison of objects of non scalar mode aggregates
7007 with a call to memcmp. It would be nice to only have to do
7008 this for variable-sized objects, but then we'd have to allow
7009 the same nest of reference nodes we allow for MODIFY_EXPR and
7010 that's too complex.
7012 Compare scalar mode aggregates as scalar mode values. Using
7013 memcmp for them would be very inefficient at best, and is
7014 plain wrong if bitfields are involved. */
7016 tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
7018 if (!AGGREGATE_TYPE_P (type))
7019 goto expr_2;
7020 else if (TYPE_MODE (type) != BLKmode)
7021 ret = gimplify_scalar_mode_aggregate_compare (expr_p);
7022 else
7023 ret = gimplify_variable_sized_compare (expr_p);
7025 break;
7028 /* If *EXPR_P does not need to be special-cased, handle it
7029 according to its class. */
7030 case tcc_unary:
7031 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7032 post_p, is_gimple_val, fb_rvalue);
7033 break;
7035 case tcc_binary:
7036 expr_2:
7038 enum gimplify_status r0, r1;
7040 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7041 post_p, is_gimple_val, fb_rvalue);
7042 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7043 post_p, is_gimple_val, fb_rvalue);
7045 ret = MIN (r0, r1);
7046 break;
7049 case tcc_declaration:
7050 case tcc_constant:
7051 ret = GS_ALL_DONE;
7052 goto dont_recalculate;
7054 default:
7055 gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
7056 || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
7057 || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
7058 goto expr_2;
7061 recalculate_side_effects (*expr_p);
7063 dont_recalculate:
7064 break;
7067 /* If we replaced *expr_p, gimplify again. */
7068 if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
7069 ret = GS_ALL_DONE;
7071 while (ret == GS_OK);
7073 /* If we encountered an error_mark somewhere nested inside, either
7074 stub out the statement or propagate the error back out. */
7075 if (ret == GS_ERROR)
7077 if (is_statement)
7078 *expr_p = NULL;
7079 goto out;
7082 /* This was only valid as a return value from the langhook, which
7083 we handled. Make sure it doesn't escape from any other context. */
7084 gcc_assert (ret != GS_UNHANDLED);
7086 if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
7088 /* We aren't looking for a value, and we don't have a valid
7089 statement. If it doesn't have side-effects, throw it away. */
7090 if (!TREE_SIDE_EFFECTS (*expr_p))
7091 *expr_p = NULL;
7092 else if (!TREE_THIS_VOLATILE (*expr_p))
7094 /* This is probably a _REF that contains something nested that
7095 has side effects. Recurse through the operands to find it. */
7096 enum tree_code code = TREE_CODE (*expr_p);
7098 switch (code)
7100 case COMPONENT_REF:
7101 case REALPART_EXPR:
7102 case IMAGPART_EXPR:
7103 case VIEW_CONVERT_EXPR:
7104 gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7105 gimple_test_f, fallback);
7106 break;
7108 case ARRAY_REF:
7109 case ARRAY_RANGE_REF:
7110 gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7111 gimple_test_f, fallback);
7112 gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
7113 gimple_test_f, fallback);
7114 break;
7116 default:
7117 /* Anything else with side-effects must be converted to
7118 a valid statement before we get here. */
7119 gcc_unreachable ();
7122 *expr_p = NULL;
7124 else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
7125 && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
7127 /* Historically, the compiler has treated a bare reference
7128 to a non-BLKmode volatile lvalue as forcing a load. */
7129 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
7131 /* Normally, we do not want to create a temporary for a
7132 TREE_ADDRESSABLE type because such a type should not be
7133 copied by bitwise-assignment. However, we make an
7134 exception here, as all we are doing here is ensuring that
7135 we read the bytes that make up the type. We use
7136 create_tmp_var_raw because create_tmp_var will abort when
7137 given a TREE_ADDRESSABLE type. */
7138 tree tmp = create_tmp_var_raw (type, "vol");
7139 gimple_add_tmp_var (tmp);
7140 gimplify_assign (tmp, *expr_p, pre_p);
7141 *expr_p = NULL;
7143 else
7144 /* We can't do anything useful with a volatile reference to
7145 an incomplete type, so just throw it away. Likewise for
7146 a BLKmode type, since any implicit inner load should
7147 already have been turned into an explicit one by the
7148 gimplification process. */
7149 *expr_p = NULL;
7152 /* If we are gimplifying at the statement level, we're done. Tack
7153 everything together and return. */
7154 if (fallback == fb_none || is_statement)
7156 /* Since *EXPR_P has been converted into a GIMPLE tuple, clear
7157 it out for GC to reclaim it. */
7158 *expr_p = NULL_TREE;
7160 if (!gimple_seq_empty_p (internal_pre)
7161 || !gimple_seq_empty_p (internal_post))
7163 gimplify_seq_add_seq (&internal_pre, internal_post);
7164 gimplify_seq_add_seq (pre_p, internal_pre);
7167 /* The result of gimplifying *EXPR_P is going to be the last few
7168 statements in *PRE_P and *POST_P. Add location information
7169 to all the statements that were added by the gimplification
7170 helpers. */
7171 if (!gimple_seq_empty_p (*pre_p))
7172 annotate_all_with_location_after (*pre_p, pre_last_gsi, input_location);
7174 if (!gimple_seq_empty_p (*post_p))
7175 annotate_all_with_location_after (*post_p, post_last_gsi,
7176 input_location);
7178 goto out;
7181 #ifdef ENABLE_GIMPLE_CHECKING
7182 if (*expr_p)
7184 enum tree_code code = TREE_CODE (*expr_p);
7185 /* These expressions should already be in gimple IR form. */
7186 gcc_assert (code != MODIFY_EXPR
7187 && code != ASM_EXPR
7188 && code != BIND_EXPR
7189 && code != CATCH_EXPR
7190 && (code != COND_EXPR || gimplify_ctxp->allow_rhs_cond_expr)
7191 && code != EH_FILTER_EXPR
7192 && code != GOTO_EXPR
7193 && code != LABEL_EXPR
7194 && code != LOOP_EXPR
7195 && code != RESX_EXPR
7196 && code != SWITCH_EXPR
7197 && code != TRY_FINALLY_EXPR
7198 && code != OMP_CRITICAL
7199 && code != OMP_FOR
7200 && code != OMP_MASTER
7201 && code != OMP_ORDERED
7202 && code != OMP_PARALLEL
7203 && code != OMP_SECTIONS
7204 && code != OMP_SECTION
7205 && code != OMP_SINGLE);
7207 #endif
7209 /* Otherwise we're gimplifying a subexpression, so the resulting
7210 value is interesting. If it's a valid operand that matches
7211 GIMPLE_TEST_F, we're done. Unless we are handling some
7212 post-effects internally; if that's the case, we need to copy into
7213 a temporary before adding the post-effects to POST_P. */
7214 if (gimple_seq_empty_p (internal_post) && (*gimple_test_f) (*expr_p))
7215 goto out;
7217 /* Otherwise, we need to create a new temporary for the gimplified
7218 expression. */
7220 /* We can't return an lvalue if we have an internal postqueue. The
7221 object the lvalue refers to would (probably) be modified by the
7222 postqueue; we need to copy the value out first, which means an
7223 rvalue. */
7224 if ((fallback & fb_lvalue)
7225 && gimple_seq_empty_p (internal_post)
7226 && is_gimple_addressable (*expr_p))
7228 /* An lvalue will do. Take the address of the expression, store it
7229 in a temporary, and replace the expression with an INDIRECT_REF of
7230 that temporary. */
7231 tmp = build_fold_addr_expr (*expr_p);
7232 gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
7233 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
7235 else if ((fallback & fb_rvalue) && is_gimple_reg_rhs_or_call (*expr_p))
7237 /* An rvalue will do. Assign the gimplified expression into a
7238 new temporary TMP and replace the original expression with
7239 TMP. First, make sure that the expression has a type so that
7240 it can be assigned into a temporary. */
7241 gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
7243 if (!gimple_seq_empty_p (internal_post) || (fallback & fb_lvalue))
7244 /* The postqueue might change the value of the expression between
7245 the initialization and use of the temporary, so we can't use a
7246 formal temp. FIXME do we care? */
7248 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
7249 if (TREE_CODE (TREE_TYPE (*expr_p)) == COMPLEX_TYPE
7250 || TREE_CODE (TREE_TYPE (*expr_p)) == VECTOR_TYPE)
7251 DECL_GIMPLE_REG_P (*expr_p) = 1;
7253 else
7254 *expr_p = get_formal_tmp_var (*expr_p, pre_p);
7256 else
7258 #ifdef ENABLE_GIMPLE_CHECKING
7259 if (!(fallback & fb_mayfail))
7261 fprintf (stderr, "gimplification failed:\n");
7262 print_generic_expr (stderr, *expr_p, 0);
7263 debug_tree (*expr_p);
7264 internal_error ("gimplification failed");
7266 #endif
7267 gcc_assert (fallback & fb_mayfail);
7269 /* If this is an asm statement, and the user asked for the
7270 impossible, don't die. Fail and let gimplify_asm_expr
7271 issue an error. */
7272 ret = GS_ERROR;
7273 goto out;
7276 /* Make sure the temporary matches our predicate. */
7277 gcc_assert ((*gimple_test_f) (*expr_p));
7279 if (!gimple_seq_empty_p (internal_post))
7281 annotate_all_with_location (internal_post, input_location);
7282 gimplify_seq_add_seq (pre_p, internal_post);
7285 out:
7286 input_location = saved_location;
7287 return ret;
7290 /* Look through TYPE for variable-sized objects and gimplify each such
7291 size that we find. Add to LIST_P any statements generated. */
7293 void
7294 gimplify_type_sizes (tree type, gimple_seq *list_p)
7296 tree field, t;
7298 if (type == NULL || type == error_mark_node)
7299 return;
7301 /* We first do the main variant, then copy into any other variants. */
7302 type = TYPE_MAIN_VARIANT (type);
7304 /* Avoid infinite recursion. */
7305 if (TYPE_SIZES_GIMPLIFIED (type))
7306 return;
7308 TYPE_SIZES_GIMPLIFIED (type) = 1;
7310 switch (TREE_CODE (type))
7312 case INTEGER_TYPE:
7313 case ENUMERAL_TYPE:
7314 case BOOLEAN_TYPE:
7315 case REAL_TYPE:
7316 case FIXED_POINT_TYPE:
7317 gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
7318 gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
7320 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7322 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
7323 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
7325 break;
7327 case ARRAY_TYPE:
7328 /* These types may not have declarations, so handle them here. */
7329 gimplify_type_sizes (TREE_TYPE (type), list_p);
7330 gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
7331 /* When not optimizing, ensure VLA bounds aren't removed. */
7332 if (!optimize
7333 && TYPE_DOMAIN (type)
7334 && INTEGRAL_TYPE_P (TYPE_DOMAIN (type)))
7336 t = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
7337 if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7338 DECL_IGNORED_P (t) = 0;
7339 t = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
7340 if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7341 DECL_IGNORED_P (t) = 0;
7343 break;
7345 case RECORD_TYPE:
7346 case UNION_TYPE:
7347 case QUAL_UNION_TYPE:
7348 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
7349 if (TREE_CODE (field) == FIELD_DECL)
7351 gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
7352 gimplify_one_sizepos (&DECL_SIZE (field), list_p);
7353 gimplify_one_sizepos (&DECL_SIZE_UNIT (field), list_p);
7354 gimplify_type_sizes (TREE_TYPE (field), list_p);
7356 break;
7358 case POINTER_TYPE:
7359 case REFERENCE_TYPE:
7360 /* We used to recurse on the pointed-to type here, which turned out to
7361 be incorrect because its definition might refer to variables not
7362 yet initialized at this point if a forward declaration is involved.
7364 It was actually useful for anonymous pointed-to types to ensure
7365 that the sizes evaluation dominates every possible later use of the
7366 values. Restricting to such types here would be safe since there
7367 is no possible forward declaration around, but would introduce an
7368 undesirable middle-end semantic to anonymity. We then defer to
7369 front-ends the responsibility of ensuring that the sizes are
7370 evaluated both early and late enough, e.g. by attaching artificial
7371 type declarations to the tree. */
7372 break;
7374 default:
7375 break;
7378 gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
7379 gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
7381 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7383 TYPE_SIZE (t) = TYPE_SIZE (type);
7384 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
7385 TYPE_SIZES_GIMPLIFIED (t) = 1;
7389 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
7390 a size or position, has had all of its SAVE_EXPRs evaluated.
7391 We add any required statements to *STMT_P. */
7393 void
7394 gimplify_one_sizepos (tree *expr_p, gimple_seq *stmt_p)
7396 tree type, expr = *expr_p;
7398 /* We don't do anything if the value isn't there, is constant, or contains
7399 A PLACEHOLDER_EXPR. We also don't want to do anything if it's already
7400 a VAR_DECL. If it's a VAR_DECL from another function, the gimplifier
7401 will want to replace it with a new variable, but that will cause problems
7402 if this type is from outside the function. It's OK to have that here. */
7403 if (expr == NULL_TREE || TREE_CONSTANT (expr)
7404 || TREE_CODE (expr) == VAR_DECL
7405 || CONTAINS_PLACEHOLDER_P (expr))
7406 return;
7408 type = TREE_TYPE (expr);
7409 *expr_p = unshare_expr (expr);
7411 gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
7412 expr = *expr_p;
7414 /* Verify that we've an exact type match with the original expression.
7415 In particular, we do not wish to drop a "sizetype" in favour of a
7416 type of similar dimensions. We don't want to pollute the generic
7417 type-stripping code with this knowledge because it doesn't matter
7418 for the bulk of GENERIC/GIMPLE. It only matters that TYPE_SIZE_UNIT
7419 and friends retain their "sizetype-ness". */
7420 if (TREE_TYPE (expr) != type
7421 && TREE_CODE (type) == INTEGER_TYPE
7422 && TYPE_IS_SIZETYPE (type))
7424 tree tmp;
7425 gimple stmt;
7427 *expr_p = create_tmp_var (type, NULL);
7428 tmp = build1 (NOP_EXPR, type, expr);
7429 stmt = gimplify_assign (*expr_p, tmp, stmt_p);
7430 if (EXPR_HAS_LOCATION (expr))
7431 gimple_set_location (stmt, *EXPR_LOCUS (expr));
7432 else
7433 gimple_set_location (stmt, input_location);
7438 /* Gimplify the body of statements pointed to by BODY_P and return a
7439 GIMPLE_BIND containing the sequence of GIMPLE statements
7440 corresponding to BODY_P. FNDECL is the function decl containing
7441 *BODY_P. */
7443 gimple
7444 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
7446 location_t saved_location = input_location;
7447 gimple_seq parm_stmts, seq;
7448 gimple outer_bind;
7449 struct gimplify_ctx gctx;
7451 timevar_push (TV_TREE_GIMPLIFY);
7453 /* Initialize for optimize_insn_for_s{ize,peed}_p possibly called during
7454 gimplification. */
7455 default_rtl_profile ();
7457 gcc_assert (gimplify_ctxp == NULL);
7458 push_gimplify_context (&gctx);
7460 /* Unshare most shared trees in the body and in that of any nested functions.
7461 It would seem we don't have to do this for nested functions because
7462 they are supposed to be output and then the outer function gimplified
7463 first, but the g++ front end doesn't always do it that way. */
7464 unshare_body (body_p, fndecl);
7465 unvisit_body (body_p, fndecl);
7467 if (cgraph_node (fndecl)->origin)
7468 nonlocal_vlas = pointer_set_create ();
7470 /* Make sure input_location isn't set to something weird. */
7471 input_location = DECL_SOURCE_LOCATION (fndecl);
7473 /* Resolve callee-copies. This has to be done before processing
7474 the body so that DECL_VALUE_EXPR gets processed correctly. */
7475 parm_stmts = (do_parms) ? gimplify_parameters () : NULL;
7477 /* Gimplify the function's body. */
7478 seq = NULL;
7479 gimplify_stmt (body_p, &seq);
7480 outer_bind = gimple_seq_first_stmt (seq);
7481 if (!outer_bind)
7483 outer_bind = gimple_build_nop ();
7484 gimplify_seq_add_stmt (&seq, outer_bind);
7487 /* The body must contain exactly one statement, a GIMPLE_BIND. If this is
7488 not the case, wrap everything in a GIMPLE_BIND to make it so. */
7489 if (gimple_code (outer_bind) == GIMPLE_BIND
7490 && gimple_seq_first (seq) == gimple_seq_last (seq))
7492 else
7493 outer_bind = gimple_build_bind (NULL_TREE, seq, NULL);
7495 *body_p = NULL_TREE;
7497 /* If we had callee-copies statements, insert them at the beginning
7498 of the function. */
7499 if (!gimple_seq_empty_p (parm_stmts))
7501 gimplify_seq_add_seq (&parm_stmts, gimple_bind_body (outer_bind));
7502 gimple_bind_set_body (outer_bind, parm_stmts);
7505 if (nonlocal_vlas)
7507 pointer_set_destroy (nonlocal_vlas);
7508 nonlocal_vlas = NULL;
7511 pop_gimplify_context (outer_bind);
7512 gcc_assert (gimplify_ctxp == NULL);
7514 #ifdef ENABLE_TYPES_CHECKING
7515 if (!errorcount && !sorrycount)
7516 verify_types_in_gimple_seq (gimple_bind_body (outer_bind));
7517 #endif
7519 timevar_pop (TV_TREE_GIMPLIFY);
7520 input_location = saved_location;
7522 return outer_bind;
7525 /* Entry point to the gimplification pass. FNDECL is the FUNCTION_DECL
7526 node for the function we want to gimplify.
7528 Returns the sequence of GIMPLE statements corresponding to the body
7529 of FNDECL. */
7531 void
7532 gimplify_function_tree (tree fndecl)
7534 tree oldfn, parm, ret;
7535 gimple_seq seq;
7536 gimple bind;
7538 oldfn = current_function_decl;
7539 current_function_decl = fndecl;
7540 if (DECL_STRUCT_FUNCTION (fndecl))
7541 push_cfun (DECL_STRUCT_FUNCTION (fndecl));
7542 else
7543 push_struct_function (fndecl);
7545 for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
7547 /* Preliminarily mark non-addressed complex variables as eligible
7548 for promotion to gimple registers. We'll transform their uses
7549 as we find them. */
7550 if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
7551 || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
7552 && !TREE_THIS_VOLATILE (parm)
7553 && !needs_to_live_in_memory (parm))
7554 DECL_GIMPLE_REG_P (parm) = 1;
7557 ret = DECL_RESULT (fndecl);
7558 if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
7559 || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
7560 && !needs_to_live_in_memory (ret))
7561 DECL_GIMPLE_REG_P (ret) = 1;
7563 bind = gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
7565 /* The tree body of the function is no longer needed, replace it
7566 with the new GIMPLE body. */
7567 seq = gimple_seq_alloc ();
7568 gimple_seq_add_stmt (&seq, bind);
7569 gimple_set_body (fndecl, seq);
7571 /* If we're instrumenting function entry/exit, then prepend the call to
7572 the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
7573 catch the exit hook. */
7574 /* ??? Add some way to ignore exceptions for this TFE. */
7575 if (flag_instrument_function_entry_exit
7576 && !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
7577 && !flag_instrument_functions_exclude_p (fndecl))
7579 tree x;
7580 gimple new_bind;
7581 gimple tf;
7582 gimple_seq cleanup = NULL, body = NULL;
7584 x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
7585 gimplify_seq_add_stmt (&cleanup, gimple_build_call (x, 0));
7586 tf = gimple_build_try (seq, cleanup, GIMPLE_TRY_FINALLY);
7588 x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
7589 gimplify_seq_add_stmt (&body, gimple_build_call (x, 0));
7590 gimplify_seq_add_stmt (&body, tf);
7591 new_bind = gimple_build_bind (NULL, body, gimple_bind_block (bind));
7592 /* Clear the block for BIND, since it is no longer directly inside
7593 the function, but within a try block. */
7594 gimple_bind_set_block (bind, NULL);
7596 /* Replace the current function body with the body
7597 wrapped in the try/finally TF. */
7598 seq = gimple_seq_alloc ();
7599 gimple_seq_add_stmt (&seq, new_bind);
7600 gimple_set_body (fndecl, seq);
7603 DECL_SAVED_TREE (fndecl) = NULL_TREE;
7605 current_function_decl = oldfn;
7606 pop_cfun ();
7610 /* Some transformations like inlining may invalidate the GIMPLE form
7611 for operands. This function traverses all the operands in STMT and
7612 gimplifies anything that is not a valid gimple operand. Any new
7613 GIMPLE statements are inserted before *GSI_P. */
7615 void
7616 gimple_regimplify_operands (gimple stmt, gimple_stmt_iterator *gsi_p)
7618 size_t i, num_ops;
7619 tree orig_lhs = NULL_TREE, lhs, t;
7620 gimple_seq pre = NULL;
7621 gimple post_stmt = NULL;
7622 struct gimplify_ctx gctx;
7624 push_gimplify_context (&gctx);
7625 gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7627 switch (gimple_code (stmt))
7629 case GIMPLE_COND:
7630 gimplify_expr (gimple_cond_lhs_ptr (stmt), &pre, NULL,
7631 is_gimple_val, fb_rvalue);
7632 gimplify_expr (gimple_cond_rhs_ptr (stmt), &pre, NULL,
7633 is_gimple_val, fb_rvalue);
7634 break;
7635 case GIMPLE_SWITCH:
7636 gimplify_expr (gimple_switch_index_ptr (stmt), &pre, NULL,
7637 is_gimple_val, fb_rvalue);
7638 break;
7639 case GIMPLE_OMP_ATOMIC_LOAD:
7640 gimplify_expr (gimple_omp_atomic_load_rhs_ptr (stmt), &pre, NULL,
7641 is_gimple_val, fb_rvalue);
7642 break;
7643 case GIMPLE_ASM:
7645 size_t i, noutputs = gimple_asm_noutputs (stmt);
7646 const char *constraint, **oconstraints;
7647 bool allows_mem, allows_reg, is_inout;
7649 oconstraints
7650 = (const char **) alloca ((noutputs) * sizeof (const char *));
7651 for (i = 0; i < noutputs; i++)
7653 tree op = gimple_asm_output_op (stmt, i);
7654 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7655 oconstraints[i] = constraint;
7656 parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
7657 &allows_reg, &is_inout);
7658 gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7659 is_inout ? is_gimple_min_lval : is_gimple_lvalue,
7660 fb_lvalue | fb_mayfail);
7662 for (i = 0; i < gimple_asm_ninputs (stmt); i++)
7664 tree op = gimple_asm_input_op (stmt, i);
7665 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7666 parse_input_constraint (&constraint, 0, 0, noutputs, 0,
7667 oconstraints, &allows_mem, &allows_reg);
7668 if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (op))) && allows_mem)
7669 allows_reg = 0;
7670 if (!allows_reg && allows_mem)
7671 gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7672 is_gimple_lvalue, fb_lvalue | fb_mayfail);
7673 else
7674 gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7675 is_gimple_asm_val, fb_rvalue);
7678 break;
7679 default:
7680 /* NOTE: We start gimplifying operands from last to first to
7681 make sure that side-effects on the RHS of calls, assignments
7682 and ASMs are executed before the LHS. The ordering is not
7683 important for other statements. */
7684 num_ops = gimple_num_ops (stmt);
7685 orig_lhs = gimple_get_lhs (stmt);
7686 for (i = num_ops; i > 0; i--)
7688 tree op = gimple_op (stmt, i - 1);
7689 if (op == NULL_TREE)
7690 continue;
7691 if (i == 1 && (is_gimple_call (stmt) || is_gimple_assign (stmt)))
7692 gimplify_expr (&op, &pre, NULL, is_gimple_lvalue, fb_lvalue);
7693 else if (i == 2
7694 && is_gimple_assign (stmt)
7695 && num_ops == 2
7696 && get_gimple_rhs_class (gimple_expr_code (stmt))
7697 == GIMPLE_SINGLE_RHS)
7698 gimplify_expr (&op, &pre, NULL,
7699 rhs_predicate_for (gimple_assign_lhs (stmt)),
7700 fb_rvalue);
7701 else if (i == 2 && is_gimple_call (stmt))
7703 if (TREE_CODE (op) == FUNCTION_DECL)
7704 continue;
7705 gimplify_expr (&op, &pre, NULL, is_gimple_call_addr, fb_rvalue);
7707 else
7708 gimplify_expr (&op, &pre, NULL, is_gimple_val, fb_rvalue);
7709 gimple_set_op (stmt, i - 1, op);
7712 lhs = gimple_get_lhs (stmt);
7713 /* If the LHS changed it in a way that requires a simple RHS,
7714 create temporary. */
7715 if (lhs && !is_gimple_reg (lhs))
7717 bool need_temp = false;
7719 if (is_gimple_assign (stmt)
7720 && num_ops == 2
7721 && get_gimple_rhs_class (gimple_expr_code (stmt))
7722 == GIMPLE_SINGLE_RHS)
7723 gimplify_expr (gimple_assign_rhs1_ptr (stmt), &pre, NULL,
7724 rhs_predicate_for (gimple_assign_lhs (stmt)),
7725 fb_rvalue);
7726 else if (is_gimple_reg (lhs))
7728 if (is_gimple_reg_type (TREE_TYPE (lhs)))
7730 if (is_gimple_call (stmt))
7732 i = gimple_call_flags (stmt);
7733 if ((i & ECF_LOOPING_CONST_OR_PURE)
7734 || !(i & (ECF_CONST | ECF_PURE)))
7735 need_temp = true;
7737 if (stmt_can_throw_internal (stmt))
7738 need_temp = true;
7741 else
7743 if (is_gimple_reg_type (TREE_TYPE (lhs)))
7744 need_temp = true;
7745 else if (TYPE_MODE (TREE_TYPE (lhs)) != BLKmode)
7747 if (is_gimple_call (stmt))
7749 tree fndecl = gimple_call_fndecl (stmt);
7751 if (!aggregate_value_p (TREE_TYPE (lhs), fndecl)
7752 && !(fndecl && DECL_RESULT (fndecl)
7753 && DECL_BY_REFERENCE (DECL_RESULT (fndecl))))
7754 need_temp = true;
7756 else
7757 need_temp = true;
7760 if (need_temp)
7762 tree temp = create_tmp_var (TREE_TYPE (lhs), NULL);
7764 if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE
7765 || TREE_CODE (TREE_TYPE (lhs)) == VECTOR_TYPE)
7766 DECL_GIMPLE_REG_P (temp) = 1;
7767 if (TREE_CODE (orig_lhs) == SSA_NAME)
7768 orig_lhs = SSA_NAME_VAR (orig_lhs);
7769 if (TREE_CODE (orig_lhs) == VAR_DECL
7770 && DECL_BASED_ON_RESTRICT_P (orig_lhs))
7772 DECL_BASED_ON_RESTRICT_P (temp) = 1;
7773 SET_DECL_RESTRICT_BASE (temp,
7774 DECL_GET_RESTRICT_BASE (orig_lhs));
7777 if (gimple_in_ssa_p (cfun))
7778 temp = make_ssa_name (temp, NULL);
7779 gimple_set_lhs (stmt, temp);
7780 post_stmt = gimple_build_assign (lhs, temp);
7781 if (TREE_CODE (lhs) == SSA_NAME)
7782 SSA_NAME_DEF_STMT (lhs) = post_stmt;
7785 break;
7788 if (gimple_referenced_vars (cfun))
7789 for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7790 add_referenced_var (t);
7792 if (!gimple_seq_empty_p (pre))
7794 if (gimple_in_ssa_p (cfun))
7796 gimple_stmt_iterator i;
7798 for (i = gsi_start (pre); !gsi_end_p (i); gsi_next (&i))
7799 mark_symbols_for_renaming (gsi_stmt (i));
7801 gsi_insert_seq_before (gsi_p, pre, GSI_SAME_STMT);
7803 if (post_stmt)
7804 gsi_insert_after (gsi_p, post_stmt, GSI_NEW_STMT);
7806 pop_gimplify_context (NULL);
7810 /* Expands EXPR to list of gimple statements STMTS. If SIMPLE is true,
7811 force the result to be either ssa_name or an invariant, otherwise
7812 just force it to be a rhs expression. If VAR is not NULL, make the
7813 base variable of the final destination be VAR if suitable. */
7815 tree
7816 force_gimple_operand (tree expr, gimple_seq *stmts, bool simple, tree var)
7818 tree t;
7819 enum gimplify_status ret;
7820 gimple_predicate gimple_test_f;
7821 struct gimplify_ctx gctx;
7823 *stmts = NULL;
7825 if (is_gimple_val (expr))
7826 return expr;
7828 gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
7830 push_gimplify_context (&gctx);
7831 gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7832 gimplify_ctxp->allow_rhs_cond_expr = true;
7834 if (var)
7835 expr = build2 (MODIFY_EXPR, TREE_TYPE (var), var, expr);
7837 if (TREE_CODE (expr) != MODIFY_EXPR
7838 && TREE_TYPE (expr) == void_type_node)
7840 gimplify_and_add (expr, stmts);
7841 expr = NULL_TREE;
7843 else
7845 ret = gimplify_expr (&expr, stmts, NULL, gimple_test_f, fb_rvalue);
7846 gcc_assert (ret != GS_ERROR);
7849 if (gimple_referenced_vars (cfun))
7850 for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7851 add_referenced_var (t);
7853 pop_gimplify_context (NULL);
7855 return expr;
7858 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR. If
7859 some statements are produced, emits them at GSI. If BEFORE is true.
7860 the statements are appended before GSI, otherwise they are appended after
7861 it. M specifies the way GSI moves after insertion (GSI_SAME_STMT or
7862 GSI_CONTINUE_LINKING are the usual values). */
7864 tree
7865 force_gimple_operand_gsi (gimple_stmt_iterator *gsi, tree expr,
7866 bool simple_p, tree var, bool before,
7867 enum gsi_iterator_update m)
7869 gimple_seq stmts;
7871 expr = force_gimple_operand (expr, &stmts, simple_p, var);
7873 if (!gimple_seq_empty_p (stmts))
7875 if (gimple_in_ssa_p (cfun))
7877 gimple_stmt_iterator i;
7879 for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
7880 mark_symbols_for_renaming (gsi_stmt (i));
7883 if (before)
7884 gsi_insert_seq_before (gsi, stmts, m);
7885 else
7886 gsi_insert_seq_after (gsi, stmts, m);
7889 return expr;
7892 #include "gt-gimplify.h"