OSDN Git Service

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