OSDN Git Service

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