OSDN Git Service

* c-decl.c (declspecs_add_type): Don't pedwarn for _Complex in
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-operands.c
1 /* SSA operands management for trees.
2    Copyright (C) 2003, 2004 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "flags.h"
27 #include "function.h"
28 #include "diagnostic.h"
29 #include "errors.h"
30 #include "tree-flow.h"
31 #include "tree-inline.h"
32 #include "tree-pass.h"
33 #include "ggc.h"
34 #include "timevar.h"
35 #include "cgraph.h"
36
37 #include "langhooks.h"
38
39 /* This file contains the code required to manage the operands cache of the 
40    SSA optimizer.  For every stmt, we maintain an operand cache in the stmt 
41    annotation.  This cache contains operands that will be of interest to 
42    optimizers and other passes wishing to manipulate the IL. 
43
44    The operand type are broken up into REAL and VIRTUAL operands.  The real 
45    operands are represented as pointers into the stmt's operand tree.  Thus 
46    any manipulation of the real operands will be reflected in the actual tree.
47    Virtual operands are represented solely in the cache, although the base 
48    variable for the SSA_NAME may, or may not occur in the stmt's tree.  
49    Manipulation of the virtual operands will not be reflected in the stmt tree.
50
51    The routines in this file are concerned with creating this operand cache 
52    from a stmt tree.
53
54    get_stmt_operands() in the primary entry point. 
55
56    The operand tree is the parsed by the various get_* routines which look 
57    through the stmt tree for the occurrence of operands which may be of 
58    interest, and calls are made to the append_* routines whenever one is 
59    found.  There are 5 of these routines, each representing one of the 
60    5 types of operands. Defs, Uses, Virtual Uses, Virtual May Defs, and 
61    Virtual Must Defs.
62
63    The append_* routines check for duplication, and simply keep a list of 
64    unique objects for each operand type in the build_* extendable vectors.
65
66    Once the stmt tree is completely parsed, the finalize_ssa_operands() 
67    routine is called, which proceeds to perform the finalization routine 
68    on each of the 5 operand vectors which have been built up.
69
70    If the stmt had a previous operand cache, the finalization routines 
71    attempt to match up the new operands with the old ones.  If its a perfect 
72    match, the old vector is simply reused.  If it isn't a perfect match, then 
73    a new vector is created and the new operands are placed there.  For 
74    virtual operands, if the previous cache had SSA_NAME version of a 
75    variable, and that same variable occurs in the same operands cache, then 
76    the new cache vector will also get the same SSA_NAME.
77
78   i.e., if a stmt had a VUSE of 'a_5', and 'a' occurs in the new operand 
79   vector for VUSE, then the new vector will also be modified such that 
80   it contains 'a_5' rather than 'a'.
81
82 */
83
84
85 /* Flags to describe operand properties in get_stmt_operands and helpers.  */
86
87 /* By default, operands are loaded.  */
88 #define opf_none        0
89
90 /* Operand is the target of an assignment expression or a 
91    call-clobbered variable  */
92 #define opf_is_def      (1 << 0)
93
94 /* Operand is the target of an assignment expression.  */
95 #define opf_kill_def    (1 << 1)
96
97 /* No virtual operands should be created in the expression.  This is used
98    when traversing ADDR_EXPR nodes which have different semantics than
99    other expressions.  Inside an ADDR_EXPR node, the only operands that we
100    need to consider are indices into arrays.  For instance, &a.b[i] should
101    generate a USE of 'i' but it should not generate a VUSE for 'a' nor a
102    VUSE for 'b'.  */
103 #define opf_no_vops     (1 << 2)
104
105 /* Array for building all the def operands.  */
106 static GTY (()) varray_type build_defs;
107
108 /* Array for building all the use operands.  */
109 static GTY (()) varray_type build_uses;
110
111 /* Array for building all the v_may_def operands.  */
112 static GTY (()) varray_type build_v_may_defs;
113
114 /* Array for building all the vuse operands.  */
115 static GTY (()) varray_type build_vuses;
116
117 /* Array for building all the v_must_def operands.  */
118 static GTY (()) varray_type build_v_must_defs;
119
120
121 #ifdef ENABLE_CHECKING
122 /* Used to make sure operand construction is working on the proper stmt.  */
123 tree check_build_stmt;
124 #endif
125
126 def_operand_p NULL_DEF_OPERAND_P = { NULL };
127 use_operand_p NULL_USE_OPERAND_P = { NULL };
128
129 static void note_addressable (tree, stmt_ann_t);
130 static void get_expr_operands (tree, tree *, int);
131 static void get_asm_expr_operands (tree);
132 static void get_indirect_ref_operands (tree, tree, int);
133 static void get_call_expr_operands (tree, tree);
134 static inline void append_def (tree *);
135 static inline void append_use (tree *);
136 static void append_v_may_def (tree);
137 static void append_v_must_def (tree);
138 static void add_call_clobber_ops (tree, tree);
139 static void add_call_read_ops (tree, tree);
140 static void add_stmt_operand (tree *, tree, int);
141
142 /* Return a vector of contiguous memory for NUM def operands.  */
143
144 static inline def_optype
145 allocate_def_optype (unsigned num)
146 {
147   def_optype def_ops;
148   unsigned size;
149   size = sizeof (struct def_optype_d) + sizeof (tree *) * (num - 1);
150   def_ops =  ggc_alloc (size);
151   def_ops->num_defs = num;
152   return def_ops;
153 }
154
155
156 /* Return a vector of contiguous memory for NUM use operands.  */
157
158 static inline use_optype
159 allocate_use_optype (unsigned num)
160 {
161   use_optype use_ops;
162   unsigned size;
163   size = sizeof (struct use_optype_d) + sizeof (tree *) * (num - 1);
164   use_ops =  ggc_alloc (size);
165   use_ops->num_uses = num;
166   return use_ops;
167 }
168
169
170 /* Return a vector of contiguous memory for NUM v_may_def operands.  */
171
172 static inline v_may_def_optype
173 allocate_v_may_def_optype (unsigned num)
174 {
175   v_may_def_optype v_may_def_ops;
176   unsigned size;
177   size = sizeof (struct v_may_def_optype_d) 
178            + sizeof (v_may_def_operand_type_t) * (num - 1);
179   v_may_def_ops =  ggc_alloc (size);
180   v_may_def_ops->num_v_may_defs = num;
181   return v_may_def_ops;
182 }
183
184
185 /* Return a vector of contiguous memory for NUM v_use operands.  */
186
187 static inline vuse_optype
188 allocate_vuse_optype (unsigned num)
189 {
190   vuse_optype vuse_ops;
191   unsigned size;
192   size = sizeof (struct vuse_optype_d) + sizeof (tree) * (num - 1);
193   vuse_ops =  ggc_alloc (size);
194   vuse_ops->num_vuses = num;
195   return vuse_ops;
196 }
197
198
199 /* Return a vector of contiguous memory for NUM v_must_def operands.  */
200
201 static inline v_must_def_optype
202 allocate_v_must_def_optype (unsigned num)
203 {
204   v_must_def_optype v_must_def_ops;
205   unsigned size;
206   size = sizeof (struct v_must_def_optype_d) + sizeof (tree) * (num - 1);
207   v_must_def_ops =  ggc_alloc (size);
208   v_must_def_ops->num_v_must_defs = num;
209   return v_must_def_ops;
210 }
211
212
213 /* Free memory for USES.  */
214
215 static inline void
216 free_uses (use_optype *uses)
217 {
218   if (*uses)
219     {
220       ggc_free (*uses);
221       *uses = NULL;
222     }
223 }
224
225
226 /* Free memory for DEFS.  */
227
228 static inline void
229 free_defs (def_optype *defs)
230 {
231   if (*defs)
232     {
233       ggc_free (*defs);
234       *defs = NULL;
235     }
236 }
237
238
239 /* Free memory for VUSES.  */
240
241 static inline void
242 free_vuses (vuse_optype *vuses)
243 {
244   if (*vuses)
245     {
246       ggc_free (*vuses);
247       *vuses = NULL;
248     }
249 }
250
251
252 /* Free memory for V_MAY_DEFS.  */
253
254 static inline void
255 free_v_may_defs (v_may_def_optype *v_may_defs)
256 {
257   if (*v_may_defs)
258     {
259       ggc_free (*v_may_defs);
260       *v_may_defs = NULL;
261     }
262 }
263
264
265 /* Free memory for V_MUST_DEFS.  */
266
267 static inline void
268 free_v_must_defs (v_must_def_optype *v_must_defs)
269 {
270   if (*v_must_defs)
271     {
272       ggc_free (*v_must_defs);
273       *v_must_defs = NULL;
274     }
275 }
276
277
278 /* Initialize the operand cache routines.  */
279
280 void
281 init_ssa_operands (void)
282 {
283   VARRAY_TREE_PTR_INIT (build_defs, 5, "build defs");
284   VARRAY_TREE_PTR_INIT (build_uses, 10, "build uses");
285   VARRAY_TREE_INIT (build_v_may_defs, 10, "build v_may_defs");
286   VARRAY_TREE_INIT (build_vuses, 10, "build vuses");
287   VARRAY_TREE_INIT (build_v_must_defs, 10, "build v_must_defs");
288 }
289
290
291 /* Dispose of anything required by the operand routines.  */
292
293 void
294 fini_ssa_operands (void)
295 {
296   ggc_free (build_defs);
297   ggc_free (build_uses);
298   ggc_free (build_v_may_defs);
299   ggc_free (build_vuses);
300   ggc_free (build_v_must_defs);
301   build_defs = NULL;
302   build_uses = NULL;
303   build_v_may_defs = NULL;
304   build_vuses = NULL;
305   build_v_must_defs = NULL;
306 }
307
308
309 /* All the finalize_ssa_* routines do the work required to turn the build_
310    VARRAY into an operand_vector of the appropriate type.  The original vector,
311    if any, is passed in for comparison and virtual SSA_NAME reuse.  If the
312    old vector is reused, the pointer passed in is set to NULL so that 
313    the memory is not freed when the old operands are freed.  */
314
315 /* Return a new def operand vector for STMT, comparing to OLD_OPS_P.  */
316
317 static def_optype
318 finalize_ssa_defs (def_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED)
319 {
320   unsigned num, x;
321   def_optype def_ops, old_ops;
322   bool build_diff;
323
324   num = VARRAY_ACTIVE_SIZE (build_defs);
325   if (num == 0)
326     return NULL;
327
328   /* There should only be a single real definition per assignment.  */
329   gcc_assert (TREE_CODE (stmt) != MODIFY_EXPR || num <= 1);
330
331   old_ops = *old_ops_p;
332
333   /* Compare old vector and new array.  */
334   build_diff = true;
335   if (old_ops && old_ops->num_defs == num)
336     {
337       build_diff = false;
338       for (x = 0; x < num; x++)
339         if (old_ops->defs[x].def != VARRAY_TREE_PTR (build_defs, x))
340           {
341             build_diff = true;
342             break;
343           }
344     }
345
346   if (!build_diff)
347     {
348       def_ops = old_ops;
349       *old_ops_p = NULL;
350     }
351   else
352     {
353       def_ops = allocate_def_optype (num);
354       for (x = 0; x < num ; x++)
355         def_ops->defs[x].def = VARRAY_TREE_PTR (build_defs, x);
356     }
357
358   VARRAY_POP_ALL (build_defs);
359
360   return def_ops;
361 }
362
363
364 /* Return a new use operand vector for STMT, comparing to OLD_OPS_P.  */
365
366 static use_optype
367 finalize_ssa_uses (use_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED)
368 {
369   unsigned num, x;
370   use_optype use_ops, old_ops;
371   bool build_diff;
372
373   num = VARRAY_ACTIVE_SIZE (build_uses);
374   if (num == 0)
375     return NULL;
376
377 #ifdef ENABLE_CHECKING
378   {
379     unsigned x;
380     /* If the pointer to the operand is the statement itself, something is
381        wrong.  It means that we are pointing to a local variable (the 
382        initial call to get_stmt_operands does not pass a pointer to a 
383        statement).  */
384     for (x = 0; x < num; x++)
385       gcc_assert (*(VARRAY_TREE_PTR (build_uses, x)) != stmt);
386   }
387 #endif
388   old_ops = *old_ops_p;
389
390   /* Check if the old vector and the new array are the same.  */
391   build_diff = true;
392   if (old_ops && old_ops->num_uses == num)
393     {
394       build_diff = false;
395       for (x = 0; x < num; x++)
396         if (old_ops->uses[x].use != VARRAY_TREE_PTR (build_uses, x))
397           {
398             build_diff = true;
399             break;
400           }
401     }
402
403   if (!build_diff)
404     {
405       use_ops = old_ops;
406       *old_ops_p = NULL;
407     }
408   else
409     {
410       use_ops = allocate_use_optype (num);
411       for (x = 0; x < num ; x++)
412         use_ops->uses[x].use = VARRAY_TREE_PTR (build_uses, x);
413     }
414   VARRAY_POP_ALL (build_uses);
415
416   return use_ops;
417 }
418
419
420 /* Return a new v_may_def operand vector for STMT, comparing to OLD_OPS_P.  */
421
422 static v_may_def_optype
423 finalize_ssa_v_may_defs (v_may_def_optype *old_ops_p)
424 {
425   unsigned num, x, i, old_num;
426   v_may_def_optype v_may_def_ops, old_ops;
427   tree result, var;
428   bool build_diff;
429
430   num = VARRAY_ACTIVE_SIZE (build_v_may_defs);
431   if (num == 0)
432     return NULL;
433
434   old_ops = *old_ops_p;
435
436   /* Check if the old vector and the new array are the same.  */
437   build_diff = true;
438   if (old_ops && old_ops->num_v_may_defs == num)
439     {
440       old_num = num;
441       build_diff = false;
442       for (x = 0; x < num; x++)
443         {
444           var = old_ops->v_may_defs[x].def;
445           if (TREE_CODE (var) == SSA_NAME)
446             var = SSA_NAME_VAR (var);
447           if (var != VARRAY_TREE (build_v_may_defs, x))
448             {
449               build_diff = true;
450               break;
451             }
452         }
453     }
454   else
455     old_num = (old_ops ? old_ops->num_v_may_defs : 0);
456
457   if (!build_diff)
458     {
459       v_may_def_ops = old_ops;
460       *old_ops_p = NULL;
461     }
462   else
463     {
464       v_may_def_ops = allocate_v_may_def_optype (num);
465       for (x = 0; x < num; x++)
466         {
467           var = VARRAY_TREE (build_v_may_defs, x);
468           /* Look for VAR in the old operands vector.  */
469           for (i = 0; i < old_num; i++)
470             {
471               result = old_ops->v_may_defs[i].def;
472               if (TREE_CODE (result) == SSA_NAME)
473                 result = SSA_NAME_VAR (result);
474               if (result == var)
475                 {
476                   v_may_def_ops->v_may_defs[x] = old_ops->v_may_defs[i];
477                   break;
478                 }
479             }
480           if (i == old_num)
481             {
482               v_may_def_ops->v_may_defs[x].def = var;
483               v_may_def_ops->v_may_defs[x].use = var;
484             }
485         }
486     }
487
488   /* Empty the V_MAY_DEF build vector after VUSES have been processed.  */
489
490   return v_may_def_ops;
491 }
492
493
494 /* Return a new vuse operand vector, comparing to OLD_OPS_P.  */
495
496 static vuse_optype
497 finalize_ssa_vuses (vuse_optype *old_ops_p)
498 {
499   unsigned num, x, i, num_v_may_defs, old_num;
500   vuse_optype vuse_ops, old_ops;
501   bool build_diff;
502
503   num = VARRAY_ACTIVE_SIZE (build_vuses);
504   if (num == 0)
505     {
506       VARRAY_POP_ALL (build_v_may_defs);
507       return NULL;
508     }
509
510   /* Remove superfluous VUSE operands.  If the statement already has a
511    V_MAY_DEF operation for a variable 'a', then a VUSE for 'a' is not
512    needed because V_MAY_DEFs imply a VUSE of the variable.  For instance,
513    suppose that variable 'a' is aliased:
514
515               # VUSE <a_2>
516               # a_3 = V_MAY_DEF <a_2>
517               a = a + 1;
518
519   The VUSE <a_2> is superfluous because it is implied by the V_MAY_DEF
520   operation.  */
521
522   num_v_may_defs = VARRAY_ACTIVE_SIZE (build_v_may_defs);
523
524   if (num_v_may_defs > 0)
525     {
526       size_t i, j;
527       tree vuse;
528       for (i = 0; i < VARRAY_ACTIVE_SIZE (build_vuses); i++)
529         {
530           vuse = VARRAY_TREE (build_vuses, i);
531           for (j = 0; j < num_v_may_defs; j++)
532             {
533               if (vuse == VARRAY_TREE (build_v_may_defs, j))
534                 break;
535             }
536
537           /* If we found a useless VUSE operand, remove it from the
538              operand array by replacing it with the last active element
539              in the operand array (unless the useless VUSE was the
540              last operand, in which case we simply remove it.  */
541           if (j != num_v_may_defs)
542             {
543               if (i != VARRAY_ACTIVE_SIZE (build_vuses) - 1)
544                 {
545                   VARRAY_TREE (build_vuses, i)
546                     = VARRAY_TREE (build_vuses,
547                                    VARRAY_ACTIVE_SIZE (build_vuses) - 1);
548                 }
549               VARRAY_POP (build_vuses);
550
551               /* We want to rescan the element at this index, unless
552                  this was the last element, in which case the loop
553                  terminates.  */
554               i--;
555             }
556         }
557     }
558
559   num = VARRAY_ACTIVE_SIZE (build_vuses);
560   /* We could have reduced the size to zero now, however.  */
561   if (num == 0)
562     {
563       VARRAY_POP_ALL (build_v_may_defs);
564       return NULL;
565     }
566
567   old_ops = *old_ops_p;
568
569   /* Determine whether vuses is the same as the old vector.  */
570   build_diff = true;
571   if (old_ops && old_ops->num_vuses == num)
572     {
573       old_num = num;
574       build_diff = false;
575       for (x = 0; x < num ; x++)
576         {
577           tree v;
578           v = old_ops->vuses[x];
579           if (TREE_CODE (v) == SSA_NAME)
580             v = SSA_NAME_VAR (v);
581           if (v != VARRAY_TREE (build_vuses, x))
582             {
583               build_diff = true;
584               break;
585             }
586         }
587     }
588   else
589     old_num = (old_ops ? old_ops->num_vuses : 0);
590
591   if (!build_diff)
592     {
593       vuse_ops = old_ops;
594       *old_ops_p = NULL;
595     }
596   else
597     {
598       vuse_ops = allocate_vuse_optype (num);
599       for (x = 0; x < num; x++)
600         {
601           tree result, var = VARRAY_TREE (build_vuses, x);
602           /* Look for VAR in the old vector, and use that SSA_NAME.  */
603           for (i = 0; i < old_num; i++)
604             {
605               result = old_ops->vuses[i];
606               if (TREE_CODE (result) == SSA_NAME)
607                 result = SSA_NAME_VAR (result);
608               if (result == var)
609                 {
610                   vuse_ops->vuses[x] = old_ops->vuses[i];
611                   break;
612                 }
613             }
614           if (i == old_num)
615             vuse_ops->vuses[x] = var;
616         }
617     }
618
619   /* The v_may_def build vector wasn't freed because we needed it here.
620      Free it now with the vuses build vector.  */
621   VARRAY_POP_ALL (build_vuses);
622   VARRAY_POP_ALL (build_v_may_defs);
623
624   return vuse_ops;
625 }
626
627 /* Return a new v_must_def operand vector for STMT, comparing to OLD_OPS_P.  */
628
629 static v_must_def_optype
630 finalize_ssa_v_must_defs (v_must_def_optype *old_ops_p, 
631                           tree stmt ATTRIBUTE_UNUSED)
632 {
633   unsigned num, x, i, old_num = 0;
634   v_must_def_optype v_must_def_ops, old_ops;
635   bool build_diff;
636
637   num = VARRAY_ACTIVE_SIZE (build_v_must_defs);
638   if (num == 0)
639     return NULL;
640
641   /* There should only be a single V_MUST_DEF per assignment.  */
642   gcc_assert (TREE_CODE (stmt) != MODIFY_EXPR || num <= 1);
643
644   old_ops = *old_ops_p;
645
646   /* Check if the old vector and the new array are the same.  */
647   build_diff = true;
648   if (old_ops && old_ops->num_v_must_defs == num)
649     {
650       old_num = num;
651       build_diff = false;
652       for (x = 0; x < num; x++)
653         {
654           tree var = old_ops->v_must_defs[x];
655           if (TREE_CODE (var) == SSA_NAME)
656             var = SSA_NAME_VAR (var);
657           if (var != VARRAY_TREE (build_v_must_defs, x))
658             {
659               build_diff = true;
660               break;
661             }
662         }
663     }
664   else
665     old_num = (old_ops ? old_ops->num_v_must_defs : 0);
666
667   if (!build_diff)
668     {
669       v_must_def_ops = old_ops;
670       *old_ops_p = NULL;
671     }
672   else
673     {
674       v_must_def_ops = allocate_v_must_def_optype (num);
675       for (x = 0; x < num ; x++)
676         {
677           tree result, var = VARRAY_TREE (build_v_must_defs, x);
678           /* Look for VAR in the original vector.  */
679           for (i = 0; i < old_num; i++)
680             {
681               result = old_ops->v_must_defs[i];
682               if (TREE_CODE (result) == SSA_NAME)
683                 result = SSA_NAME_VAR (result);
684               if (result == var)
685                 {
686                   v_must_def_ops->v_must_defs[x] = old_ops->v_must_defs[i];
687                   break;
688                 }
689             }
690           if (i == old_num)
691             v_must_def_ops->v_must_defs[x] = var;
692         }
693     }
694   VARRAY_POP_ALL (build_v_must_defs);
695
696   return v_must_def_ops;
697 }
698
699
700 /* Finalize all the build vectors, fill the new ones into INFO.  */
701
702 static inline void
703 finalize_ssa_stmt_operands (tree stmt, stmt_operands_p old_ops, 
704                             stmt_operands_p new_ops)
705 {
706   new_ops->def_ops = finalize_ssa_defs (&(old_ops->def_ops), stmt);
707   new_ops->use_ops = finalize_ssa_uses (&(old_ops->use_ops), stmt);
708   new_ops->v_must_def_ops 
709     = finalize_ssa_v_must_defs (&(old_ops->v_must_def_ops), stmt);
710   new_ops->v_may_def_ops = finalize_ssa_v_may_defs (&(old_ops->v_may_def_ops));
711   new_ops->vuse_ops = finalize_ssa_vuses (&(old_ops->vuse_ops));
712 }
713
714
715 /* Start the process of building up operands vectors in INFO.  */
716
717 static inline void
718 start_ssa_stmt_operands (void)
719 {
720   gcc_assert (VARRAY_ACTIVE_SIZE (build_defs) == 0);
721   gcc_assert (VARRAY_ACTIVE_SIZE (build_uses) == 0);
722   gcc_assert (VARRAY_ACTIVE_SIZE (build_vuses) == 0);
723   gcc_assert (VARRAY_ACTIVE_SIZE (build_v_may_defs) == 0);
724   gcc_assert (VARRAY_ACTIVE_SIZE (build_v_must_defs) == 0);
725 }
726
727
728 /* Add DEF_P to the list of pointers to operands.  */
729
730 static inline void
731 append_def (tree *def_p)
732 {
733   VARRAY_PUSH_TREE_PTR (build_defs, def_p);
734 }
735
736
737 /* Add USE_P to the list of pointers to operands.  */
738
739 static inline void
740 append_use (tree *use_p)
741 {
742   VARRAY_PUSH_TREE_PTR (build_uses, use_p);
743 }
744
745
746 /* Add a new virtual may def for variable VAR to the build array.  */
747
748 static inline void
749 append_v_may_def (tree var)
750 {
751   unsigned i;
752
753   /* Don't allow duplicate entries.  */
754   for (i = 0; i < VARRAY_ACTIVE_SIZE (build_v_may_defs); i++)
755     if (var == VARRAY_TREE (build_v_may_defs, i))
756       return;
757
758   VARRAY_PUSH_TREE (build_v_may_defs, var);
759 }
760
761
762 /* Add VAR to the list of virtual uses.  */
763
764 static inline void
765 append_vuse (tree var)
766 {
767   size_t i;
768
769   /* Don't allow duplicate entries.  */
770   for (i = 0; i < VARRAY_ACTIVE_SIZE (build_vuses); i++)
771     if (var == VARRAY_TREE (build_vuses, i))
772       return;
773
774   VARRAY_PUSH_TREE (build_vuses, var);
775 }
776
777
778 /* Add VAR to the list of virtual must definitions for INFO.  */
779
780 static inline void
781 append_v_must_def (tree var)
782 {
783   unsigned i;
784
785   /* Don't allow duplicate entries.  */
786   for (i = 0; i < VARRAY_ACTIVE_SIZE (build_v_must_defs); i++)
787     if (var == VARRAY_TREE (build_v_must_defs, i))
788       return;
789
790   VARRAY_PUSH_TREE (build_v_must_defs, var);
791 }
792
793 /* Create an operands cache for STMT, returning it in NEW_OPS. OLD_OPS are the
794    original operands, and if ANN is non-null, appropriate stmt flags are set
795    in the stmt's annotation.  Note that some fields in old_ops may 
796    change to NULL, although none of the memory they originally pointed to 
797    will be destroyed.  It is appropriate to call free_stmt_operands() on 
798    the value returned in old_ops.
799
800    The rationale for this: Certain optimizations wish to examine the difference
801    between new_ops and old_ops after processing.  If a set of operands don't
802    change, new_ops will simply assume the pointer in old_ops, and the old_ops
803    pointer will be set to NULL, indicating no memory needs to be cleared.  
804    Usage might appear something like:
805
806        old_ops_copy = old_ops = stmt_ann(stmt)->operands;
807        build_ssa_operands (stmt, NULL, &old_ops, &new_ops);
808           <* compare old_ops_copy and new_ops *>
809        free_ssa_operands (old_ops);                                     */
810
811 void
812 build_ssa_operands (tree stmt, stmt_ann_t ann, stmt_operands_p old_ops, 
813                     stmt_operands_p new_ops)
814 {
815   enum tree_code code;
816   tree_ann_t saved_ann = stmt->common.ann;
817   
818   /* Replace stmt's annotation with the one passed in for the duration
819      of the operand building process.  This allows "fake" stmts to be built
820      and not be included in other data structures which can be built here.  */
821   stmt->common.ann = (tree_ann_t) ann;
822   
823   /* Initially assume that the statement has no volatile operands, nor
824      makes aliased loads or stores.  */
825   if (ann)
826     {
827       ann->has_volatile_ops = false;
828       ann->makes_aliased_stores = false;
829       ann->makes_aliased_loads = false;
830     }
831
832   start_ssa_stmt_operands ();
833
834   code = TREE_CODE (stmt);
835   switch (code)
836     {
837     case MODIFY_EXPR:
838       get_expr_operands (stmt, &TREE_OPERAND (stmt, 1), opf_none);
839       if (TREE_CODE (TREE_OPERAND (stmt, 0)) == ARRAY_REF 
840           || TREE_CODE (TREE_OPERAND (stmt, 0)) == ARRAY_RANGE_REF
841           || TREE_CODE (TREE_OPERAND (stmt, 0)) == COMPONENT_REF
842           || TREE_CODE (TREE_OPERAND (stmt, 0)) == REALPART_EXPR
843           || TREE_CODE (TREE_OPERAND (stmt, 0)) == IMAGPART_EXPR
844           /* Use a V_MAY_DEF if the RHS might throw, as the LHS won't be
845              modified in that case.  FIXME we should represent somehow
846              that it is killed on the fallthrough path.  */
847           || tree_could_throw_p (TREE_OPERAND (stmt, 1)))
848         get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), opf_is_def);
849       else
850         get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), 
851                            opf_is_def | opf_kill_def);
852       break;
853
854     case COND_EXPR:
855       get_expr_operands (stmt, &COND_EXPR_COND (stmt), opf_none);
856       break;
857
858     case SWITCH_EXPR:
859       get_expr_operands (stmt, &SWITCH_COND (stmt), opf_none);
860       break;
861
862     case ASM_EXPR:
863       get_asm_expr_operands (stmt);
864       break;
865
866     case RETURN_EXPR:
867       get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), opf_none);
868       break;
869
870     case GOTO_EXPR:
871       get_expr_operands (stmt, &GOTO_DESTINATION (stmt), opf_none);
872       break;
873
874     case LABEL_EXPR:
875       get_expr_operands (stmt, &LABEL_EXPR_LABEL (stmt), opf_none);
876       break;
877
878       /* These nodes contain no variable references.  */
879     case BIND_EXPR:
880     case CASE_LABEL_EXPR:
881     case TRY_CATCH_EXPR:
882     case TRY_FINALLY_EXPR:
883     case EH_FILTER_EXPR:
884     case CATCH_EXPR:
885     case RESX_EXPR:
886       break;
887
888     default:
889       /* Notice that if get_expr_operands tries to use &STMT as the operand
890          pointer (which may only happen for USE operands), we will abort in
891          append_use.  This default will handle statements like empty
892          statements, or CALL_EXPRs that may appear on the RHS of a statement
893          or as statements themselves.  */
894       get_expr_operands (stmt, &stmt, opf_none);
895       break;
896     }
897
898   finalize_ssa_stmt_operands (stmt, old_ops, new_ops);
899   stmt->common.ann = saved_ann;
900 }
901
902
903 /* Free any operands vectors in OPS.  */
904
905 static void 
906 free_ssa_operands (stmt_operands_p ops)
907 {
908   if (ops->def_ops)
909     free_defs (&(ops->def_ops));
910   if (ops->use_ops)
911     free_uses (&(ops->use_ops));
912   if (ops->vuse_ops)
913     free_vuses (&(ops->vuse_ops));
914   if (ops->v_may_def_ops)
915     free_v_may_defs (&(ops->v_may_def_ops));
916   if (ops->v_must_def_ops)
917     free_v_must_defs (&(ops->v_must_def_ops));
918 }
919
920
921 /* Get the operands of statement STMT.  Note that repeated calls to
922    get_stmt_operands for the same statement will do nothing until the
923    statement is marked modified by a call to modify_stmt().  */
924
925 void
926 get_stmt_operands (tree stmt)
927 {
928   stmt_ann_t ann;
929   stmt_operands_t old_operands;
930
931   /* The optimizers cannot handle statements that are nothing but a
932      _DECL.  This indicates a bug in the gimplifier.  */
933   gcc_assert (!SSA_VAR_P (stmt));
934
935   /* Ignore error statements.  */
936   if (TREE_CODE (stmt) == ERROR_MARK)
937     return;
938
939   ann = get_stmt_ann (stmt);
940
941   /* If the statement has not been modified, the operands are still valid.  */
942   if (!ann->modified)
943     return;
944
945   timevar_push (TV_TREE_OPS);
946
947   old_operands = ann->operands;
948   memset (&(ann->operands), 0, sizeof (stmt_operands_t));
949
950   build_ssa_operands (stmt, ann, &old_operands, &(ann->operands));
951   free_ssa_operands (&old_operands);
952
953   /* Clear the modified bit for STMT.  Subsequent calls to
954      get_stmt_operands for this statement will do nothing until the
955      statement is marked modified by a call to modify_stmt().  */
956   ann->modified = 0;
957
958   timevar_pop (TV_TREE_OPS);
959 }
960
961
962 /* Recursively scan the expression pointed by EXPR_P in statement referred to
963    by INFO.  FLAGS is one of the OPF_* constants modifying how to interpret the
964    operands found.  */
965
966 static void
967 get_expr_operands (tree stmt, tree *expr_p, int flags)
968 {
969   enum tree_code code;
970   enum tree_code_class class;
971   tree expr = *expr_p;
972
973   if (expr == NULL || expr == error_mark_node)
974     return;
975
976   code = TREE_CODE (expr);
977   class = TREE_CODE_CLASS (code);
978
979   switch (code)
980     {
981     case ADDR_EXPR:
982       /* We could have the address of a component, array member,
983          etc which has interesting variable references.  */
984       /* Taking the address of a variable does not represent a
985          reference to it, but the fact that the stmt takes its address will be
986          of interest to some passes (e.g. alias resolution).  */
987       add_stmt_operand (expr_p, stmt, 0);
988
989       /* If the address is invariant, there may be no interesting variable
990          references inside.  */
991       if (is_gimple_min_invariant (expr))
992         return;
993
994       /* There should be no VUSEs created, since the referenced objects are
995          not really accessed.  The only operands that we should find here
996          are ARRAY_REF indices which will always be real operands (GIMPLE
997          does not allow non-registers as array indices).  */
998       flags |= opf_no_vops;
999
1000       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1001       return;
1002
1003     case SSA_NAME:
1004     case VAR_DECL:
1005     case PARM_DECL:
1006     case RESULT_DECL:
1007       /* If we found a variable, add it to DEFS or USES depending
1008          on the operand flags.  */
1009       add_stmt_operand (expr_p, stmt, flags);
1010       return;
1011
1012     case MISALIGNED_INDIRECT_REF:
1013       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
1014       /* fall through */
1015
1016     case ALIGN_INDIRECT_REF:
1017     case INDIRECT_REF:
1018       get_indirect_ref_operands (stmt, expr, flags);
1019       return;
1020
1021     case ARRAY_REF:
1022     case ARRAY_RANGE_REF:
1023       /* Treat array references as references to the virtual variable
1024          representing the array.  The virtual variable for an ARRAY_REF
1025          is the VAR_DECL for the array.  */
1026
1027       /* Add the virtual variable for the ARRAY_REF to VDEFS or VUSES
1028          according to the value of IS_DEF.  Recurse if the LHS of the
1029          ARRAY_REF node is not a regular variable.  */
1030       if (SSA_VAR_P (TREE_OPERAND (expr, 0)))
1031         add_stmt_operand (expr_p, stmt, flags);
1032       else
1033         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1034
1035       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
1036       get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
1037       get_expr_operands (stmt, &TREE_OPERAND (expr, 3), opf_none);
1038       return;
1039
1040     case COMPONENT_REF:
1041     case REALPART_EXPR:
1042     case IMAGPART_EXPR:
1043       /* Similarly to arrays, references to compound variables (complex
1044          types and structures/unions) are globbed.
1045
1046          FIXME: This means that
1047
1048                         a.x = 6;
1049                         a.y = 7;
1050                         foo (a.x, a.y);
1051
1052          will not be constant propagated because the two partial
1053          definitions to 'a' will kill each other.  Note that SRA may be
1054          able to fix this problem if 'a' can be scalarized.  */
1055
1056       /* If the LHS of the compound reference is not a regular variable,
1057          recurse to keep looking for more operands in the subexpression.  */
1058       if (SSA_VAR_P (TREE_OPERAND (expr, 0)))
1059         add_stmt_operand (expr_p, stmt, flags);
1060       else
1061         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1062
1063       if (code == COMPONENT_REF)
1064         get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
1065       return;
1066
1067     case WITH_SIZE_EXPR:
1068       /* WITH_SIZE_EXPR is a pass-through reference to its first argument,
1069          and an rvalue reference to its second argument.  */
1070       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
1071       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1072       return;
1073
1074     case CALL_EXPR:
1075       get_call_expr_operands (stmt, expr);
1076       return;
1077
1078     case COND_EXPR:
1079     case VEC_COND_EXPR:
1080       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_none);
1081       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
1082       get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
1083       return;
1084
1085     case MODIFY_EXPR:
1086       {
1087         int subflags;
1088         tree op;
1089
1090         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
1091
1092         op = TREE_OPERAND (expr, 0);
1093         if (TREE_CODE (op) == WITH_SIZE_EXPR)
1094           op = TREE_OPERAND (expr, 0);
1095         if (TREE_CODE (op) == ARRAY_REF
1096             || TREE_CODE (op) == ARRAY_RANGE_REF
1097             || TREE_CODE (op) == COMPONENT_REF
1098             || TREE_CODE (op) == REALPART_EXPR
1099             || TREE_CODE (op) == IMAGPART_EXPR)
1100           subflags = opf_is_def;
1101         else
1102           subflags = opf_is_def | opf_kill_def;
1103
1104         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), subflags);
1105         return;
1106       }
1107
1108     case CONSTRUCTOR:
1109       {
1110         /* General aggregate CONSTRUCTORs have been decomposed, but they
1111            are still in use as the COMPLEX_EXPR equivalent for vectors.  */
1112
1113         tree t;
1114         for (t = TREE_OPERAND (expr, 0); t ; t = TREE_CHAIN (t))
1115           get_expr_operands (stmt, &TREE_VALUE (t), opf_none);
1116
1117         return;
1118       }
1119
1120     case TRUTH_NOT_EXPR:
1121     case BIT_FIELD_REF:
1122     case VIEW_CONVERT_EXPR:
1123     do_unary:
1124       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1125       return;
1126
1127     case TRUTH_AND_EXPR:
1128     case TRUTH_OR_EXPR:
1129     case TRUTH_XOR_EXPR:
1130     case COMPOUND_EXPR:
1131     case OBJ_TYPE_REF:
1132     do_binary:
1133       {
1134         tree op0 = TREE_OPERAND (expr, 0);
1135         tree op1 = TREE_OPERAND (expr, 1);
1136
1137         /* If it would be profitable to swap the operands, then do so to
1138            canonicalize the statement, enabling better optimization.
1139
1140            By placing canonicalization of such expressions here we
1141            transparently keep statements in canonical form, even
1142            when the statement is modified.  */
1143         if (tree_swap_operands_p (op0, op1, false))
1144           {
1145             /* For relationals we need to swap the operands
1146                and change the code.  */
1147             if (code == LT_EXPR
1148                 || code == GT_EXPR
1149                 || code == LE_EXPR
1150                 || code == GE_EXPR)
1151               {
1152                 TREE_SET_CODE (expr, swap_tree_comparison (code));
1153                 TREE_OPERAND (expr, 0) = op1;
1154                 TREE_OPERAND (expr, 1) = op0;
1155               }
1156           
1157             /* For a commutative operator we can just swap the operands.  */
1158             else if (commutative_tree_code (code))
1159               {
1160                 TREE_OPERAND (expr, 0) = op1;
1161                 TREE_OPERAND (expr, 1) = op0;
1162               }
1163           }
1164
1165         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1166         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
1167         return;
1168       }
1169
1170     case REALIGN_LOAD_EXPR:
1171       {
1172         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1173         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
1174         get_expr_operands (stmt, &TREE_OPERAND (expr, 2), flags);
1175         return;
1176       }
1177
1178     case BLOCK:
1179     case FUNCTION_DECL:
1180     case EXC_PTR_EXPR:
1181     case FILTER_EXPR:
1182     case LABEL_DECL:
1183       /* Expressions that make no memory references.  */
1184       return;
1185
1186     default:
1187       if (class == tcc_unary)
1188         goto do_unary;
1189       if (class == tcc_binary || class == tcc_comparison)
1190         goto do_binary;
1191       if (class == tcc_constant || class == tcc_type)
1192         return;
1193     }
1194
1195   /* If we get here, something has gone wrong.  */
1196 #ifdef ENABLE_CHECKING
1197   fprintf (stderr, "unhandled expression in get_expr_operands():\n");
1198   debug_tree (expr);
1199   fputs ("\n", stderr);
1200   internal_error ("internal error");
1201 #endif
1202   gcc_unreachable ();
1203 }
1204
1205
1206 /* Scan operands in the ASM_EXPR stmt referred to in INFO.  */
1207
1208 static void
1209 get_asm_expr_operands (tree stmt)
1210 {
1211   stmt_ann_t s_ann = stmt_ann (stmt);
1212   int noutputs = list_length (ASM_OUTPUTS (stmt));
1213   const char **oconstraints
1214     = (const char **) alloca ((noutputs) * sizeof (const char *));
1215   int i;
1216   tree link;
1217   const char *constraint;
1218   bool allows_mem, allows_reg, is_inout;
1219
1220   for (i=0, link = ASM_OUTPUTS (stmt); link; ++i, link = TREE_CHAIN (link))
1221     {
1222       oconstraints[i] = constraint
1223         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1224       parse_output_constraint (&constraint, i, 0, 0,
1225           &allows_mem, &allows_reg, &is_inout);
1226
1227       /* This should have been split in gimplify_asm_expr.  */
1228       gcc_assert (!allows_reg || !is_inout);
1229
1230       /* Memory operands are addressable.  Note that STMT needs the
1231          address of this operand.  */
1232       if (!allows_reg && allows_mem)
1233         {
1234           tree t = get_base_address (TREE_VALUE (link));
1235           if (t && DECL_P (t))
1236             note_addressable (t, s_ann);
1237         }
1238
1239       get_expr_operands (stmt, &TREE_VALUE (link), opf_is_def);
1240     }
1241
1242   for (link = ASM_INPUTS (stmt); link; link = TREE_CHAIN (link))
1243     {
1244       constraint
1245         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1246       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
1247           oconstraints, &allows_mem, &allows_reg);
1248
1249       /* Memory operands are addressable.  Note that STMT needs the
1250          address of this operand.  */
1251       if (!allows_reg && allows_mem)
1252         {
1253           tree t = get_base_address (TREE_VALUE (link));
1254           if (t && DECL_P (t))
1255             note_addressable (t, s_ann);
1256         }
1257
1258       get_expr_operands (stmt, &TREE_VALUE (link), 0);
1259     }
1260
1261
1262   /* Clobber memory for asm ("" : : : "memory");  */
1263   for (link = ASM_CLOBBERS (stmt); link; link = TREE_CHAIN (link))
1264     if (strcmp (TREE_STRING_POINTER (TREE_VALUE (link)), "memory") == 0)
1265       {
1266         size_t i;
1267         bitmap_iterator bi;
1268
1269         /* Clobber all call-clobbered variables (or .GLOBAL_VAR if we
1270            decided to group them).  */
1271         if (global_var)
1272           add_stmt_operand (&global_var, stmt, opf_is_def);
1273         else
1274           EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
1275               {
1276                 tree var = referenced_var (i);
1277                 add_stmt_operand (&var, stmt, opf_is_def);
1278               }
1279
1280         /* Now clobber all addressables.  */
1281         EXECUTE_IF_SET_IN_BITMAP (addressable_vars, 0, i, bi)
1282             {
1283               tree var = referenced_var (i);
1284               add_stmt_operand (&var, stmt, opf_is_def);
1285             }
1286
1287         break;
1288       }
1289 }
1290
1291 /* A subroutine of get_expr_operands to handle INDIRECT_REF,
1292    ALIGN_INDIRECT_REF and MISALIGNED_INDIRECT_REF.  */
1293
1294 static void
1295 get_indirect_ref_operands (tree stmt, tree expr, int flags)
1296 {
1297   tree *pptr = &TREE_OPERAND (expr, 0);
1298   tree ptr = *pptr;
1299   stmt_ann_t ann = stmt_ann (stmt);
1300
1301   /* Stores into INDIRECT_REF operands are never killing definitions.  */
1302   flags &= ~opf_kill_def;
1303
1304   if (REF_ORIGINAL (expr))
1305     {
1306       enum tree_code ocode = TREE_CODE (REF_ORIGINAL (expr));
1307
1308       /* If we originally accessed part of a structure, we do it still.  */
1309       if (ocode == ARRAY_REF
1310           || ocode == COMPONENT_REF
1311           || ocode == REALPART_EXPR
1312           || ocode == IMAGPART_EXPR)
1313         flags &= ~opf_kill_def;
1314     }
1315
1316   if (SSA_VAR_P (ptr))
1317     {
1318       struct ptr_info_def *pi = NULL;
1319
1320       /* If PTR has flow-sensitive points-to information, use it.  */
1321       if (TREE_CODE (ptr) == SSA_NAME
1322           && (pi = SSA_NAME_PTR_INFO (ptr)) != NULL
1323           && pi->name_mem_tag)
1324         {
1325           /* PTR has its own memory tag.  Use it.  */
1326           add_stmt_operand (&pi->name_mem_tag, stmt, flags);
1327         }
1328       else
1329         {
1330           /* If PTR is not an SSA_NAME or it doesn't have a name
1331              tag, use its type memory tag.  */
1332           var_ann_t ann;
1333
1334           /* If we are emitting debugging dumps, display a warning if
1335              PTR is an SSA_NAME with no flow-sensitive alias
1336              information.  That means that we may need to compute
1337              aliasing again.  */
1338           if (dump_file
1339               && TREE_CODE (ptr) == SSA_NAME
1340               && pi == NULL)
1341             {
1342               fprintf (dump_file,
1343                   "NOTE: no flow-sensitive alias info for ");
1344               print_generic_expr (dump_file, ptr, dump_flags);
1345               fprintf (dump_file, " in ");
1346               print_generic_stmt (dump_file, stmt, dump_flags);
1347             }
1348
1349           if (TREE_CODE (ptr) == SSA_NAME)
1350             ptr = SSA_NAME_VAR (ptr);
1351           ann = var_ann (ptr);
1352           if (ann->type_mem_tag)
1353             add_stmt_operand (&ann->type_mem_tag, stmt, flags);
1354         }
1355     }
1356
1357   /* If a constant is used as a pointer, we can't generate a real
1358      operand for it but we mark the statement volatile to prevent
1359      optimizations from messing things up.  */
1360   else if (TREE_CODE (ptr) == INTEGER_CST)
1361     {
1362       if (ann)
1363         ann->has_volatile_ops = true;
1364       return;
1365     }
1366
1367   /* Everything else *should* have been folded elsewhere, but users
1368      are smarter than we in finding ways to write invalid code.  We
1369      cannot just abort here.  If we were absolutely certain that we
1370      do handle all valid cases, then we could just do nothing here.
1371      That seems optimistic, so attempt to do something logical... */
1372   else if ((TREE_CODE (ptr) == PLUS_EXPR || TREE_CODE (ptr) == MINUS_EXPR)
1373            && TREE_CODE (TREE_OPERAND (ptr, 0)) == ADDR_EXPR
1374            && TREE_CODE (TREE_OPERAND (ptr, 1)) == INTEGER_CST)
1375     {
1376       /* Make sure we know the object is addressable.  */
1377       pptr = &TREE_OPERAND (ptr, 0);
1378       add_stmt_operand (pptr, stmt, 0);
1379
1380       /* Mark the object itself with a VUSE.  */
1381       pptr = &TREE_OPERAND (*pptr, 0);
1382       get_expr_operands (stmt, pptr, flags);
1383       return;
1384     }
1385
1386   /* Ok, this isn't even is_gimple_min_invariant.  Something's broke.  */
1387   else
1388     gcc_unreachable ();
1389
1390   /* Add a USE operand for the base pointer.  */
1391   get_expr_operands (stmt, pptr, opf_none);
1392 }
1393
1394 /* A subroutine of get_expr_operands to handle CALL_EXPR.  */
1395
1396 static void
1397 get_call_expr_operands (tree stmt, tree expr)
1398 {
1399   tree op;
1400   int call_flags = call_expr_flags (expr);
1401   tree callee = get_callee_fndecl (expr);
1402
1403   /* Find uses in the called function.  */
1404   get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_none);
1405
1406   for (op = TREE_OPERAND (expr, 1); op; op = TREE_CHAIN (op))
1407     get_expr_operands (stmt, &TREE_VALUE (op), opf_none);
1408
1409   get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
1410
1411   if (bitmap_first_set_bit (call_clobbered_vars) >= 0)
1412     {
1413       /* A 'pure' or a 'const' functions never call clobber anything. 
1414          A 'noreturn' function might, but since we don't return anyway 
1415          there is no point in recording that.  */ 
1416       if (TREE_SIDE_EFFECTS (expr)
1417           && !(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN)))
1418         add_call_clobber_ops (stmt, callee);
1419       else if (!(call_flags & ECF_CONST))
1420         add_call_read_ops (stmt, callee);
1421     }
1422 }
1423
1424
1425 /* Add *VAR_P to the appropriate operand array for INFO.  FLAGS is as in
1426    get_expr_operands.  If *VAR_P is a GIMPLE register, it will be added to
1427    the statement's real operands, otherwise it is added to virtual
1428    operands.  */
1429
1430 static void
1431 add_stmt_operand (tree *var_p, tree stmt, int flags)
1432 {
1433   bool is_real_op;
1434   tree var, sym;
1435   stmt_ann_t s_ann = stmt_ann (stmt);
1436   var_ann_t v_ann;
1437
1438   var = *var_p;
1439   STRIP_NOPS (var);
1440
1441   /* If the operand is an ADDR_EXPR, add its operand to the list of
1442      variables that have had their address taken in this statement.  */
1443   if (TREE_CODE (var) == ADDR_EXPR)
1444     {
1445       note_addressable (TREE_OPERAND (var, 0), s_ann);
1446       return;
1447     }
1448
1449   /* If the original variable is not a scalar, it will be added to the list
1450      of virtual operands.  In that case, use its base symbol as the virtual
1451      variable representing it.  */
1452   is_real_op = is_gimple_reg (var);
1453   if (!is_real_op && !DECL_P (var))
1454     var = get_virtual_var (var);
1455
1456   /* If VAR is not a variable that we care to optimize, do nothing.  */
1457   if (var == NULL_TREE || !SSA_VAR_P (var))
1458     return;
1459
1460   sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
1461   v_ann = var_ann (sym);
1462
1463   /* Don't expose volatile variables to the optimizers.  */
1464   if (TREE_THIS_VOLATILE (sym))
1465     {
1466       if (s_ann)
1467         s_ann->has_volatile_ops = true;
1468       return;
1469     }
1470
1471   if (is_real_op)
1472     {
1473       /* The variable is a GIMPLE register.  Add it to real operands.  */
1474       if (flags & opf_is_def)
1475         append_def (var_p);
1476       else
1477         append_use (var_p);
1478     }
1479   else
1480     {
1481       varray_type aliases;
1482
1483       /* The variable is not a GIMPLE register.  Add it (or its aliases) to
1484          virtual operands, unless the caller has specifically requested
1485          not to add virtual operands (used when adding operands inside an
1486          ADDR_EXPR expression).  */
1487       if (flags & opf_no_vops)
1488         return;
1489
1490       aliases = v_ann->may_aliases;
1491
1492       if (aliases == NULL)
1493         {
1494           /* The variable is not aliased or it is an alias tag.  */
1495           if (flags & opf_is_def)
1496             {
1497               if (flags & opf_kill_def)
1498                 {
1499                   /* Only regular variables may get a V_MUST_DEF
1500                      operand.  */
1501                   gcc_assert (v_ann->mem_tag_kind == NOT_A_TAG);
1502                   /* V_MUST_DEF for non-aliased, non-GIMPLE register 
1503                     variable definitions.  */
1504                   append_v_must_def (var);
1505                 }
1506               else
1507                 {
1508                   /* Add a V_MAY_DEF for call-clobbered variables and
1509                      memory tags.  */
1510                   append_v_may_def (var);
1511                 }
1512             }
1513           else
1514             {
1515               append_vuse (var);
1516               if (s_ann && v_ann->is_alias_tag)
1517                 s_ann->makes_aliased_loads = 1;
1518             }
1519         }
1520       else
1521         {
1522           size_t i;
1523
1524           /* The variable is aliased.  Add its aliases to the virtual
1525              operands.  */
1526           gcc_assert (VARRAY_ACTIVE_SIZE (aliases) != 0);
1527
1528           if (flags & opf_is_def)
1529             {
1530               /* If the variable is also an alias tag, add a virtual
1531                  operand for it, otherwise we will miss representing
1532                  references to the members of the variable's alias set.
1533                  This fixes the bug in gcc.c-torture/execute/20020503-1.c.  */
1534               if (v_ann->is_alias_tag)
1535                 append_v_may_def (var);
1536
1537               for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
1538                 append_v_may_def (VARRAY_TREE (aliases, i));
1539
1540               if (s_ann)
1541                 s_ann->makes_aliased_stores = 1;
1542             }
1543           else
1544             {
1545               /* Similarly, append a virtual uses for VAR itself, when
1546                  it is an alias tag.  */
1547               if (v_ann->is_alias_tag)
1548                 append_vuse (var);
1549
1550               for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
1551                 append_vuse (VARRAY_TREE (aliases, i));
1552
1553               if (s_ann)
1554                 s_ann->makes_aliased_loads = 1;
1555             }
1556         }
1557     }
1558 }
1559
1560
1561 /* Record that VAR had its address taken in the statement with annotations
1562    S_ANN.  */
1563
1564 static void
1565 note_addressable (tree var, stmt_ann_t s_ann)
1566 {
1567   if (!s_ann)
1568     return;
1569
1570   var = get_base_address (var);
1571   if (var && SSA_VAR_P (var))
1572     {
1573       if (s_ann->addresses_taken == NULL)
1574         s_ann->addresses_taken = BITMAP_GGC_ALLOC ();
1575       bitmap_set_bit (s_ann->addresses_taken, var_ann (var)->uid);
1576     }
1577 }
1578
1579
1580 /* Add clobbering definitions for .GLOBAL_VAR or for each of the call
1581    clobbered variables in the function.  */
1582
1583 static void
1584 add_call_clobber_ops (tree stmt, tree callee)
1585 {
1586   /* Functions that are not const, pure or never return may clobber
1587      call-clobbered variables.  */
1588   if (stmt_ann (stmt))
1589     stmt_ann (stmt)->makes_clobbering_call = true;
1590
1591   /* If we had created .GLOBAL_VAR earlier, use it.  Otherwise, add 
1592      a V_MAY_DEF operand for every call clobbered variable.  See 
1593      compute_may_aliases for the heuristic used to decide whether 
1594      to create .GLOBAL_VAR or not.  */
1595   if (global_var)
1596     add_stmt_operand (&global_var, stmt, opf_is_def);
1597   else
1598     {
1599       size_t i;
1600       bitmap not_read_b = NULL, not_written_b = NULL;
1601       bitmap_iterator bi;
1602
1603       /* Get info for module level statics.  There is a bit set for
1604          each static if the call being processed does not read or
1605          write that variable.  */
1606
1607       /* ??? Turn off the optimization until it gets fixed.  */
1608       if (0 && callee)
1609         {
1610           not_read_b = get_global_statics_not_read (callee);
1611           not_written_b = get_global_statics_not_written (callee);
1612         }
1613
1614       EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
1615         {
1616           tree var = referenced_var (i);
1617
1618           bool not_read
1619             = not_read_b ? bitmap_bit_p (not_read_b, i) : false;
1620           bool not_written
1621             = not_written_b ? bitmap_bit_p (not_written_b, i) : false;
1622
1623           if (not_read)
1624             {
1625               /* The var is not read during the call.  */
1626               if (!not_written)
1627                 add_stmt_operand (&var, stmt, opf_is_def);
1628             }
1629           else
1630             {
1631               /* The var is read during the call.  */
1632               if (not_written) 
1633                 add_stmt_operand (&var, stmt, opf_none);
1634
1635               /* The not_read and not_written bits are only set for module
1636                  static variables.  Neither is set here, so we may be dealing
1637                  with a module static or we may not.  So we still must look
1638                  anywhere else we can (such as the TREE_READONLY) to get
1639                  better info.  */
1640
1641               /* If VAR is read-only, don't add a V_MAY_DEF, just a
1642                  VUSE operand.  FIXME, this is quirky.  TREE_READONLY
1643                  by itself is not enough here.  We can only decide
1644                  that the call will not affect VAR if all these
1645                  conditions are met.  One would think that
1646                  TREE_READONLY should be sufficient.  */
1647               else if (TREE_READONLY (var)
1648                        && (TREE_STATIC (var) || DECL_EXTERNAL (var)))
1649                 add_stmt_operand (&var, stmt, opf_none);
1650               else
1651                 add_stmt_operand (&var, stmt, opf_is_def);
1652             }
1653         }
1654     }
1655 }
1656
1657
1658 /* Add VUSE operands for .GLOBAL_VAR or all call clobbered variables in the
1659    function.  */
1660
1661 static void
1662 add_call_read_ops (tree stmt, tree callee)
1663 {
1664   bitmap_iterator bi;
1665
1666   /* Otherwise, if the function is not pure, it may reference memory.  Add
1667      a VUSE for .GLOBAL_VAR if it has been created.  Otherwise, add a VUSE
1668      for each call-clobbered variable.  See add_referenced_var for the
1669      heuristic used to decide whether to create .GLOBAL_VAR.  */
1670   if (global_var)
1671     add_stmt_operand (&global_var, stmt, opf_none);
1672   else
1673     {
1674       size_t i;
1675       bitmap not_read_b = callee 
1676         ? get_global_statics_not_read (callee) : NULL; 
1677
1678       EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
1679         {
1680           tree var = referenced_var (i);
1681           bool not_read = not_read_b 
1682             ? bitmap_bit_p(not_read_b, i) : false;
1683           if (!not_read)
1684           add_stmt_operand (&var, stmt, opf_none);
1685         }
1686     }
1687 }
1688
1689 /* Copies virtual operands from SRC to DST.  */
1690
1691 void
1692 copy_virtual_operands (tree dst, tree src)
1693 {
1694   unsigned i;
1695   vuse_optype vuses = STMT_VUSE_OPS (src);
1696   v_may_def_optype v_may_defs = STMT_V_MAY_DEF_OPS (src);
1697   v_must_def_optype v_must_defs = STMT_V_MUST_DEF_OPS (src);
1698   vuse_optype *vuses_new = &stmt_ann (dst)->operands.vuse_ops;
1699   v_may_def_optype *v_may_defs_new = &stmt_ann (dst)->operands.v_may_def_ops;
1700   v_must_def_optype *v_must_defs_new = &stmt_ann (dst)->operands.v_must_def_ops;
1701
1702   if (vuses)
1703     {
1704       *vuses_new = allocate_vuse_optype (NUM_VUSES (vuses));
1705       for (i = 0; i < NUM_VUSES (vuses); i++)
1706         SET_VUSE_OP (*vuses_new, i, VUSE_OP (vuses, i));
1707     }
1708
1709   if (v_may_defs)
1710     {
1711       *v_may_defs_new = allocate_v_may_def_optype (NUM_V_MAY_DEFS (v_may_defs));
1712       for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
1713         {
1714           SET_V_MAY_DEF_OP (*v_may_defs_new, i, V_MAY_DEF_OP (v_may_defs, i));
1715           SET_V_MAY_DEF_RESULT (*v_may_defs_new, i, 
1716                                 V_MAY_DEF_RESULT (v_may_defs, i));
1717         }
1718     }
1719
1720   if (v_must_defs)
1721     {
1722       *v_must_defs_new = allocate_v_must_def_optype (NUM_V_MUST_DEFS (v_must_defs));
1723       for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
1724         SET_V_MUST_DEF_OP (*v_must_defs_new, i, V_MUST_DEF_OP (v_must_defs, i));
1725     }
1726 }
1727
1728
1729 /* Specifically for use in DOM's expression analysis.  Given a store, we
1730    create an artificial stmt which looks like a load from the store, this can
1731    be used to eliminate redundant loads.  OLD_OPS are the operands from the 
1732    store stmt, and NEW_STMT is the new load which represents a load of the
1733    values stored.  */
1734
1735 void
1736 create_ssa_artficial_load_stmt (stmt_operands_p old_ops, tree new_stmt)
1737 {
1738   stmt_ann_t ann;
1739   tree op;
1740   stmt_operands_t tmp;
1741   unsigned j;
1742
1743   memset (&tmp, 0, sizeof (stmt_operands_t));
1744   ann = get_stmt_ann (new_stmt);
1745
1746   /* Free operands just in case is was an existing stmt.  */
1747   free_ssa_operands (&(ann->operands));
1748
1749   build_ssa_operands (new_stmt, NULL, &tmp, &(ann->operands));
1750   free_vuses (&(ann->operands.vuse_ops));
1751   free_v_may_defs (&(ann->operands.v_may_def_ops));
1752   free_v_must_defs (&(ann->operands.v_must_def_ops));
1753
1754   /* For each VDEF on the original statement, we want to create a
1755      VUSE of the V_MAY_DEF result or V_MUST_DEF op on the new 
1756      statement.  */
1757   for (j = 0; j < NUM_V_MAY_DEFS (old_ops->v_may_def_ops); j++)
1758     {
1759       op = V_MAY_DEF_RESULT (old_ops->v_may_def_ops, j);
1760       append_vuse (op);
1761     }
1762     
1763   for (j = 0; j < NUM_V_MUST_DEFS (old_ops->v_must_def_ops); j++)
1764     {
1765       op = V_MUST_DEF_OP (old_ops->v_must_def_ops, j);
1766       append_vuse (op);
1767     }
1768
1769   /* Now set the vuses for this new stmt.  */
1770   ann->operands.vuse_ops = finalize_ssa_vuses (&(tmp.vuse_ops));
1771 }
1772
1773 #include "gt-tree-ssa-operands.h"