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