OSDN Git Service

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