OSDN Git Service

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