OSDN Git Service

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