OSDN Git Service

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