OSDN Git Service

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