OSDN Git Service

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