OSDN Git Service

* typeck.c (comptypes): First determine if the types are compatible
[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               add_stmt_operand (&var, s_ann, opf_is_def);
1374             }
1375
1376         break;
1377       }
1378 }
1379
1380 /* A subroutine of get_expr_operands to handle INDIRECT_REF,
1381    ALIGN_INDIRECT_REF and MISALIGNED_INDIRECT_REF.  */
1382
1383 static void
1384 get_indirect_ref_operands (tree stmt, tree expr, int flags)
1385 {
1386   tree *pptr = &TREE_OPERAND (expr, 0);
1387   tree ptr = *pptr;
1388   stmt_ann_t s_ann = stmt_ann (stmt);
1389
1390   /* Stores into INDIRECT_REF operands are never killing definitions.  */
1391   flags &= ~opf_kill_def;
1392
1393   if (SSA_VAR_P (ptr))
1394     {
1395       struct ptr_info_def *pi = NULL;
1396
1397       /* If PTR has flow-sensitive points-to information, use it.  */
1398       if (TREE_CODE (ptr) == SSA_NAME
1399           && (pi = SSA_NAME_PTR_INFO (ptr)) != NULL
1400           && pi->name_mem_tag)
1401         {
1402           /* PTR has its own memory tag.  Use it.  */
1403           add_stmt_operand (&pi->name_mem_tag, s_ann, flags);
1404         }
1405       else
1406         {
1407           /* If PTR is not an SSA_NAME or it doesn't have a name
1408              tag, use its type memory tag.  */
1409           var_ann_t v_ann;
1410
1411           /* If we are emitting debugging dumps, display a warning if
1412              PTR is an SSA_NAME with no flow-sensitive alias
1413              information.  That means that we may need to compute
1414              aliasing again.  */
1415           if (dump_file
1416               && TREE_CODE (ptr) == SSA_NAME
1417               && pi == NULL)
1418             {
1419               fprintf (dump_file,
1420                   "NOTE: no flow-sensitive alias info for ");
1421               print_generic_expr (dump_file, ptr, dump_flags);
1422               fprintf (dump_file, " in ");
1423               print_generic_stmt (dump_file, stmt, dump_flags);
1424             }
1425
1426           if (TREE_CODE (ptr) == SSA_NAME)
1427             ptr = SSA_NAME_VAR (ptr);
1428           v_ann = var_ann (ptr);
1429           if (v_ann->type_mem_tag)
1430             add_stmt_operand (&v_ann->type_mem_tag, s_ann, flags);
1431         }
1432     }
1433
1434   /* If a constant is used as a pointer, we can't generate a real
1435      operand for it but we mark the statement volatile to prevent
1436      optimizations from messing things up.  */
1437   else if (TREE_CODE (ptr) == INTEGER_CST)
1438     {
1439       if (s_ann)
1440         s_ann->has_volatile_ops = true;
1441       return;
1442     }
1443
1444   /* Everything else *should* have been folded elsewhere, but users
1445      are smarter than we in finding ways to write invalid code.  We
1446      cannot just abort here.  If we were absolutely certain that we
1447      do handle all valid cases, then we could just do nothing here.
1448      That seems optimistic, so attempt to do something logical... */
1449   else if ((TREE_CODE (ptr) == PLUS_EXPR || TREE_CODE (ptr) == MINUS_EXPR)
1450            && TREE_CODE (TREE_OPERAND (ptr, 0)) == ADDR_EXPR
1451            && TREE_CODE (TREE_OPERAND (ptr, 1)) == INTEGER_CST)
1452     {
1453       /* Make sure we know the object is addressable.  */
1454       pptr = &TREE_OPERAND (ptr, 0);
1455       add_stmt_operand (pptr, s_ann, 0);
1456
1457       /* Mark the object itself with a VUSE.  */
1458       pptr = &TREE_OPERAND (*pptr, 0);
1459       get_expr_operands (stmt, pptr, flags);
1460       return;
1461     }
1462
1463   /* Ok, this isn't even is_gimple_min_invariant.  Something's broke.  */
1464   else
1465     gcc_unreachable ();
1466
1467   /* Add a USE operand for the base pointer.  */
1468   get_expr_operands (stmt, pptr, opf_none);
1469 }
1470
1471 /* A subroutine of get_expr_operands to handle CALL_EXPR.  */
1472
1473 static void
1474 get_call_expr_operands (tree stmt, tree expr)
1475 {
1476   tree op;
1477   int call_flags = call_expr_flags (expr);
1478
1479   /* If aliases have been computed already, add V_MAY_DEF or V_USE
1480      operands for all the symbols that have been found to be
1481      call-clobbered.
1482      
1483      Note that if aliases have not been computed, the global effects
1484      of calls will not be included in the SSA web. This is fine
1485      because no optimizer should run before aliases have been
1486      computed.  By not bothering with virtual operands for CALL_EXPRs
1487      we avoid adding superfluous virtual operands, which can be a
1488      significant compile time sink (See PR 15855).  */
1489   if (aliases_computed_p
1490       && !bitmap_empty_p (call_clobbered_vars)
1491       && !(call_flags & ECF_NOVOPS))
1492     {
1493       /* A 'pure' or a 'const' functions never call clobber anything. 
1494          A 'noreturn' function might, but since we don't return anyway 
1495          there is no point in recording that.  */ 
1496       if (TREE_SIDE_EFFECTS (expr)
1497           && !(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN)))
1498         add_call_clobber_ops (stmt);
1499       else if (!(call_flags & ECF_CONST))
1500         add_call_read_ops (stmt);
1501     }
1502
1503   /* Find uses in the called function.  */
1504   get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_none);
1505
1506   for (op = TREE_OPERAND (expr, 1); op; op = TREE_CHAIN (op))
1507     get_expr_operands (stmt, &TREE_VALUE (op), opf_none);
1508
1509   get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
1510
1511 }
1512
1513
1514 /* Add *VAR_P to the appropriate operand array for INFO.  FLAGS is as in
1515    get_expr_operands.  If *VAR_P is a GIMPLE register, it will be added to
1516    the statement's real operands, otherwise it is added to virtual
1517    operands.  */
1518
1519 static void
1520 add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags)
1521 {
1522   bool is_real_op;
1523   tree var, sym;
1524   var_ann_t v_ann;
1525
1526   var = *var_p;
1527   STRIP_NOPS (var);
1528
1529   /* If the operand is an ADDR_EXPR, add its operand to the list of
1530      variables that have had their address taken in this statement.  */
1531   if (TREE_CODE (var) == ADDR_EXPR)
1532     {
1533       note_addressable (TREE_OPERAND (var, 0), s_ann);
1534       return;
1535     }
1536
1537   /* If the original variable is not a scalar, it will be added to the list
1538      of virtual operands.  In that case, use its base symbol as the virtual
1539      variable representing it.  */
1540   is_real_op = is_gimple_reg (var);
1541   if (!is_real_op && !DECL_P (var))
1542     var = get_virtual_var (var);
1543
1544   /* If VAR is not a variable that we care to optimize, do nothing.  */
1545   if (var == NULL_TREE || !SSA_VAR_P (var))
1546     return;
1547
1548   sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
1549   v_ann = var_ann (sym);
1550
1551   /* Mark statements with volatile operands.  Optimizers should back
1552      off from statements having volatile operands.  */
1553   if (TREE_THIS_VOLATILE (sym) && s_ann)
1554     s_ann->has_volatile_ops = true;
1555
1556   if (is_real_op)
1557     {
1558       /* The variable is a GIMPLE register.  Add it to real operands.  */
1559       if (flags & opf_is_def)
1560         append_def (var_p);
1561       else
1562         append_use (var_p);
1563     }
1564   else
1565     {
1566       varray_type aliases;
1567
1568       /* The variable is not a GIMPLE register.  Add it (or its aliases) to
1569          virtual operands, unless the caller has specifically requested
1570          not to add virtual operands (used when adding operands inside an
1571          ADDR_EXPR expression).  */
1572       if (flags & opf_no_vops)
1573         return;
1574
1575       aliases = v_ann->may_aliases;
1576
1577       if (aliases == NULL)
1578         {
1579           /* The variable is not aliased or it is an alias tag.  */
1580           if (flags & opf_is_def)
1581             {
1582               if (flags & opf_kill_def)
1583                 {
1584                   /* Only regular variables or struct fields may get a
1585                      V_MUST_DEF operand.  */
1586                   gcc_assert (v_ann->mem_tag_kind == NOT_A_TAG 
1587                               || v_ann->mem_tag_kind == STRUCT_FIELD);
1588                   /* V_MUST_DEF for non-aliased, non-GIMPLE register 
1589                     variable definitions.  */
1590                   append_v_must_def (var);
1591                 }
1592               else
1593                 {
1594                   /* Add a V_MAY_DEF for call-clobbered variables and
1595                      memory tags.  */
1596                   append_v_may_def (var);
1597                 }
1598             }
1599           else
1600             {
1601               append_vuse (var);
1602               if (s_ann && v_ann->is_alias_tag)
1603                 s_ann->makes_aliased_loads = 1;
1604             }
1605         }
1606       else
1607         {
1608           size_t i;
1609
1610           /* The variable is aliased.  Add its aliases to the virtual
1611              operands.  */
1612           gcc_assert (VARRAY_ACTIVE_SIZE (aliases) != 0);
1613
1614           if (flags & opf_is_def)
1615             {
1616               /* If the variable is also an alias tag, add a virtual
1617                  operand for it, otherwise we will miss representing
1618                  references to the members of the variable's alias set.
1619                  This fixes the bug in gcc.c-torture/execute/20020503-1.c.  */
1620               if (v_ann->is_alias_tag)
1621                 append_v_may_def (var);
1622
1623               for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
1624                 append_v_may_def (VARRAY_TREE (aliases, i));
1625
1626               if (s_ann)
1627                 s_ann->makes_aliased_stores = 1;
1628             }
1629           else
1630             {
1631               /* Similarly, append a virtual uses for VAR itself, when
1632                  it is an alias tag.  */
1633               if (v_ann->is_alias_tag)
1634                 append_vuse (var);
1635
1636               for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
1637                 append_vuse (VARRAY_TREE (aliases, i));
1638
1639               if (s_ann)
1640                 s_ann->makes_aliased_loads = 1;
1641             }
1642         }
1643     }
1644 }
1645
1646   
1647 /* Record that VAR had its address taken in the statement with annotations
1648    S_ANN.  */
1649
1650 static void
1651 note_addressable (tree var, stmt_ann_t s_ann)
1652 {
1653   tree ref;
1654   subvar_t svars;
1655   HOST_WIDE_INT offset;
1656   HOST_WIDE_INT size;
1657
1658   if (!s_ann)
1659     return;
1660   
1661   /* If this is a COMPONENT_REF, and we know exactly what it touches, we only
1662      take the address of the subvariables it will touch.
1663      Otherwise, we take the address of all the subvariables, plus the real
1664      ones.  */
1665
1666   if (var && TREE_CODE (var) == COMPONENT_REF 
1667       && (ref = okay_component_ref_for_subvars (var, &offset, &size)))
1668     {
1669       subvar_t sv;
1670       svars = get_subvars_for_var (ref);
1671       
1672       if (s_ann->addresses_taken == NULL)
1673         s_ann->addresses_taken = BITMAP_GGC_ALLOC ();      
1674       
1675       for (sv = svars; sv; sv = sv->next)
1676         {
1677           if (overlap_subvar (offset, size, sv, NULL))
1678             bitmap_set_bit (s_ann->addresses_taken, var_ann (sv->var)->uid);
1679         }
1680       return;
1681     }
1682   
1683   var = get_base_address (var);
1684   if (var && SSA_VAR_P (var))
1685     {
1686       if (s_ann->addresses_taken == NULL)
1687         s_ann->addresses_taken = BITMAP_GGC_ALLOC ();      
1688       
1689
1690       if (var_can_have_subvars (var)
1691           && (svars = get_subvars_for_var (var)))
1692         {
1693           subvar_t sv;
1694           for (sv = svars; sv; sv = sv->next)
1695             bitmap_set_bit (s_ann->addresses_taken, var_ann (sv->var)->uid);
1696         }
1697       else
1698         bitmap_set_bit (s_ann->addresses_taken, var_ann (var)->uid);
1699     }
1700 }
1701
1702 /* Add clobbering definitions for .GLOBAL_VAR or for each of the call
1703    clobbered variables in the function.  */
1704
1705 static void
1706 add_call_clobber_ops (tree stmt)
1707 {
1708   unsigned i;
1709   tree t;
1710   bitmap_iterator bi;
1711   stmt_ann_t s_ann = stmt_ann (stmt);
1712   struct stmt_ann_d empty_ann;
1713
1714   /* Functions that are not const, pure or never return may clobber
1715      call-clobbered variables.  */
1716   if (s_ann)
1717     s_ann->makes_clobbering_call = true;
1718
1719   /* If we created .GLOBAL_VAR earlier, just use it.  See compute_may_aliases 
1720      for the heuristic used to decide whether to create .GLOBAL_VAR or not.  */
1721   if (global_var)
1722     {
1723       add_stmt_operand (&global_var, s_ann, opf_is_def);
1724       return;
1725     }
1726
1727   /* If cache is valid, copy the elements into the build vectors.  */
1728   if (ssa_call_clobbered_cache_valid)
1729     {
1730       for (i = 0; i < VARRAY_ACTIVE_SIZE (clobbered_vuses); i++)
1731         {
1732           t = VARRAY_TREE (clobbered_vuses, i);
1733           gcc_assert (TREE_CODE (t) != SSA_NAME);
1734           var_ann (t)->in_vuse_list = 1;
1735           VARRAY_PUSH_TREE (build_vuses, t);
1736         }
1737       for (i = 0; i < VARRAY_ACTIVE_SIZE (clobbered_v_may_defs); i++)
1738         {
1739           t = VARRAY_TREE (clobbered_v_may_defs, i);
1740           gcc_assert (TREE_CODE (t) != SSA_NAME);
1741           var_ann (t)->in_v_may_def_list = 1;
1742           VARRAY_PUSH_TREE (build_v_may_defs, t);
1743         }
1744       if (s_ann)
1745         {
1746           s_ann->makes_aliased_loads = clobbered_aliased_loads;
1747           s_ann->makes_aliased_stores = clobbered_aliased_stores;
1748         }
1749       return;
1750     }
1751
1752   memset (&empty_ann, 0, sizeof (struct stmt_ann_d));
1753
1754   /* Add a V_MAY_DEF operand for every call clobbered variable.  */
1755   EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
1756     {
1757       tree var = referenced_var (i);
1758       if (TREE_READONLY (var)
1759           && (TREE_STATIC (var) || DECL_EXTERNAL (var)))
1760         add_stmt_operand (&var, &empty_ann, opf_none);
1761       else
1762         add_stmt_operand (&var, &empty_ann, opf_is_def);
1763     }
1764
1765   clobbered_aliased_loads = empty_ann.makes_aliased_loads;
1766   clobbered_aliased_stores = empty_ann.makes_aliased_stores;
1767
1768   /* Set the flags for a stmt's annotation.  */
1769   if (s_ann)
1770     {
1771       s_ann->makes_aliased_loads = empty_ann.makes_aliased_loads;
1772       s_ann->makes_aliased_stores = empty_ann.makes_aliased_stores;
1773     }
1774
1775   /* Prepare empty cache vectors.  */
1776   if (clobbered_v_may_defs)
1777     {
1778       VARRAY_POP_ALL (clobbered_vuses);
1779       VARRAY_POP_ALL (clobbered_v_may_defs);
1780     }
1781   else
1782     {
1783       VARRAY_TREE_INIT (clobbered_v_may_defs, 10, "clobbered_v_may_defs");
1784       VARRAY_TREE_INIT (clobbered_vuses, 10, "clobbered_vuses");
1785     }
1786
1787   /* Now fill the clobbered cache with the values that have been found.  */
1788   for (i = 0; i < VARRAY_ACTIVE_SIZE (build_vuses); i++)
1789     VARRAY_PUSH_TREE (clobbered_vuses, VARRAY_TREE (build_vuses, i));
1790   for (i = 0; i < VARRAY_ACTIVE_SIZE (build_v_may_defs); i++)
1791     VARRAY_PUSH_TREE (clobbered_v_may_defs, VARRAY_TREE (build_v_may_defs, i));
1792
1793   ssa_call_clobbered_cache_valid = true;
1794 }
1795
1796
1797 /* Add VUSE operands for .GLOBAL_VAR or all call clobbered variables in the
1798    function.  */
1799
1800 static void
1801 add_call_read_ops (tree stmt)
1802 {
1803   unsigned i;
1804   tree t;
1805   bitmap_iterator bi;
1806   stmt_ann_t s_ann = stmt_ann (stmt);
1807   struct stmt_ann_d empty_ann;
1808
1809   /* if the function is not pure, it may reference memory.  Add
1810      a VUSE for .GLOBAL_VAR if it has been created.  See add_referenced_var
1811      for the heuristic used to decide whether to create .GLOBAL_VAR.  */
1812   if (global_var)
1813     {
1814       add_stmt_operand (&global_var, s_ann, opf_none);
1815       return;
1816     }
1817   
1818   /* If cache is valid, copy the elements into the build vector.  */
1819   if (ssa_ro_call_cache_valid)
1820     {
1821       for (i = 0; i < VARRAY_ACTIVE_SIZE (ro_call_vuses); i++)
1822         {
1823           t = VARRAY_TREE (ro_call_vuses, i);
1824           gcc_assert (TREE_CODE (t) != SSA_NAME);
1825           var_ann (t)->in_vuse_list = 1;
1826           VARRAY_PUSH_TREE (build_vuses, t);
1827         }
1828       if (s_ann)
1829         s_ann->makes_aliased_loads = ro_call_aliased_loads;
1830       return;
1831     }
1832
1833   memset (&empty_ann, 0, sizeof (struct stmt_ann_d));
1834
1835   /* Add a VUSE for each call-clobbered variable.  */
1836   EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
1837     {
1838       tree var = referenced_var (i);
1839       add_stmt_operand (&var, &empty_ann, opf_none);
1840     }
1841
1842   ro_call_aliased_loads = empty_ann.makes_aliased_loads;
1843   if (s_ann)
1844     s_ann->makes_aliased_loads = empty_ann.makes_aliased_loads;
1845
1846   /* Prepare empty cache vectors.  */
1847   if (ro_call_vuses)
1848     VARRAY_POP_ALL (ro_call_vuses);
1849   else
1850     VARRAY_TREE_INIT (ro_call_vuses, 10, "ro_call_vuses");
1851
1852   /* Now fill the clobbered cache with the values that have been found.  */
1853   for (i = 0; i < VARRAY_ACTIVE_SIZE (build_vuses); i++)
1854     VARRAY_PUSH_TREE (ro_call_vuses, VARRAY_TREE (build_vuses, i));
1855
1856   ssa_ro_call_cache_valid = true;
1857 }
1858
1859 /* Copies virtual operands from SRC to DST.  */
1860
1861 void
1862 copy_virtual_operands (tree dst, tree src)
1863 {
1864   unsigned i;
1865   vuse_optype vuses = STMT_VUSE_OPS (src);
1866   v_may_def_optype v_may_defs = STMT_V_MAY_DEF_OPS (src);
1867   v_must_def_optype v_must_defs = STMT_V_MUST_DEF_OPS (src);
1868   vuse_optype *vuses_new = &stmt_ann (dst)->operands.vuse_ops;
1869   v_may_def_optype *v_may_defs_new = &stmt_ann (dst)->operands.v_may_def_ops;
1870   v_must_def_optype *v_must_defs_new = &stmt_ann (dst)->operands.v_must_def_ops;
1871
1872   if (vuses)
1873     {
1874       *vuses_new = allocate_vuse_optype (NUM_VUSES (vuses));
1875       for (i = 0; i < NUM_VUSES (vuses); i++)
1876         SET_VUSE_OP (*vuses_new, i, VUSE_OP (vuses, i));
1877     }
1878
1879   if (v_may_defs)
1880     {
1881       *v_may_defs_new = allocate_v_may_def_optype (NUM_V_MAY_DEFS (v_may_defs));
1882       for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
1883         {
1884           SET_V_MAY_DEF_OP (*v_may_defs_new, i, V_MAY_DEF_OP (v_may_defs, i));
1885           SET_V_MAY_DEF_RESULT (*v_may_defs_new, i, 
1886                                 V_MAY_DEF_RESULT (v_may_defs, i));
1887         }
1888     }
1889
1890   if (v_must_defs)
1891     {
1892       *v_must_defs_new = allocate_v_must_def_optype (NUM_V_MUST_DEFS (v_must_defs));
1893       for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
1894         {
1895           SET_V_MUST_DEF_RESULT (*v_must_defs_new, i, V_MUST_DEF_RESULT (v_must_defs, i));
1896           SET_V_MUST_DEF_KILL (*v_must_defs_new, i, V_MUST_DEF_KILL (v_must_defs, i));
1897         }
1898     }
1899 }
1900
1901
1902 /* Specifically for use in DOM's expression analysis.  Given a store, we
1903    create an artificial stmt which looks like a load from the store, this can
1904    be used to eliminate redundant loads.  OLD_OPS are the operands from the 
1905    store stmt, and NEW_STMT is the new load which represents a load of the
1906    values stored.  */
1907
1908 void
1909 create_ssa_artficial_load_stmt (stmt_operands_p old_ops, tree new_stmt)
1910 {
1911   stmt_ann_t ann;
1912   tree op;
1913   stmt_operands_t tmp;
1914   unsigned j;
1915
1916   memset (&tmp, 0, sizeof (stmt_operands_t));
1917   ann = get_stmt_ann (new_stmt);
1918
1919   /* Free operands just in case is was an existing stmt.  */
1920   free_ssa_operands (&(ann->operands));
1921
1922   build_ssa_operands (new_stmt, NULL, &tmp, &(ann->operands));
1923   free_vuses (&(ann->operands.vuse_ops));
1924   free_v_may_defs (&(ann->operands.v_may_def_ops));
1925   free_v_must_defs (&(ann->operands.v_must_def_ops));
1926   
1927   /* For each VDEF on the original statement, we want to create a
1928      VUSE of the V_MAY_DEF result or V_MUST_DEF op on the new 
1929      statement.  */
1930   for (j = 0; j < NUM_V_MAY_DEFS (old_ops->v_may_def_ops); j++)
1931     {
1932       op = V_MAY_DEF_RESULT (old_ops->v_may_def_ops, j);
1933       append_vuse (op);
1934     }
1935     
1936   for (j = 0; j < NUM_V_MUST_DEFS (old_ops->v_must_def_ops); j++)
1937     {
1938       op = V_MUST_DEF_RESULT (old_ops->v_must_def_ops, j);
1939       append_vuse (op);
1940     }
1941
1942   /* Now set the vuses for this new stmt.  */
1943   ann->operands.vuse_ops = finalize_ssa_vuses (&(tmp.vuse_ops));
1944 }
1945
1946 #include "gt-tree-ssa-operands.h"