OSDN Git Service

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