OSDN Git Service

2006-12-06 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-operands.c
1 /* SSA operands management for trees.
2    Copyright (C) 2003, 2004, 2005, 2006 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, 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, 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 "tree-flow.h"
30 #include "tree-inline.h"
31 #include "tree-pass.h"
32 #include "ggc.h"
33 #include "timevar.h"
34 #include "toplev.h"
35 #include "langhooks.h"
36 #include "ipa-reference.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    The operand tree is the parsed by the various get_* routines which look 
54    through the stmt tree for the occurrence of operands which may be of 
55    interest, and calls are made to the append_* routines whenever one is 
56    found.  There are 5 of these routines, each representing one of the 
57    5 types of operands. Defs, Uses, Virtual Uses, Virtual May Defs, and 
58    Virtual Must Defs.
59
60    The append_* routines check for duplication, and simply keep a list of 
61    unique objects for each operand type in the build_* extendable vectors.
62
63    Once the stmt tree is completely parsed, the finalize_ssa_operands() 
64    routine is called, which proceeds to perform the finalization routine 
65    on each of the 5 operand vectors which have been built up.
66
67    If the stmt had a previous operand cache, the finalization routines 
68    attempt to match up the new operands with the old ones.  If it's a perfect 
69    match, the old vector is simply reused.  If it isn't a perfect match, then 
70    a new vector is created and the new operands are placed there.  For 
71    virtual operands, if the previous cache had SSA_NAME version of a 
72    variable, and that same variable occurs in the same operands cache, then 
73    the new cache vector will also get the same SSA_NAME.
74
75   i.e., if a stmt had a VUSE of 'a_5', and 'a' occurs in the new operand 
76   vector for VUSE, then the new vector will also be modified such that 
77   it contains 'a_5' rather than 'a'.  */
78
79 /* Flags to describe operand properties in helpers.  */
80
81 /* By default, operands are loaded.  */
82 #define opf_none        0
83
84 /* Operand is the target of an assignment expression or a 
85    call-clobbered variable.  */
86 #define opf_is_def      (1 << 0)
87
88 /* Operand is the target of an assignment expression.  */
89 #define opf_kill_def    (1 << 1)
90
91 /* No virtual operands should be created in the expression.  This is used
92    when traversing ADDR_EXPR nodes which have different semantics than
93    other expressions.  Inside an ADDR_EXPR node, the only operands that we
94    need to consider are indices into arrays.  For instance, &a.b[i] should
95    generate a USE of 'i' but it should not generate a VUSE for 'a' nor a
96    VUSE for 'b'.  */
97 #define opf_no_vops     (1 << 2)
98
99 /* Operand is a "non-specific" kill for call-clobbers and such.  This
100    is used to distinguish "reset the world" events from explicit
101    GIMPLE_MODIFY_STMTs.  */
102 #define opf_non_specific  (1 << 3)
103
104 /* Array for building all the def operands.  */
105 static VEC(tree,heap) *build_defs;
106
107 /* Array for building all the use operands.  */
108 static VEC(tree,heap) *build_uses;
109
110 /* Array for building all the V_MAY_DEF operands.  */
111 static VEC(tree,heap) *build_v_may_defs;
112
113 /* Array for building all the VUSE operands.  */
114 static VEC(tree,heap) *build_vuses;
115
116 /* Array for building all the V_MUST_DEF operands.  */
117 static VEC(tree,heap) *build_v_must_defs;
118
119 static void get_expr_operands (tree, tree *, int);
120
121 /* Number of functions with initialized ssa_operands.  */
122 static int n_initialized = 0;
123
124 /* Allocates operand OP of given TYPE from the appropriate free list,
125    or of the new value if the list is empty.  */
126
127 #define ALLOC_OPTYPE(OP, TYPE)                          \
128   do                                                    \
129     {                                                   \
130       TYPE##_optype_p ret                               \
131          = gimple_ssa_operands (cfun)->free_##TYPE##s;  \
132       if (ret)                                          \
133         gimple_ssa_operands (cfun)->free_##TYPE##s      \
134          = ret->next;                                   \
135       else                                              \
136         ret = ssa_operand_alloc (sizeof (*ret));        \
137       (OP) = ret;                                       \
138     } while (0) 
139
140 /* Return the DECL_UID of the base variable of T.  */
141
142 static inline unsigned
143 get_name_decl (tree t)
144 {
145   if (TREE_CODE (t) != SSA_NAME)
146     return DECL_UID (t);
147   else
148     return DECL_UID (SSA_NAME_VAR (t));
149 }
150
151
152 /* Comparison function for qsort used in operand_build_sort_virtual.  */
153
154 static int
155 operand_build_cmp (const void *p, const void *q)
156 {
157   tree e1 = *((const tree *)p);
158   tree e2 = *((const tree *)q);
159   unsigned int u1,u2;
160
161   u1 = get_name_decl (e1);
162   u2 = get_name_decl (e2);
163
164   /* We want to sort in ascending order.  They can never be equal.  */
165 #ifdef ENABLE_CHECKING
166   gcc_assert (u1 != u2);
167 #endif
168   return (u1 > u2 ? 1 : -1);
169 }
170
171
172 /* Sort the virtual operands in LIST from lowest DECL_UID to highest.  */
173
174 static inline void
175 operand_build_sort_virtual (VEC(tree,heap) *list)
176 {
177   int num = VEC_length (tree, list);
178
179   if (num < 2)
180     return;
181
182   if (num == 2)
183     {
184       if (get_name_decl (VEC_index (tree, list, 0)) 
185           > get_name_decl (VEC_index (tree, list, 1)))
186         {  
187           /* Swap elements if in the wrong order.  */
188           tree tmp = VEC_index (tree, list, 0);
189           VEC_replace (tree, list, 0, VEC_index (tree, list, 1));
190           VEC_replace (tree, list, 1, tmp);
191         }
192       return;
193     }
194
195   /* There are 3 or more elements, call qsort.  */
196   qsort (VEC_address (tree, list), 
197          VEC_length (tree, list), 
198          sizeof (tree),
199          operand_build_cmp);
200 }
201
202
203 /*  Return true if the SSA operands cache is active.  */
204
205 bool
206 ssa_operands_active (void)
207 {
208   return cfun->gimple_df && gimple_ssa_operands (cfun)->ops_active;
209 }
210
211
212 /* Structure storing statistics on how many call clobbers we have, and
213    how many where avoided.  */
214
215 static struct 
216 {
217   /* Number of call-clobbered ops we attempt to add to calls in
218      add_call_clobber_ops.  */
219   unsigned int clobbered_vars;
220
221   /* Number of write-clobbers (V_MAY_DEFs) avoided by using
222      not_written information.  */
223   unsigned int static_write_clobbers_avoided;
224
225   /* Number of reads (VUSEs) avoided by using not_read information.  */
226   unsigned int static_read_clobbers_avoided;
227   
228   /* Number of write-clobbers avoided because the variable can't escape to
229      this call.  */
230   unsigned int unescapable_clobbers_avoided;
231
232   /* Number of read-only uses we attempt to add to calls in
233      add_call_read_ops.  */
234   unsigned int readonly_clobbers;
235
236   /* Number of read-only uses we avoid using not_read information.  */
237   unsigned int static_readonly_clobbers_avoided;
238 } clobber_stats;
239   
240
241 /* Initialize the operand cache routines.  */
242
243 void
244 init_ssa_operands (void)
245 {
246   if (!n_initialized++)
247     {
248       build_defs = VEC_alloc (tree, heap, 5);
249       build_uses = VEC_alloc (tree, heap, 10);
250       build_vuses = VEC_alloc (tree, heap, 25);
251       build_v_may_defs = VEC_alloc (tree, heap, 25);
252       build_v_must_defs = VEC_alloc (tree, heap, 25);
253     }
254
255   gcc_assert (gimple_ssa_operands (cfun)->operand_memory == NULL);
256   gimple_ssa_operands (cfun)->operand_memory_index = SSA_OPERAND_MEMORY_SIZE;
257   gimple_ssa_operands (cfun)->ops_active = true;
258   memset (&clobber_stats, 0, sizeof (clobber_stats));
259 }
260
261
262 /* Dispose of anything required by the operand routines.  */
263
264 void
265 fini_ssa_operands (void)
266 {
267   struct ssa_operand_memory_d *ptr;
268   if (!--n_initialized)
269     {
270       VEC_free (tree, heap, build_defs);
271       VEC_free (tree, heap, build_uses);
272       VEC_free (tree, heap, build_v_must_defs);
273       VEC_free (tree, heap, build_v_may_defs);
274       VEC_free (tree, heap, build_vuses);
275     }
276   gimple_ssa_operands (cfun)->free_defs = NULL;
277   gimple_ssa_operands (cfun)->free_uses = NULL;
278   gimple_ssa_operands (cfun)->free_vuses = NULL;
279   gimple_ssa_operands (cfun)->free_maydefs = NULL;
280   gimple_ssa_operands (cfun)->free_mustdefs = NULL;
281   while ((ptr = gimple_ssa_operands (cfun)->operand_memory) != NULL)
282     {
283       gimple_ssa_operands (cfun)->operand_memory
284         = gimple_ssa_operands (cfun)->operand_memory->next;
285       ggc_free (ptr);
286     }
287
288   gimple_ssa_operands (cfun)->ops_active = false;
289   
290   if (dump_file && (dump_flags & TDF_STATS))
291     {
292       fprintf (dump_file, "Original clobbered vars:%d\n",
293                clobber_stats.clobbered_vars);
294       fprintf (dump_file, "Static write clobbers avoided:%d\n",
295                clobber_stats.static_write_clobbers_avoided);
296       fprintf (dump_file, "Static read clobbers avoided:%d\n",
297                clobber_stats.static_read_clobbers_avoided);
298       fprintf (dump_file, "Unescapable clobbers avoided:%d\n",
299                clobber_stats.unescapable_clobbers_avoided);
300       fprintf (dump_file, "Original read-only clobbers:%d\n",
301                clobber_stats.readonly_clobbers);
302       fprintf (dump_file, "Static read-only clobbers avoided:%d\n",
303                clobber_stats.static_readonly_clobbers_avoided);
304     }
305 }
306
307
308 /* Return memory for operands of SIZE chunks.  */
309                                                                               
310 static inline void *
311 ssa_operand_alloc (unsigned size)
312 {
313   char *ptr;
314   if (gimple_ssa_operands (cfun)->operand_memory_index + size
315         >= SSA_OPERAND_MEMORY_SIZE)
316     {
317       struct ssa_operand_memory_d *ptr;
318       ptr = GGC_NEW (struct ssa_operand_memory_d);
319       ptr->next = gimple_ssa_operands (cfun)->operand_memory;
320       gimple_ssa_operands (cfun)->operand_memory = ptr;
321       gimple_ssa_operands (cfun)->operand_memory_index = 0;
322     }
323   ptr = &(gimple_ssa_operands (cfun)->operand_memory
324           ->mem[gimple_ssa_operands (cfun)->operand_memory_index]);
325   gimple_ssa_operands (cfun)->operand_memory_index += size;
326   return ptr;
327 }
328
329
330
331 /* This routine makes sure that PTR is in an immediate use list, and makes
332    sure the stmt pointer is set to the current stmt.  */
333
334 static inline void
335 set_virtual_use_link (use_operand_p ptr, tree stmt)
336 {
337   /*  fold_stmt may have changed the stmt pointers.  */
338   if (ptr->stmt != stmt)
339     ptr->stmt = stmt;
340
341   /* If this use isn't in a list, add it to the correct list.  */
342   if (!ptr->prev)
343     link_imm_use (ptr, *(ptr->use));
344 }
345
346 /* Appends ELT after TO, and moves the TO pointer to ELT.  */
347
348 #define APPEND_OP_AFTER(ELT, TO)        \
349   do                                    \
350     {                                   \
351       (TO)->next = (ELT);               \
352       (TO) = (ELT);                     \
353     } while (0)
354
355 /* Appends head of list FROM after TO, and move both pointers
356    to their successors.  */
357
358 #define MOVE_HEAD_AFTER(FROM, TO)       \
359   do                                    \
360     {                                   \
361       APPEND_OP_AFTER (FROM, TO);       \
362       (FROM) = (FROM)->next;            \
363     } while (0)
364
365 /* Moves OP to appropriate freelist.  OP is set to its successor.  */
366
367 #define MOVE_HEAD_TO_FREELIST(OP, TYPE)                 \
368   do                                                    \
369     {                                                   \
370       TYPE##_optype_p next = (OP)->next;                \
371       (OP)->next                                        \
372          = gimple_ssa_operands (cfun)->free_##TYPE##s;  \
373       gimple_ssa_operands (cfun)->free_##TYPE##s = (OP);\
374       (OP) = next;                                      \
375     } while (0)
376
377 /* Initializes immediate use at USE_PTR to value VAL, and links it to the list
378    of immediate uses.  STMT is the current statement.  */
379
380 #define INITIALIZE_USE(USE_PTR, VAL, STMT)              \
381   do                                                    \
382     {                                                   \
383       (USE_PTR)->use = (VAL);                           \
384       link_imm_use_stmt ((USE_PTR), *(VAL), (STMT));    \
385     } while (0)
386
387 /* Adds OP to the list of defs after LAST, and moves
388    LAST to the new element.  */
389
390 static inline void
391 add_def_op (tree *op, def_optype_p *last)
392 {
393   def_optype_p new;
394
395   ALLOC_OPTYPE (new, def);
396   DEF_OP_PTR (new) = op;
397   APPEND_OP_AFTER (new, *last);  
398 }
399
400 /* Adds OP to the list of uses of statement STMT after LAST, and moves
401    LAST to the new element.  */
402
403 static inline void
404 add_use_op (tree stmt, tree *op, use_optype_p *last)
405 {
406   use_optype_p new;
407
408   ALLOC_OPTYPE (new, use);
409   INITIALIZE_USE (USE_OP_PTR (new), op, stmt);
410   APPEND_OP_AFTER (new, *last);  
411 }
412
413 /* Adds OP to the list of vuses of statement STMT after LAST, and moves
414    LAST to the new element.  */
415
416 static inline void
417 add_vuse_op (tree stmt, tree op, vuse_optype_p *last)
418 {
419   vuse_optype_p new;
420
421   ALLOC_OPTYPE (new, vuse);
422   VUSE_OP (new) = op;
423   INITIALIZE_USE (VUSE_OP_PTR (new), &VUSE_OP (new), stmt);
424   APPEND_OP_AFTER (new, *last);  
425 }
426
427 /* Adds OP to the list of maydefs of statement STMT after LAST, and moves
428    LAST to the new element.  */
429
430 static inline void
431 add_maydef_op (tree stmt, tree op, maydef_optype_p *last)
432 {
433   maydef_optype_p new;
434
435   ALLOC_OPTYPE (new, maydef);
436   MAYDEF_RESULT (new) = op;
437   MAYDEF_OP (new) = op;
438   INITIALIZE_USE (MAYDEF_OP_PTR (new), &MAYDEF_OP (new), stmt);
439   APPEND_OP_AFTER (new, *last);  
440 }
441
442 /* Adds OP to the list of mustdefs of statement STMT after LAST, and moves
443    LAST to the new element.  */
444
445 static inline void
446 add_mustdef_op (tree stmt, tree op, mustdef_optype_p *last)
447 {
448   mustdef_optype_p new;
449
450   ALLOC_OPTYPE (new, mustdef);
451   MUSTDEF_RESULT (new) = op;
452   MUSTDEF_KILL (new) = op;
453   INITIALIZE_USE (MUSTDEF_KILL_PTR (new), &MUSTDEF_KILL (new), stmt);
454   APPEND_OP_AFTER (new, *last);
455 }
456
457 /* Takes elements from build_defs and turns them into def operands of STMT.
458    TODO -- Given that def operands list is not necessarily sorted, merging
459            the operands this way does not make much sense.
460         -- Make build_defs VEC of tree *.  */
461
462 static inline void
463 finalize_ssa_def_ops (tree stmt)
464 {
465   unsigned new_i;
466   struct def_optype_d new_list;
467   def_optype_p old_ops, last;
468   tree *old_base;
469
470   new_list.next = NULL;
471   last = &new_list;
472
473   old_ops = DEF_OPS (stmt);
474
475   new_i = 0;
476   while (old_ops && new_i < VEC_length (tree, build_defs))
477     {
478       tree *new_base = (tree *) VEC_index (tree, build_defs, new_i);
479       old_base = DEF_OP_PTR (old_ops);
480
481       if (old_base == new_base)
482         {
483           /* if variables are the same, reuse this node.  */
484           MOVE_HEAD_AFTER (old_ops, last);
485           new_i++;
486         }
487       else if (old_base < new_base)
488         {
489           /* if old is less than new, old goes to the free list.  */
490           MOVE_HEAD_TO_FREELIST (old_ops, def);
491         }
492       else
493         {
494           /* This is a new operand.  */
495           add_def_op (new_base, &last);
496           new_i++;
497         }
498     }
499
500   /* If there is anything remaining in the build_defs list, simply emit it.  */
501   for ( ; new_i < VEC_length (tree, build_defs); new_i++)
502     add_def_op ((tree *) VEC_index (tree, build_defs, new_i), &last);
503
504   last->next = NULL;
505
506   /* If there is anything in the old list, free it.  */
507   if (old_ops)
508     {
509       old_ops->next = gimple_ssa_operands (cfun)->free_defs;
510       gimple_ssa_operands (cfun)->free_defs = old_ops;
511     }
512
513   /* Now set the stmt's operands.  */
514   DEF_OPS (stmt) = new_list.next;
515
516 #ifdef ENABLE_CHECKING
517   {
518     def_optype_p ptr;
519     unsigned x = 0;
520     for (ptr = DEF_OPS (stmt); ptr; ptr = ptr->next)
521       x++;
522
523     gcc_assert (x == VEC_length (tree, build_defs));
524   }
525 #endif
526 }
527
528 /* This routine will create stmt operands for STMT from the def build list.  */
529
530 static void
531 finalize_ssa_defs (tree stmt)
532 {
533   unsigned int num = VEC_length (tree, build_defs);
534
535   /* There should only be a single real definition per assignment.  */
536   gcc_assert ((stmt && TREE_CODE (stmt) != GIMPLE_MODIFY_STMT) || num <= 1);
537
538   /* If there is an old list, often the new list is identical, or close, so
539      find the elements at the beginning that are the same as the vector.  */
540   finalize_ssa_def_ops (stmt);
541   VEC_truncate (tree, build_defs, 0);
542 }
543
544 /* Takes elements from build_uses and turns them into use operands of STMT.
545    TODO -- Make build_uses VEC of tree *.  */
546
547 static inline void
548 finalize_ssa_use_ops (tree stmt)
549 {
550   unsigned new_i;
551   struct use_optype_d new_list;
552   use_optype_p old_ops, ptr, last;
553
554   new_list.next = NULL;
555   last = &new_list;
556
557   old_ops = USE_OPS (stmt);
558
559   /* If there is anything in the old list, free it.  */
560   if (old_ops)
561     {
562       for (ptr = old_ops; ptr; ptr = ptr->next)
563         delink_imm_use (USE_OP_PTR (ptr));
564       old_ops->next = gimple_ssa_operands (cfun)->free_uses;
565       gimple_ssa_operands (cfun)->free_uses = old_ops;
566     }
567
568   /* Now create nodes for all the new nodes.  */
569   for (new_i = 0; new_i < VEC_length (tree, build_uses); new_i++)
570     add_use_op (stmt, (tree *) VEC_index (tree, build_uses, new_i), &last);
571
572   last->next = NULL;
573
574   /* Now set the stmt's operands.  */
575   USE_OPS (stmt) = new_list.next;
576
577 #ifdef ENABLE_CHECKING
578   {
579     unsigned x = 0;
580     for (ptr = USE_OPS (stmt); ptr; ptr = ptr->next)
581       x++;
582
583     gcc_assert (x == VEC_length (tree, build_uses));
584   }
585 #endif
586 }
587
588 /* Return a new use operand vector for STMT, comparing to OLD_OPS_P.  */
589                                                                               
590 static void
591 finalize_ssa_uses (tree stmt)
592 {
593 #ifdef ENABLE_CHECKING
594   {
595     unsigned x;
596     unsigned num = VEC_length (tree, build_uses);
597
598     /* If the pointer to the operand is the statement itself, something is
599        wrong.  It means that we are pointing to a local variable (the 
600        initial call to update_stmt_operands does not pass a pointer to a 
601        statement).  */
602     for (x = 0; x < num; x++)
603       gcc_assert (*((tree *)VEC_index (tree, build_uses, x)) != stmt);
604   }
605 #endif
606   finalize_ssa_use_ops (stmt);
607   VEC_truncate (tree, build_uses, 0);
608 }
609
610
611 /* Takes elements from build_v_may_defs and turns them into maydef operands of
612    STMT.  */
613
614 static inline void
615 finalize_ssa_v_may_def_ops (tree stmt)
616 {
617   unsigned new_i;
618   struct maydef_optype_d new_list;
619   maydef_optype_p old_ops, ptr, last;
620   tree act;
621   unsigned old_base, new_base;
622
623   new_list.next = NULL;
624   last = &new_list;
625
626   old_ops = MAYDEF_OPS (stmt);
627
628   new_i = 0;
629   while (old_ops && new_i < VEC_length (tree, build_v_may_defs))
630     {
631       act = VEC_index (tree, build_v_may_defs, new_i);
632       new_base = get_name_decl (act);
633       old_base = get_name_decl (MAYDEF_OP (old_ops));
634
635       if (old_base == new_base)
636         {
637           /* if variables are the same, reuse this node.  */
638           MOVE_HEAD_AFTER (old_ops, last);
639           set_virtual_use_link (MAYDEF_OP_PTR (last), stmt);
640           new_i++;
641         }
642       else if (old_base < new_base)
643         {
644           /* if old is less than new, old goes to the free list.  */
645           delink_imm_use (MAYDEF_OP_PTR (old_ops));
646           MOVE_HEAD_TO_FREELIST (old_ops, maydef);
647         }
648       else
649         {
650           /* This is a new operand.  */
651           add_maydef_op (stmt, act, &last);
652           new_i++;
653         }
654     }
655
656   /* If there is anything remaining in the build_v_may_defs list, simply emit it.  */
657   for ( ; new_i < VEC_length (tree, build_v_may_defs); new_i++)
658     add_maydef_op (stmt, VEC_index (tree, build_v_may_defs, new_i), &last);
659
660   last->next = NULL;
661
662   /* If there is anything in the old list, free it.  */
663   if (old_ops)
664     {
665       for (ptr = old_ops; ptr; ptr = ptr->next)
666         delink_imm_use (MAYDEF_OP_PTR (ptr));
667       old_ops->next = gimple_ssa_operands (cfun)->free_maydefs;
668       gimple_ssa_operands (cfun)->free_maydefs = old_ops;
669     }
670
671   /* Now set the stmt's operands.  */
672   MAYDEF_OPS (stmt) = new_list.next;
673
674 #ifdef ENABLE_CHECKING
675   {
676     unsigned x = 0;
677     for (ptr = MAYDEF_OPS (stmt); ptr; ptr = ptr->next)
678       x++;
679
680     gcc_assert (x == VEC_length (tree, build_v_may_defs));
681   }
682 #endif
683 }
684
685 static void
686 finalize_ssa_v_may_defs (tree stmt)
687 {
688   finalize_ssa_v_may_def_ops (stmt);
689 }
690                                                                                
691
692 /* Clear the in_list bits and empty the build array for V_MAY_DEFs.  */
693
694 static inline void
695 cleanup_v_may_defs (void)
696 {
697   unsigned x, num;
698   num = VEC_length (tree, build_v_may_defs);
699
700   for (x = 0; x < num; x++)
701     {
702       tree t = VEC_index (tree, build_v_may_defs, x);
703       if (TREE_CODE (t) != SSA_NAME)
704         {
705           var_ann_t ann = var_ann (t);
706           ann->in_v_may_def_list = 0;
707         }
708     }
709   VEC_truncate (tree, build_v_may_defs, 0);
710 }                                                                             
711
712
713 /* Takes elements from build_vuses and turns them into vuse operands of
714    STMT.  */
715
716 static inline void
717 finalize_ssa_vuse_ops (tree stmt)
718 {
719   unsigned new_i;
720   struct vuse_optype_d new_list;
721   vuse_optype_p old_ops, ptr, last;
722   tree act;
723   unsigned old_base, new_base;
724
725   new_list.next = NULL;
726   last = &new_list;
727
728   old_ops = VUSE_OPS (stmt);
729
730   new_i = 0;
731   while (old_ops && new_i < VEC_length (tree, build_vuses))
732     {
733       act = VEC_index (tree, build_vuses, new_i);
734       new_base = get_name_decl (act);
735       old_base = get_name_decl (VUSE_OP (old_ops));
736
737       if (old_base == new_base)
738         {
739           /* if variables are the same, reuse this node.  */
740           MOVE_HEAD_AFTER (old_ops, last);
741           set_virtual_use_link (VUSE_OP_PTR (last), stmt);
742           new_i++;
743         }
744       else if (old_base < new_base)
745         {
746           /* if old is less than new, old goes to the free list.  */
747           delink_imm_use (USE_OP_PTR (old_ops));
748           MOVE_HEAD_TO_FREELIST (old_ops, vuse);
749         }
750       else
751         {
752           /* This is a new operand.  */
753           add_vuse_op (stmt, act, &last);
754           new_i++;
755         }
756     }
757
758   /* If there is anything remaining in the build_vuses list, simply emit it.  */
759   for ( ; new_i < VEC_length (tree, build_vuses); new_i++)
760     add_vuse_op (stmt, VEC_index (tree, build_vuses, new_i), &last);
761
762   last->next = NULL;
763
764   /* If there is anything in the old list, free it.  */
765   if (old_ops)
766     {
767       for (ptr = old_ops; ptr; ptr = ptr->next)
768         delink_imm_use (VUSE_OP_PTR (ptr));
769       old_ops->next = gimple_ssa_operands (cfun)->free_vuses;
770       gimple_ssa_operands (cfun)->free_vuses = old_ops;
771     }
772
773   /* Now set the stmt's operands.  */
774   VUSE_OPS (stmt) = new_list.next;
775
776 #ifdef ENABLE_CHECKING
777   {
778     unsigned x = 0;
779     for (ptr = VUSE_OPS (stmt); ptr; ptr = ptr->next)
780       x++;
781
782     gcc_assert (x == VEC_length (tree, build_vuses));
783   }
784 #endif
785 }
786                                                                               
787 /* Return a new VUSE operand vector, comparing to OLD_OPS_P.  */
788                                                                               
789 static void
790 finalize_ssa_vuses (tree stmt)
791 {
792   unsigned num, num_v_may_defs;
793   unsigned vuse_index;
794
795   /* Remove superfluous VUSE operands.  If the statement already has a
796      V_MAY_DEF operation for a variable 'a', then a VUSE for 'a' is
797      not needed because V_MAY_DEFs imply a VUSE of the variable.  For
798      instance, suppose that variable 'a' is aliased:
799
800               # VUSE <a_2>
801               # a_3 = V_MAY_DEF <a_2>
802               a = a + 1;
803
804      The VUSE <a_2> is superfluous because it is implied by the
805      V_MAY_DEF operation.  */
806   num = VEC_length (tree, build_vuses);
807   num_v_may_defs = VEC_length (tree, build_v_may_defs);
808
809   if (num > 0 && num_v_may_defs > 0)
810     {
811       for (vuse_index = 0; vuse_index < VEC_length (tree, build_vuses); )
812         {
813           tree vuse;
814           vuse = VEC_index (tree, build_vuses, vuse_index);
815           if (TREE_CODE (vuse) != SSA_NAME)
816             {
817               var_ann_t ann = var_ann (vuse);
818               ann->in_vuse_list = 0;
819               if (ann->in_v_may_def_list)
820                 {
821                   VEC_ordered_remove (tree, build_vuses, vuse_index);
822                   continue;
823                 }
824             }
825           vuse_index++;
826         }
827     }
828   else
829     {
830       /* Clear out the in_list bits.  */
831       for (vuse_index = 0;
832           vuse_index < VEC_length (tree, build_vuses);
833           vuse_index++)
834         {
835           tree t = VEC_index (tree, build_vuses, vuse_index);
836           if (TREE_CODE (t) != SSA_NAME)
837             {
838               var_ann_t ann = var_ann (t);
839               ann->in_vuse_list = 0;
840             }
841         }
842     }
843
844   finalize_ssa_vuse_ops (stmt);
845
846   /* The V_MAY_DEF build vector wasn't cleaned up because we needed it.  */
847   cleanup_v_may_defs ();
848                                                                               
849   /* Free the VUSEs build vector.  */
850   VEC_truncate (tree, build_vuses, 0);
851
852 }
853
854 /* Takes elements from build_v_must_defs and turns them into mustdef operands of
855    STMT.  */
856
857 static inline void
858 finalize_ssa_v_must_def_ops (tree stmt)
859 {
860   unsigned new_i;
861   struct mustdef_optype_d new_list;
862   mustdef_optype_p old_ops, ptr, last;
863   tree act;
864   unsigned old_base, new_base;
865
866   new_list.next = NULL;
867   last = &new_list;
868
869   old_ops = MUSTDEF_OPS (stmt);
870
871   new_i = 0;
872   while (old_ops && new_i < VEC_length (tree, build_v_must_defs))
873     {
874       act = VEC_index (tree, build_v_must_defs, new_i);
875       new_base = get_name_decl (act);
876       old_base = get_name_decl (MUSTDEF_KILL (old_ops));
877
878       if (old_base == new_base)
879         {
880           /* If variables are the same, reuse this node.  */
881           MOVE_HEAD_AFTER (old_ops, last);
882           set_virtual_use_link (MUSTDEF_KILL_PTR (last), stmt);
883           new_i++;
884         }
885       else if (old_base < new_base)
886         {
887           /* If old is less than new, old goes to the free list.  */
888           delink_imm_use (MUSTDEF_KILL_PTR (old_ops));
889           MOVE_HEAD_TO_FREELIST (old_ops, mustdef);
890         }
891       else
892         {
893           /* This is a new operand.  */
894           add_mustdef_op (stmt, act, &last);
895           new_i++;
896         }
897     }
898
899   /* If there is anything remaining in the build_v_must_defs list, simply emit it.  */
900   for ( ; new_i < VEC_length (tree, build_v_must_defs); new_i++)
901     add_mustdef_op (stmt, VEC_index (tree, build_v_must_defs, new_i), &last);
902
903   last->next = NULL;
904
905   /* If there is anything in the old list, free it.  */
906   if (old_ops)
907     {
908       for (ptr = old_ops; ptr; ptr = ptr->next)
909         delink_imm_use (MUSTDEF_KILL_PTR (ptr));
910       old_ops->next = gimple_ssa_operands (cfun)->free_mustdefs;
911       gimple_ssa_operands (cfun)->free_mustdefs = old_ops;
912     }
913
914   /* Now set the stmt's operands.  */
915   MUSTDEF_OPS (stmt) = new_list.next;
916
917 #ifdef ENABLE_CHECKING
918   {
919     unsigned x = 0;
920     for (ptr = MUSTDEF_OPS (stmt); ptr; ptr = ptr->next)
921       x++;
922
923     gcc_assert (x == VEC_length (tree, build_v_must_defs));
924   }
925 #endif
926 }
927
928 static void
929 finalize_ssa_v_must_defs (tree stmt)
930 {
931   /* In the presence of subvars, there may be more than one V_MUST_DEF
932      per statement (one for each subvar).  It is a bit expensive to
933      verify that all must-defs in a statement belong to subvars if
934      there is more than one must-def, so we don't do it.  Suffice to
935      say, if you reach here without having subvars, and have num >1,
936      you have hit a bug.  */
937   finalize_ssa_v_must_def_ops (stmt);
938   VEC_truncate (tree, build_v_must_defs, 0);
939 }
940
941
942 /* Finalize all the build vectors, fill the new ones into INFO.  */
943                                                                               
944 static inline void
945 finalize_ssa_stmt_operands (tree stmt)
946 {
947   finalize_ssa_defs (stmt);
948   finalize_ssa_uses (stmt);
949   finalize_ssa_v_must_defs (stmt);
950   finalize_ssa_v_may_defs (stmt);
951   finalize_ssa_vuses (stmt);
952 }
953
954
955 /* Start the process of building up operands vectors in INFO.  */
956
957 static inline void
958 start_ssa_stmt_operands (void)
959 {
960   gcc_assert (VEC_length (tree, build_defs) == 0);
961   gcc_assert (VEC_length (tree, build_uses) == 0);
962   gcc_assert (VEC_length (tree, build_vuses) == 0);
963   gcc_assert (VEC_length (tree, build_v_may_defs) == 0);
964   gcc_assert (VEC_length (tree, build_v_must_defs) == 0);
965 }
966
967
968 /* Add DEF_P to the list of pointers to operands.  */
969
970 static inline void
971 append_def (tree *def_p)
972 {
973   VEC_safe_push (tree, heap, build_defs, (tree)def_p);
974 }
975
976
977 /* Add USE_P to the list of pointers to operands.  */
978
979 static inline void
980 append_use (tree *use_p)
981 {
982   VEC_safe_push (tree, heap, build_uses, (tree)use_p);
983 }
984
985
986 /* Add a new virtual may def for variable VAR to the build array.  */
987
988 static inline void
989 append_v_may_def (tree var)
990 {
991   if (TREE_CODE (var) != SSA_NAME)
992     {
993       var_ann_t ann = get_var_ann (var);
994
995       /* Don't allow duplicate entries.  */
996       if (ann->in_v_may_def_list)
997         return;
998       ann->in_v_may_def_list = 1;
999     }
1000
1001   VEC_safe_push (tree, heap, build_v_may_defs, (tree)var);
1002 }
1003
1004
1005 /* Add VAR to the list of virtual uses.  */
1006
1007 static inline void
1008 append_vuse (tree var)
1009 {
1010   /* Don't allow duplicate entries.  */
1011   if (TREE_CODE (var) != SSA_NAME)
1012     {
1013       var_ann_t ann = get_var_ann (var);
1014
1015       if (ann->in_vuse_list || ann->in_v_may_def_list)
1016         return;
1017       ann->in_vuse_list = 1;
1018     }
1019
1020   VEC_safe_push (tree, heap, build_vuses, (tree)var);
1021 }
1022
1023
1024 /* Add VAR to the list of virtual must definitions for INFO.  */
1025
1026 static inline void
1027 append_v_must_def (tree var)
1028 {
1029   unsigned i;
1030
1031   /* Don't allow duplicate entries.  */
1032   for (i = 0; i < VEC_length (tree, build_v_must_defs); i++)
1033     if (var == VEC_index (tree, build_v_must_defs, i))
1034       return;
1035
1036   VEC_safe_push (tree, heap, build_v_must_defs, (tree)var);
1037 }
1038
1039
1040 /* REF is a tree that contains the entire pointer dereference
1041    expression, if available, or NULL otherwise.  ALIAS is the variable
1042    we are asking if REF can access.  OFFSET and SIZE come from the
1043    memory access expression that generated this virtual operand.  */
1044
1045 static bool
1046 access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
1047                            HOST_WIDE_INT size)
1048 {  
1049   bool offsetgtz = offset > 0;
1050   unsigned HOST_WIDE_INT uoffset = (unsigned HOST_WIDE_INT) offset;
1051   tree base = ref ? get_base_address (ref) : NULL;
1052
1053   /* If ALIAS is .GLOBAL_VAR then the memory reference REF must be
1054      using a call-clobbered memory tag.  By definition, call-clobbered
1055      memory tags can always touch .GLOBAL_VAR.  */
1056   if (alias == gimple_global_var (cfun))
1057     return true;
1058
1059   /* If ALIAS is an SFT, it can't be touched if the offset     
1060      and size of the access is not overlapping with the SFT offset and
1061      size.  This is only true if we are accessing through a pointer
1062      to a type that is the same as SFT_PARENT_VAR.  Otherwise, we may
1063      be accessing through a pointer to some substruct of the
1064      structure, and if we try to prune there, we will have the wrong
1065      offset, and get the wrong answer.
1066      i.e., we can't prune without more work if we have something like
1067
1068      struct gcc_target
1069      {
1070        struct asm_out
1071        {
1072          const char *byte_op;
1073          struct asm_int_op
1074          {    
1075            const char *hi;
1076          } aligned_op;
1077        } asm_out;
1078      } targetm;
1079      
1080      foo = &targetm.asm_out.aligned_op;
1081      return foo->hi;
1082
1083      SFT.1, which represents hi, will have SFT_OFFSET=32 because in
1084      terms of SFT_PARENT_VAR, that is where it is.
1085      However, the access through the foo pointer will be at offset 0.  */
1086   if (size != -1
1087       && TREE_CODE (alias) == STRUCT_FIELD_TAG
1088       && base
1089       && TREE_TYPE (base) == TREE_TYPE (SFT_PARENT_VAR (alias))
1090       && !overlap_subvar (offset, size, alias, NULL))
1091     {
1092 #ifdef ACCESS_DEBUGGING
1093       fprintf (stderr, "Access to ");
1094       print_generic_expr (stderr, ref, 0);
1095       fprintf (stderr, " may not touch ");
1096       print_generic_expr (stderr, alias, 0);
1097       fprintf (stderr, " in function %s\n", get_name (current_function_decl));
1098 #endif
1099       return false;
1100     }
1101
1102   /* Without strict aliasing, it is impossible for a component access
1103      through a pointer to touch a random variable, unless that
1104      variable *is* a structure or a pointer.
1105
1106      That is, given p->c, and some random global variable b,
1107      there is no legal way that p->c could be an access to b.
1108      
1109      Without strict aliasing on, we consider it legal to do something
1110      like:
1111
1112      struct foos { int l; };
1113      int foo;
1114      static struct foos *getfoo(void);
1115      int main (void)
1116      {
1117        struct foos *f = getfoo();
1118        f->l = 1;
1119        foo = 2;
1120        if (f->l == 1)
1121          abort();
1122        exit(0);
1123      }
1124      static struct foos *getfoo(void)     
1125      { return (struct foos *)&foo; }
1126      
1127      (taken from 20000623-1.c)
1128
1129      The docs also say/imply that access through union pointers
1130      is legal (but *not* if you take the address of the union member,
1131      i.e. the inverse), such that you can do
1132
1133      typedef union {
1134        int d;
1135      } U;
1136
1137      int rv;
1138      void breakme()
1139      {
1140        U *rv0;
1141        U *pretmp = (U*)&rv;
1142        rv0 = pretmp;
1143        rv0->d = 42;    
1144      }
1145      To implement this, we just punt on accesses through union
1146      pointers entirely.
1147   */
1148   else if (ref 
1149            && flag_strict_aliasing
1150            && TREE_CODE (ref) != INDIRECT_REF
1151            && !MTAG_P (alias)
1152            && (TREE_CODE (base) != INDIRECT_REF
1153                || TREE_CODE (TREE_TYPE (base)) != UNION_TYPE)
1154            && !AGGREGATE_TYPE_P (TREE_TYPE (alias))
1155            && TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE
1156            && !var_ann (alias)->is_heapvar
1157            /* When the struct has may_alias attached to it, we need not to
1158               return true.  */
1159            && get_alias_set (base))
1160     {
1161 #ifdef ACCESS_DEBUGGING
1162       fprintf (stderr, "Access to ");
1163       print_generic_expr (stderr, ref, 0);
1164       fprintf (stderr, " may not touch ");
1165       print_generic_expr (stderr, alias, 0);
1166       fprintf (stderr, " in function %s\n", get_name (current_function_decl));
1167 #endif
1168       return false;
1169     }
1170
1171   /* If the offset of the access is greater than the size of one of
1172      the possible aliases, it can't be touching that alias, because it
1173      would be past the end of the structure.  */
1174   else if (ref
1175            && flag_strict_aliasing
1176            && TREE_CODE (ref) != INDIRECT_REF
1177            && !MTAG_P (alias)
1178            && !POINTER_TYPE_P (TREE_TYPE (alias))
1179            && offsetgtz
1180            && DECL_SIZE (alias)
1181            && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST
1182            && uoffset > TREE_INT_CST_LOW (DECL_SIZE (alias)))
1183     {
1184 #ifdef ACCESS_DEBUGGING
1185       fprintf (stderr, "Access to ");
1186       print_generic_expr (stderr, ref, 0);
1187       fprintf (stderr, " may not touch ");
1188       print_generic_expr (stderr, alias, 0);
1189       fprintf (stderr, " in function %s\n", get_name (current_function_decl));
1190 #endif
1191       return false;
1192     }      
1193
1194   return true;
1195 }
1196
1197
1198 /* Add VAR to the virtual operands array.  FLAGS is as in
1199    get_expr_operands.  FULL_REF is a tree that contains the entire
1200    pointer dereference expression, if available, or NULL otherwise.
1201    OFFSET and SIZE come from the memory access expression that
1202    generated this virtual operand.  FOR_CLOBBER is true is this is
1203    adding a virtual operand for a call clobber.  */
1204
1205 static void 
1206 add_virtual_operand (tree var, stmt_ann_t s_ann, int flags,
1207                      tree full_ref, HOST_WIDE_INT offset,
1208                      HOST_WIDE_INT size, bool for_clobber)
1209 {
1210   VEC(tree,gc) *aliases;
1211   tree sym;
1212   var_ann_t v_ann;
1213   
1214   sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
1215   v_ann = var_ann (sym);
1216   
1217   /* Mark statements with volatile operands.  Optimizers should back
1218      off from statements having volatile operands.  */
1219   if (TREE_THIS_VOLATILE (sym) && s_ann)
1220     s_ann->has_volatile_ops = true;
1221
1222   /* If the variable cannot be modified and this is a V_MAY_DEF change
1223      it into a VUSE.  This happens when read-only variables are marked
1224      call-clobbered and/or aliased to writable variables.  So we only
1225      check that this only happens on non-specific stores.
1226
1227      Note that if this is a specific store, i.e. associated with a
1228      gimple_modify_stmt, then we can't suppress the V_MAY_DEF, lest we run
1229      into validation problems.
1230
1231      This can happen when programs cast away const, leaving us with a
1232      store to read-only memory.  If the statement is actually executed
1233      at runtime, then the program is ill formed.  If the statement is
1234      not executed then all is well.  At the very least, we cannot ICE.  */
1235   if ((flags & opf_non_specific) && unmodifiable_var_p (var))
1236     flags &= ~(opf_is_def | opf_kill_def);
1237   
1238   /* The variable is not a GIMPLE register.  Add it (or its aliases) to
1239      virtual operands, unless the caller has specifically requested
1240      not to add virtual operands (used when adding operands inside an
1241      ADDR_EXPR expression).  */
1242   if (flags & opf_no_vops)
1243     return;
1244   
1245   aliases = v_ann->may_aliases;
1246   if (aliases == NULL)
1247     {
1248       /* The variable is not aliased or it is an alias tag.  */
1249       if (flags & opf_is_def)
1250         {
1251           if (flags & opf_kill_def)
1252             {
1253               /* V_MUST_DEF for non-aliased, non-GIMPLE register 
1254                  variable definitions.  */
1255               gcc_assert (!MTAG_P (var)
1256                           || TREE_CODE (var) == STRUCT_FIELD_TAG);
1257               append_v_must_def (var);
1258             }
1259           else
1260             {
1261               /* Add a V_MAY_DEF for call-clobbered variables and
1262                  memory tags.  */
1263               append_v_may_def (var);
1264             }
1265         }
1266       else
1267         append_vuse (var);
1268     }
1269   else
1270     {
1271       unsigned i;
1272       tree al;
1273       
1274       /* The variable is aliased.  Add its aliases to the virtual
1275          operands.  */
1276       gcc_assert (VEC_length (tree, aliases) != 0);
1277       
1278       if (flags & opf_is_def)
1279         {
1280           
1281           bool none_added = true;
1282
1283           for (i = 0; VEC_iterate (tree, aliases, i, al); i++)
1284             {
1285               if (!access_can_touch_variable (full_ref, al, offset, size))
1286                 continue;
1287               
1288               none_added = false;
1289               append_v_may_def (al);
1290             }
1291
1292           /* If the variable is also an alias tag, add a virtual
1293              operand for it, otherwise we will miss representing
1294              references to the members of the variable's alias set.          
1295              This fixes the bug in gcc.c-torture/execute/20020503-1.c.
1296              
1297              It is also necessary to add bare defs on clobbers for
1298              SMT's, so that bare SMT uses caused by pruning all the
1299              aliases will link up properly with calls.   In order to
1300              keep the number of these bare defs we add down to the
1301              minimum necessary, we keep track of which SMT's were used
1302              alone in statement vdefs or VUSEs.  */
1303           if (v_ann->is_aliased
1304               || none_added
1305               || (TREE_CODE (var) == SYMBOL_MEMORY_TAG
1306                   && for_clobber))
1307             {
1308               append_v_may_def (var);
1309             }
1310         }
1311       else
1312         {
1313           bool none_added = true;
1314           for (i = 0; VEC_iterate (tree, aliases, i, al); i++)
1315             {
1316               if (!access_can_touch_variable (full_ref, al, offset, size))
1317                 continue;
1318               none_added = false;
1319               append_vuse (al);
1320             }
1321
1322           /* Similarly, append a virtual uses for VAR itself, when
1323              it is an alias tag.  */
1324           if (v_ann->is_aliased || none_added)
1325             append_vuse (var);
1326         }
1327     }
1328 }
1329
1330
1331 /* Add *VAR_P to the appropriate operand array for S_ANN.  FLAGS is as in
1332    get_expr_operands.  If *VAR_P is a GIMPLE register, it will be added to
1333    the statement's real operands, otherwise it is added to virtual
1334    operands.  */
1335
1336 static void
1337 add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags)
1338 {
1339   bool is_real_op;
1340   tree var, sym;
1341   var_ann_t v_ann;
1342
1343   var = *var_p;
1344   gcc_assert (SSA_VAR_P (var));
1345
1346   is_real_op = is_gimple_reg (var);
1347
1348   /* If this is a real operand, the operand is either an SSA name or a 
1349      decl.  Virtual operands may only be decls.  */
1350   gcc_assert (is_real_op || DECL_P (var));
1351
1352   sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
1353   v_ann = var_ann (sym);
1354
1355   /* Mark statements with volatile operands.  Optimizers should back
1356      off from statements having volatile operands.  */
1357   if (TREE_THIS_VOLATILE (sym) && s_ann)
1358     s_ann->has_volatile_ops = true;
1359
1360   if (is_real_op)
1361     {
1362       /* The variable is a GIMPLE register.  Add it to real operands.  */
1363       if (flags & opf_is_def)
1364         append_def (var_p);
1365       else
1366         append_use (var_p);
1367     }
1368   else
1369     add_virtual_operand (var, s_ann, flags, NULL_TREE, 0, -1, false);
1370 }
1371
1372
1373 /* A subroutine of get_expr_operands to handle INDIRECT_REF,
1374    ALIGN_INDIRECT_REF and MISALIGNED_INDIRECT_REF.  
1375
1376    STMT is the statement being processed, EXPR is the INDIRECT_REF
1377       that got us here.
1378    
1379    FLAGS is as in get_expr_operands.
1380
1381    FULL_REF contains the full pointer dereference expression, if we
1382       have it, or NULL otherwise.
1383
1384    OFFSET and SIZE are the location of the access inside the
1385       dereferenced pointer, if known.
1386
1387    RECURSE_ON_BASE should be set to true if we want to continue
1388       calling get_expr_operands on the base pointer, and false if
1389       something else will do it for us.  */
1390
1391 static void
1392 get_indirect_ref_operands (tree stmt, tree expr, int flags,
1393                            tree full_ref,
1394                            HOST_WIDE_INT offset, HOST_WIDE_INT size,
1395                            bool recurse_on_base)
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_virtual_operand (pi->name_mem_tag, s_ann, flags,
1415                                full_ref, offset, size, false);
1416         }
1417       else
1418         {
1419           /* If PTR is not an SSA_NAME or it doesn't have a name
1420              tag, use its symbol memory tag.  */
1421           var_ann_t v_ann;
1422
1423           /* If we are emitting debugging dumps, display a warning if
1424              PTR is an SSA_NAME with no flow-sensitive alias
1425              information.  That means that we may need to compute
1426              aliasing again.  */
1427           if (dump_file
1428               && TREE_CODE (ptr) == SSA_NAME
1429               && pi == NULL)
1430             {
1431               fprintf (dump_file,
1432                   "NOTE: no flow-sensitive alias info for ");
1433               print_generic_expr (dump_file, ptr, dump_flags);
1434               fprintf (dump_file, " in ");
1435               print_generic_stmt (dump_file, stmt, dump_flags);
1436             }
1437
1438           if (TREE_CODE (ptr) == SSA_NAME)
1439             ptr = SSA_NAME_VAR (ptr);
1440           v_ann = var_ann (ptr);
1441
1442           if (v_ann->symbol_mem_tag)
1443             add_virtual_operand (v_ann->symbol_mem_tag, s_ann, flags,
1444                                  full_ref, offset, size, false);
1445         }
1446     }
1447   else if (TREE_CODE (ptr) == INTEGER_CST)
1448     {
1449       /* If a constant is used as a pointer, we can't generate a real
1450          operand for it but we mark the statement volatile to prevent
1451          optimizations from messing things up.  */
1452       if (s_ann)
1453         s_ann->has_volatile_ops = true;
1454       return;
1455     }
1456   else
1457     {
1458       /* Ok, this isn't even is_gimple_min_invariant.  Something's broke.  */
1459       gcc_unreachable ();
1460     }
1461
1462   /* If requested, add a USE operand for the base pointer.  */
1463   if (recurse_on_base)
1464     get_expr_operands (stmt, pptr, opf_none);
1465 }
1466
1467
1468 /* A subroutine of get_expr_operands to handle TARGET_MEM_REF.  */
1469
1470 static void
1471 get_tmr_operands (tree stmt, tree expr, int flags)
1472 {
1473   tree tag = TMR_TAG (expr), ref;
1474   HOST_WIDE_INT offset, size, maxsize;
1475   subvar_t svars, sv;
1476   stmt_ann_t s_ann = stmt_ann (stmt);
1477
1478   /* First record the real operands.  */
1479   get_expr_operands (stmt, &TMR_BASE (expr), opf_none);
1480   get_expr_operands (stmt, &TMR_INDEX (expr), opf_none);
1481
1482   /* MEM_REFs should never be killing.  */
1483   flags &= ~opf_kill_def;
1484
1485   if (TMR_SYMBOL (expr))
1486     {
1487       stmt_ann_t ann = stmt_ann (stmt);
1488       add_to_addressable_set (TMR_SYMBOL (expr), &ann->addresses_taken);
1489     }
1490
1491   if (!tag)
1492     {
1493       /* Something weird, so ensure that we will be careful.  */
1494       stmt_ann (stmt)->has_volatile_ops = true;
1495       return;
1496     }
1497
1498   if (DECL_P (tag))
1499     {
1500       get_expr_operands (stmt, &tag, flags);
1501       return;
1502     }
1503
1504   ref = get_ref_base_and_extent (tag, &offset, &size, &maxsize);
1505   gcc_assert (ref != NULL_TREE);
1506   svars = get_subvars_for_var (ref);
1507   for (sv = svars; sv; sv = sv->next)
1508     {
1509       bool exact;               
1510       if (overlap_subvar (offset, maxsize, sv->var, &exact))
1511         {
1512           int subvar_flags = flags;
1513           if (!exact || size != maxsize)
1514             subvar_flags &= ~opf_kill_def;
1515           add_stmt_operand (&sv->var, s_ann, subvar_flags);
1516         }
1517     }
1518 }
1519
1520
1521 /* Add clobbering definitions for .GLOBAL_VAR or for each of the call
1522    clobbered variables in the function.  */
1523
1524 static void
1525 add_call_clobber_ops (tree stmt, tree callee)
1526 {
1527   unsigned u;
1528   bitmap_iterator bi;
1529   stmt_ann_t s_ann = stmt_ann (stmt);
1530   bitmap not_read_b, not_written_b;
1531   
1532   /* Functions that are not const, pure or never return may clobber
1533      call-clobbered variables.  */
1534   if (s_ann)
1535     s_ann->makes_clobbering_call = true;
1536
1537   /* If we created .GLOBAL_VAR earlier, just use it.  See compute_may_aliases 
1538      for the heuristic used to decide whether to create .GLOBAL_VAR or not.  */
1539   if (gimple_global_var (cfun))
1540     {
1541       tree var = gimple_global_var (cfun);
1542       add_stmt_operand (&var, s_ann, opf_is_def);
1543       return;
1544     }
1545
1546   /* Get info for local and module level statics.  There is a bit
1547      set for each static if the call being processed does not read
1548      or write that variable.  */
1549   not_read_b = callee ? ipa_reference_get_not_read_global (callee) : NULL; 
1550   not_written_b = callee ? ipa_reference_get_not_written_global (callee) : NULL; 
1551   /* Add a V_MAY_DEF operand for every call clobbered variable.  */
1552   EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, u, bi)
1553     {
1554       tree var = referenced_var_lookup (u);
1555       unsigned int escape_mask = var_ann (var)->escape_mask;
1556       tree real_var = var;
1557       bool not_read;
1558       bool not_written;
1559       
1560       /* Not read and not written are computed on regular vars, not
1561          subvars, so look at the parent var if this is an SFT. */
1562       if (TREE_CODE (var) == STRUCT_FIELD_TAG)
1563         real_var = SFT_PARENT_VAR (var);
1564
1565       not_read = not_read_b ? bitmap_bit_p (not_read_b, 
1566                                             DECL_UID (real_var)) : false;
1567       not_written = not_written_b ? bitmap_bit_p (not_written_b, 
1568                                                   DECL_UID (real_var)) : false;
1569       gcc_assert (!unmodifiable_var_p (var));
1570       
1571       clobber_stats.clobbered_vars++;
1572
1573       /* See if this variable is really clobbered by this function.  */
1574
1575       /* Trivial case: Things escaping only to pure/const are not
1576          clobbered by non-pure-const, and only read by pure/const. */
1577       if ((escape_mask & ~(ESCAPE_TO_PURE_CONST)) == 0)
1578         {
1579           tree call = get_call_expr_in (stmt);
1580           if (call_expr_flags (call) & (ECF_CONST | ECF_PURE))
1581             {
1582               add_stmt_operand (&var, s_ann, opf_none);
1583               clobber_stats.unescapable_clobbers_avoided++;
1584               continue;
1585             }
1586           else
1587             {
1588               clobber_stats.unescapable_clobbers_avoided++;
1589               continue;
1590             }
1591         }
1592             
1593       if (not_written)
1594         {
1595           clobber_stats.static_write_clobbers_avoided++;
1596           if (!not_read)
1597             add_stmt_operand (&var, s_ann, opf_none);
1598           else
1599             clobber_stats.static_read_clobbers_avoided++;
1600         }
1601       else
1602         add_virtual_operand (var, s_ann, opf_is_def, NULL, 0, -1, true);
1603     }
1604 }
1605
1606
1607 /* Add VUSE operands for .GLOBAL_VAR or all call clobbered variables in the
1608    function.  */
1609
1610 static void
1611 add_call_read_ops (tree stmt, tree callee)
1612 {
1613   unsigned u;
1614   bitmap_iterator bi;
1615   stmt_ann_t s_ann = stmt_ann (stmt);
1616   bitmap not_read_b;
1617
1618   /* if the function is not pure, it may reference memory.  Add
1619      a VUSE for .GLOBAL_VAR if it has been created.  See add_referenced_var
1620      for the heuristic used to decide whether to create .GLOBAL_VAR.  */
1621   if (gimple_global_var (cfun))
1622     {
1623       tree var = gimple_global_var (cfun);
1624       add_stmt_operand (&var, s_ann, opf_none);
1625       return;
1626     }
1627   
1628   not_read_b = callee ? ipa_reference_get_not_read_global (callee) : NULL; 
1629
1630   /* Add a VUSE for each call-clobbered variable.  */
1631   EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, u, bi)
1632     {
1633       tree var = referenced_var (u);
1634       tree real_var = var;
1635       bool not_read;
1636       
1637       clobber_stats.readonly_clobbers++;
1638
1639       /* Not read and not written are computed on regular vars, not
1640          subvars, so look at the parent var if this is an SFT. */
1641
1642       if (TREE_CODE (var) == STRUCT_FIELD_TAG)
1643         real_var = SFT_PARENT_VAR (var);
1644
1645       not_read = not_read_b ? bitmap_bit_p (not_read_b, DECL_UID (real_var))
1646                             : false;
1647       
1648       if (not_read)
1649         {
1650           clobber_stats.static_readonly_clobbers_avoided++;
1651           continue;
1652         }
1653             
1654       add_stmt_operand (&var, s_ann, opf_none | opf_non_specific);
1655     }
1656 }
1657
1658
1659 /* A subroutine of get_expr_operands to handle CALL_EXPR.  */
1660
1661 static void
1662 get_call_expr_operands (tree stmt, tree expr)
1663 {
1664   tree op;
1665   int call_flags = call_expr_flags (expr);
1666
1667   /* If aliases have been computed already, add V_MAY_DEF or V_USE
1668      operands for all the symbols that have been found to be
1669      call-clobbered.
1670      
1671      Note that if aliases have not been computed, the global effects
1672      of calls will not be included in the SSA web. This is fine
1673      because no optimizer should run before aliases have been
1674      computed.  By not bothering with virtual operands for CALL_EXPRs
1675      we avoid adding superfluous virtual operands, which can be a
1676      significant compile time sink (See PR 15855).  */
1677   if (gimple_aliases_computed_p (cfun)
1678       && !bitmap_empty_p (gimple_call_clobbered_vars (cfun))
1679       && !(call_flags & ECF_NOVOPS))
1680     {
1681       /* A 'pure' or a 'const' function never call-clobbers anything. 
1682          A 'noreturn' function might, but since we don't return anyway 
1683          there is no point in recording that.  */ 
1684       if (TREE_SIDE_EFFECTS (expr)
1685           && !(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN)))
1686         add_call_clobber_ops (stmt, get_callee_fndecl (expr));
1687       else if (!(call_flags & ECF_CONST))
1688         add_call_read_ops (stmt, get_callee_fndecl (expr));
1689     }
1690
1691   /* Find uses in the called function.  */
1692   get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_none);
1693
1694   for (op = TREE_OPERAND (expr, 1); op; op = TREE_CHAIN (op))
1695     get_expr_operands (stmt, &TREE_VALUE (op), opf_none);
1696
1697   get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
1698 }
1699
1700
1701 /* Scan operands in the ASM_EXPR stmt referred to in INFO.  */
1702
1703 static void
1704 get_asm_expr_operands (tree stmt)
1705 {
1706   stmt_ann_t s_ann = stmt_ann (stmt);
1707   int noutputs = list_length (ASM_OUTPUTS (stmt));
1708   const char **oconstraints
1709     = (const char **) alloca ((noutputs) * sizeof (const char *));
1710   int i;
1711   tree link;
1712   const char *constraint;
1713   bool allows_mem, allows_reg, is_inout;
1714
1715   for (i=0, link = ASM_OUTPUTS (stmt); link; ++i, link = TREE_CHAIN (link))
1716     {
1717       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1718       oconstraints[i] = constraint;
1719       parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
1720                                &allows_reg, &is_inout);
1721
1722       /* This should have been split in gimplify_asm_expr.  */
1723       gcc_assert (!allows_reg || !is_inout);
1724
1725       /* Memory operands are addressable.  Note that STMT needs the
1726          address of this operand.  */
1727       if (!allows_reg && allows_mem)
1728         {
1729           tree t = get_base_address (TREE_VALUE (link));
1730           if (t && DECL_P (t) && s_ann)
1731             add_to_addressable_set (t, &s_ann->addresses_taken);
1732         }
1733
1734       get_expr_operands (stmt, &TREE_VALUE (link), opf_is_def);
1735     }
1736
1737   for (link = ASM_INPUTS (stmt); link; link = TREE_CHAIN (link))
1738     {
1739       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1740       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
1741                               oconstraints, &allows_mem, &allows_reg);
1742
1743       /* Memory operands are addressable.  Note that STMT needs the
1744          address of this operand.  */
1745       if (!allows_reg && allows_mem)
1746         {
1747           tree t = get_base_address (TREE_VALUE (link));
1748           if (t && DECL_P (t) && s_ann)
1749             add_to_addressable_set (t, &s_ann->addresses_taken);
1750         }
1751
1752       get_expr_operands (stmt, &TREE_VALUE (link), 0);
1753     }
1754
1755
1756   /* Clobber memory for asm ("" : : : "memory");  */
1757   for (link = ASM_CLOBBERS (stmt); link; link = TREE_CHAIN (link))
1758     if (strcmp (TREE_STRING_POINTER (TREE_VALUE (link)), "memory") == 0)
1759       {
1760         unsigned i;
1761         bitmap_iterator bi;
1762
1763         /* Clobber all call-clobbered variables (or .GLOBAL_VAR if we
1764            decided to group them).  */
1765         if (gimple_global_var (cfun))
1766           {
1767             tree var = gimple_global_var (cfun);
1768             add_stmt_operand (&var, s_ann, opf_is_def);
1769           }
1770         else
1771           EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, i, bi)
1772             {
1773               tree var = referenced_var (i);
1774               add_stmt_operand (&var, s_ann, opf_is_def | opf_non_specific);
1775             }
1776
1777         /* Now clobber all addressables.  */
1778         EXECUTE_IF_SET_IN_BITMAP (gimple_addressable_vars (cfun), 0, i, bi)
1779             {
1780               tree var = referenced_var (i);
1781
1782               /* Subvars are explicitly represented in this list, so
1783                  we don't need the original to be added to the clobber
1784                  ops, but the original *will* be in this list because 
1785                  we keep the addressability of the original
1786                  variable up-to-date so we don't screw up the rest of
1787                  the backend.  */
1788               if (var_can_have_subvars (var)
1789                   && get_subvars_for_var (var) != NULL)
1790                 continue;               
1791
1792               add_stmt_operand (&var, s_ann, opf_is_def | opf_non_specific);
1793             }
1794
1795         break;
1796       }
1797 }
1798
1799
1800 /* Scan operands for the assignment expression EXPR in statement STMT.  */
1801
1802 static void
1803 get_modify_stmt_operands (tree stmt, tree expr)
1804 {
1805   /* First get operands from the RHS.  */
1806   get_expr_operands (stmt, &GIMPLE_STMT_OPERAND (expr, 1), opf_none);
1807
1808   /* For the LHS, use a regular definition (OPF_IS_DEF) for GIMPLE
1809      registers.  If the LHS is a store to memory, we will either need
1810      a preserving definition (V_MAY_DEF) or a killing definition
1811      (V_MUST_DEF).
1812
1813      Preserving definitions are those that modify a part of an
1814      aggregate object for which no subvars have been computed (or the
1815      reference does not correspond exactly to one of them). Stores
1816      through a pointer are also represented with V_MAY_DEF operators.
1817
1818      The determination of whether to use a preserving or a killing
1819      definition is done while scanning the LHS of the assignment.  By
1820      default, assume that we will emit a V_MUST_DEF.  */
1821   get_expr_operands (stmt, &GIMPLE_STMT_OPERAND (expr, 0),
1822                      opf_is_def|opf_kill_def);
1823 }
1824
1825
1826 /* Recursively scan the expression pointed to by EXPR_P in statement
1827    STMT.  FLAGS is one of the OPF_* constants modifying how to
1828    interpret the operands found.  */
1829
1830 static void
1831 get_expr_operands (tree stmt, tree *expr_p, int flags)
1832 {
1833   enum tree_code code;
1834   enum tree_code_class class;
1835   tree expr = *expr_p;
1836   stmt_ann_t s_ann = stmt_ann (stmt);
1837
1838   if (expr == NULL)
1839     return;
1840
1841   code = TREE_CODE (expr);
1842   class = TREE_CODE_CLASS (code);
1843
1844   switch (code)
1845     {
1846     case ADDR_EXPR:
1847       /* Taking the address of a variable does not represent a
1848          reference to it, but the fact that the statement takes its
1849          address will be of interest to some passes (e.g. alias
1850          resolution).  */
1851       add_to_addressable_set (TREE_OPERAND (expr, 0), &s_ann->addresses_taken);
1852
1853       /* If the address is invariant, there may be no interesting
1854          variable references inside.  */
1855       if (is_gimple_min_invariant (expr))
1856         return;
1857
1858       /* Otherwise, there may be variables referenced inside but there
1859          should be no VUSEs created, since the referenced objects are
1860          not really accessed.  The only operands that we should find
1861          here are ARRAY_REF indices which will always be real operands
1862          (GIMPLE does not allow non-registers as array indices).  */
1863       flags |= opf_no_vops;
1864       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1865       return;
1866
1867     case SSA_NAME:
1868     case STRUCT_FIELD_TAG:
1869     case SYMBOL_MEMORY_TAG:
1870     case NAME_MEMORY_TAG:
1871      add_stmt_operand (expr_p, s_ann, flags);
1872      return;
1873
1874     case VAR_DECL:
1875     case PARM_DECL:
1876     case RESULT_DECL:
1877       {
1878         subvar_t svars;
1879         
1880         /* Add the subvars for a variable, if it has subvars, to DEFS
1881            or USES.  Otherwise, add the variable itself.  Whether it
1882            goes to USES or DEFS depends on the operand flags.  */
1883         if (var_can_have_subvars (expr)
1884             && (svars = get_subvars_for_var (expr)))
1885           {
1886             subvar_t sv;
1887             for (sv = svars; sv; sv = sv->next)
1888               add_stmt_operand (&sv->var, s_ann, flags);
1889           }
1890         else
1891           add_stmt_operand (expr_p, s_ann, flags);
1892
1893         return;
1894       }
1895
1896     case MISALIGNED_INDIRECT_REF:
1897       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
1898       /* fall through */
1899
1900     case ALIGN_INDIRECT_REF:
1901     case INDIRECT_REF:
1902       get_indirect_ref_operands (stmt, expr, flags, NULL_TREE, 0, -1, true);
1903       return;
1904
1905     case TARGET_MEM_REF:
1906       get_tmr_operands (stmt, expr, flags);
1907       return;
1908
1909     case ARRAY_REF:
1910     case ARRAY_RANGE_REF:
1911     case COMPONENT_REF:
1912     case REALPART_EXPR:
1913     case IMAGPART_EXPR:
1914       {
1915         tree ref;
1916         HOST_WIDE_INT offset, size, maxsize;
1917         bool none = true;
1918
1919         /* This component reference becomes an access to all of the
1920            subvariables it can touch, if we can determine that, but
1921            *NOT* the real one.  If we can't determine which fields we
1922            could touch, the recursion will eventually get to a
1923            variable and add *all* of its subvars, or whatever is the
1924            minimum correct subset.  */
1925         ref = get_ref_base_and_extent (expr, &offset, &size, &maxsize);
1926         if (SSA_VAR_P (ref) && get_subvars_for_var (ref))
1927           {
1928             subvar_t sv;
1929             subvar_t svars = get_subvars_for_var (ref);
1930
1931             for (sv = svars; sv; sv = sv->next)
1932               {
1933                 bool exact;             
1934
1935                 if (overlap_subvar (offset, maxsize, sv->var, &exact))
1936                   {
1937                     int subvar_flags = flags;
1938                     none = false;
1939                     if (!exact || size != maxsize)
1940                       subvar_flags &= ~opf_kill_def;
1941                     add_stmt_operand (&sv->var, s_ann, subvar_flags);
1942                   }
1943               }
1944
1945             if (!none)
1946               flags |= opf_no_vops;
1947           }
1948         else if (TREE_CODE (ref) == INDIRECT_REF)
1949           {
1950             get_indirect_ref_operands (stmt, ref, flags, expr, offset,
1951                                        maxsize, false);
1952             flags |= opf_no_vops;
1953           }
1954
1955         /* Even if we found subvars above we need to ensure to see
1956            immediate uses for d in s.a[d].  In case of s.a having
1957            a subvar or we would miss it otherwise.  */
1958         get_expr_operands (stmt, &TREE_OPERAND (expr, 0),
1959                            flags & ~opf_kill_def);
1960         
1961         if (code == COMPONENT_REF)
1962           {
1963             if (s_ann && TREE_THIS_VOLATILE (TREE_OPERAND (expr, 1)))
1964               s_ann->has_volatile_ops = true; 
1965             get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
1966           }
1967         else if (code == ARRAY_REF || code == ARRAY_RANGE_REF)
1968           {
1969             get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
1970             get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
1971             get_expr_operands (stmt, &TREE_OPERAND (expr, 3), opf_none);
1972           }
1973
1974         return;
1975       }
1976
1977     case WITH_SIZE_EXPR:
1978       /* WITH_SIZE_EXPR is a pass-through reference to its first argument,
1979          and an rvalue reference to its second argument.  */
1980       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
1981       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1982       return;
1983
1984     case CALL_EXPR:
1985       get_call_expr_operands (stmt, expr);
1986       return;
1987
1988     case COND_EXPR:
1989     case VEC_COND_EXPR:
1990       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_none);
1991       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
1992       get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
1993       return;
1994
1995     case GIMPLE_MODIFY_STMT:
1996       get_modify_stmt_operands (stmt, expr);
1997       return;
1998
1999     case CONSTRUCTOR:
2000       {
2001         /* General aggregate CONSTRUCTORs have been decomposed, but they
2002            are still in use as the COMPLEX_EXPR equivalent for vectors.  */
2003         constructor_elt *ce;
2004         unsigned HOST_WIDE_INT idx;
2005
2006         for (idx = 0;
2007              VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (expr), idx, ce);
2008              idx++)
2009           get_expr_operands (stmt, &ce->value, opf_none);
2010
2011         return;
2012       }
2013
2014     case BIT_FIELD_REF:
2015       /* Stores using BIT_FIELD_REF are always preserving definitions.  */
2016       flags &= ~opf_kill_def;
2017
2018       /* Fallthru  */
2019
2020     case TRUTH_NOT_EXPR:
2021     case VIEW_CONVERT_EXPR:
2022     do_unary:
2023       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2024       return;
2025
2026     case TRUTH_AND_EXPR:
2027     case TRUTH_OR_EXPR:
2028     case TRUTH_XOR_EXPR:
2029     case COMPOUND_EXPR:
2030     case OBJ_TYPE_REF:
2031     case ASSERT_EXPR:
2032     do_binary:
2033       {
2034         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2035         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
2036         return;
2037       }
2038
2039     case DOT_PROD_EXPR:
2040     case REALIGN_LOAD_EXPR:
2041       {
2042         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2043         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
2044         get_expr_operands (stmt, &TREE_OPERAND (expr, 2), flags);
2045         return;
2046       }
2047
2048     case BLOCK:
2049     case FUNCTION_DECL:
2050     case EXC_PTR_EXPR:
2051     case FILTER_EXPR:
2052     case LABEL_DECL:
2053     case CONST_DECL:
2054     case OMP_PARALLEL:
2055     case OMP_SECTIONS:
2056     case OMP_FOR:
2057     case OMP_SINGLE:
2058     case OMP_MASTER:
2059     case OMP_ORDERED:
2060     case OMP_CRITICAL:
2061     case OMP_RETURN:
2062     case OMP_CONTINUE:
2063       /* Expressions that make no memory references.  */
2064       return;
2065
2066     default:
2067       if (class == tcc_unary)
2068         goto do_unary;
2069       if (class == tcc_binary || class == tcc_comparison)
2070         goto do_binary;
2071       if (class == tcc_constant || class == tcc_type)
2072         return;
2073     }
2074
2075   /* If we get here, something has gone wrong.  */
2076 #ifdef ENABLE_CHECKING
2077   fprintf (stderr, "unhandled expression in get_expr_operands():\n");
2078   debug_tree (expr);
2079   fputs ("\n", stderr);
2080 #endif
2081   gcc_unreachable ();
2082 }
2083
2084
2085 /* Parse STMT looking for operands.  When finished, the various
2086    build_* operand vectors will have potential operands in them.  */
2087
2088 static void
2089 parse_ssa_operands (tree stmt)
2090 {
2091   enum tree_code code;
2092
2093   code = TREE_CODE (stmt);
2094   switch (code)
2095     {
2096     case GIMPLE_MODIFY_STMT:
2097       get_modify_stmt_operands (stmt, stmt);
2098       break;
2099
2100     case COND_EXPR:
2101       get_expr_operands (stmt, &COND_EXPR_COND (stmt), opf_none);
2102       break;
2103
2104     case SWITCH_EXPR:
2105       get_expr_operands (stmt, &SWITCH_COND (stmt), opf_none);
2106       break;
2107
2108     case ASM_EXPR:
2109       get_asm_expr_operands (stmt);
2110       break;
2111
2112     case RETURN_EXPR:
2113       get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), opf_none);
2114       break;
2115
2116     case GOTO_EXPR:
2117       get_expr_operands (stmt, &GOTO_DESTINATION (stmt), opf_none);
2118       break;
2119
2120     case LABEL_EXPR:
2121       get_expr_operands (stmt, &LABEL_EXPR_LABEL (stmt), opf_none);
2122       break;
2123
2124     case BIND_EXPR:
2125     case CASE_LABEL_EXPR:
2126     case TRY_CATCH_EXPR:
2127     case TRY_FINALLY_EXPR:
2128     case EH_FILTER_EXPR:
2129     case CATCH_EXPR:
2130     case RESX_EXPR:
2131       /* These nodes contain no variable references.  */
2132       break;
2133
2134     default:
2135       /* Notice that if get_expr_operands tries to use &STMT as the
2136          operand pointer (which may only happen for USE operands), we
2137          will fail in add_stmt_operand.  This default will handle
2138          statements like empty statements, or CALL_EXPRs that may
2139          appear on the RHS of a statement or as statements themselves.  */
2140       get_expr_operands (stmt, &stmt, opf_none);
2141       break;
2142     }
2143 }
2144
2145
2146 /* Create an operands cache for STMT.  */
2147
2148 static void
2149 build_ssa_operands (tree stmt)
2150 {
2151   stmt_ann_t ann = get_stmt_ann (stmt);
2152   
2153   /* Initially assume that the statement has no volatile operands.  */
2154   if (ann)
2155     ann->has_volatile_ops = false;
2156
2157   start_ssa_stmt_operands ();
2158
2159   parse_ssa_operands (stmt);
2160   operand_build_sort_virtual (build_vuses);
2161   operand_build_sort_virtual (build_v_may_defs);
2162   operand_build_sort_virtual (build_v_must_defs);
2163
2164   finalize_ssa_stmt_operands (stmt);
2165 }
2166
2167
2168 /* Free any operands vectors in OPS.  */
2169
2170 void 
2171 free_ssa_operands (stmt_operands_p ops)
2172 {
2173   ops->def_ops = NULL;
2174   ops->use_ops = NULL;
2175   ops->maydef_ops = NULL;
2176   ops->mustdef_ops = NULL;
2177   ops->vuse_ops = NULL;
2178 }
2179
2180
2181 /* Get the operands of statement STMT.  */
2182
2183 void
2184 update_stmt_operands (tree stmt)
2185 {
2186   stmt_ann_t ann = get_stmt_ann (stmt);
2187
2188   /* If update_stmt_operands is called before SSA is initialized, do
2189      nothing.  */
2190   if (!ssa_operands_active ())
2191     return;
2192
2193   /* The optimizers cannot handle statements that are nothing but a
2194      _DECL.  This indicates a bug in the gimplifier.  */
2195   gcc_assert (!SSA_VAR_P (stmt));
2196
2197   gcc_assert (ann->modified);
2198
2199   timevar_push (TV_TREE_OPS);
2200
2201   build_ssa_operands (stmt);
2202
2203   /* Clear the modified bit for STMT.  */
2204   ann->modified = 0;
2205
2206   timevar_pop (TV_TREE_OPS);
2207 }
2208
2209
2210 /* Copies virtual operands from SRC to DST.  */
2211
2212 void
2213 copy_virtual_operands (tree dest, tree src)
2214 {
2215   tree t;
2216   ssa_op_iter iter, old_iter;
2217   use_operand_p use_p, u2;
2218   def_operand_p def_p, d2;
2219
2220   build_ssa_operands (dest);
2221
2222   /* Copy all the virtual fields.  */
2223   FOR_EACH_SSA_TREE_OPERAND (t, src, iter, SSA_OP_VUSE)
2224     append_vuse (t);
2225   FOR_EACH_SSA_TREE_OPERAND (t, src, iter, SSA_OP_VMAYDEF)
2226     append_v_may_def (t);
2227   FOR_EACH_SSA_TREE_OPERAND (t, src, iter, SSA_OP_VMUSTDEF)
2228     append_v_must_def (t);
2229
2230   if (VEC_length (tree, build_vuses) == 0
2231       && VEC_length (tree, build_v_may_defs) == 0
2232       && VEC_length (tree, build_v_must_defs) == 0)
2233     return;
2234
2235   /* Now commit the virtual operands to this stmt.  */
2236   finalize_ssa_v_must_defs (dest);
2237   finalize_ssa_v_may_defs (dest);
2238   finalize_ssa_vuses (dest);
2239
2240   /* Finally, set the field to the same values as then originals.  */
2241   t = op_iter_init_tree (&old_iter, src, SSA_OP_VUSE);
2242   FOR_EACH_SSA_USE_OPERAND (use_p, dest, iter, SSA_OP_VUSE)
2243     {
2244       gcc_assert (!op_iter_done (&old_iter));
2245       SET_USE (use_p, t);
2246       t = op_iter_next_tree (&old_iter);
2247     }
2248   gcc_assert (op_iter_done (&old_iter));
2249
2250   op_iter_init_maydef (&old_iter, src, &u2, &d2);
2251   FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, dest, iter)
2252     {
2253       gcc_assert (!op_iter_done (&old_iter));
2254       SET_USE (use_p, USE_FROM_PTR (u2));
2255       SET_DEF (def_p, DEF_FROM_PTR (d2));
2256       op_iter_next_maymustdef (&u2, &d2, &old_iter);
2257     }
2258   gcc_assert (op_iter_done (&old_iter));
2259
2260   op_iter_init_mustdef (&old_iter, src, &u2, &d2);
2261   FOR_EACH_SSA_MUSTDEF_OPERAND (def_p, use_p, dest, iter)
2262     {
2263       gcc_assert (!op_iter_done (&old_iter));
2264       SET_USE (use_p, USE_FROM_PTR (u2));
2265       SET_DEF (def_p, DEF_FROM_PTR (d2));
2266       op_iter_next_maymustdef (&u2, &d2, &old_iter);
2267     }
2268   gcc_assert (op_iter_done (&old_iter));
2269
2270 }
2271
2272
2273 /* Specifically for use in DOM's expression analysis.  Given a store, we
2274    create an artificial stmt which looks like a load from the store, this can
2275    be used to eliminate redundant loads.  OLD_OPS are the operands from the 
2276    store stmt, and NEW_STMT is the new load which represents a load of the
2277    values stored.  */
2278
2279 void
2280 create_ssa_artficial_load_stmt (tree new_stmt, tree old_stmt)
2281 {
2282   stmt_ann_t ann;
2283   tree op;
2284   ssa_op_iter iter;
2285   use_operand_p use_p;
2286   unsigned x;
2287
2288   ann = get_stmt_ann (new_stmt);
2289
2290   /* Process the stmt looking for operands.  */
2291   start_ssa_stmt_operands ();
2292   parse_ssa_operands (new_stmt);
2293
2294   for (x = 0; x < VEC_length (tree, build_vuses); x++)
2295     {
2296       tree t = VEC_index (tree, build_vuses, x);
2297       if (TREE_CODE (t) != SSA_NAME)
2298         {
2299           var_ann_t ann = var_ann (t);
2300           ann->in_vuse_list = 0;
2301         }
2302     }
2303    
2304   for (x = 0; x < VEC_length (tree, build_v_may_defs); x++)
2305     {
2306       tree t = VEC_index (tree, build_v_may_defs, x);
2307       if (TREE_CODE (t) != SSA_NAME)
2308         {
2309           var_ann_t ann = var_ann (t);
2310           ann->in_v_may_def_list = 0;
2311         }
2312     }
2313
2314   /* Remove any virtual operands that were found.  */
2315   VEC_truncate (tree, build_v_may_defs, 0);
2316   VEC_truncate (tree, build_v_must_defs, 0);
2317   VEC_truncate (tree, build_vuses, 0);
2318
2319   /* For each VDEF on the original statement, we want to create a
2320      VUSE of the V_MAY_DEF result or V_MUST_DEF op on the new 
2321      statement.  */
2322   FOR_EACH_SSA_TREE_OPERAND (op, old_stmt, iter, 
2323                              (SSA_OP_VMAYDEF | SSA_OP_VMUSTDEF))
2324     append_vuse (op);
2325     
2326   /* Now build the operands for this new stmt.  */
2327   finalize_ssa_stmt_operands (new_stmt);
2328
2329   /* All uses in this fake stmt must not be in the immediate use lists.  */
2330   FOR_EACH_SSA_USE_OPERAND (use_p, new_stmt, iter, SSA_OP_ALL_USES)
2331     delink_imm_use (use_p);
2332 }
2333
2334
2335 /* Swap operands EXP0 and EXP1 in statement STMT.  No attempt is done
2336    to test the validity of the swap operation.  */
2337
2338 void
2339 swap_tree_operands (tree stmt, tree *exp0, tree *exp1)
2340 {
2341   tree op0, op1;
2342   op0 = *exp0;
2343   op1 = *exp1;
2344
2345   /* If the operand cache is active, attempt to preserve the relative
2346      positions of these two operands in their respective immediate use
2347      lists.  */
2348   if (ssa_operands_active () && op0 != op1)
2349     {
2350       use_optype_p use0, use1, ptr;
2351       use0 = use1 = NULL;
2352
2353       /* Find the 2 operands in the cache, if they are there.  */
2354       for (ptr = USE_OPS (stmt); ptr; ptr = ptr->next)
2355         if (USE_OP_PTR (ptr)->use == exp0)
2356           {
2357             use0 = ptr;
2358             break;
2359           }
2360
2361       for (ptr = USE_OPS (stmt); ptr; ptr = ptr->next)
2362         if (USE_OP_PTR (ptr)->use == exp1)
2363           {
2364             use1 = ptr;
2365             break;
2366           }
2367
2368       /* If both uses don't have operand entries, there isn't much we can do
2369          at this point.  Presumably we don't need to worry about it.  */
2370       if (use0 && use1)
2371         {
2372           tree *tmp = USE_OP_PTR (use1)->use;
2373           USE_OP_PTR (use1)->use = USE_OP_PTR (use0)->use;
2374           USE_OP_PTR (use0)->use = tmp;
2375         }
2376     }
2377
2378   /* Now swap the data.  */
2379   *exp0 = op1;
2380   *exp1 = op0;
2381 }
2382
2383
2384 /* Add the base address of REF to the set *ADDRESSES_TAKEN.  If
2385    *ADDRESSES_TAKEN is NULL, a new set is created.  REF may be
2386    a single variable whose address has been taken or any other valid
2387    GIMPLE memory reference (structure reference, array, etc).  If the
2388    base address of REF is a decl that has sub-variables, also add all
2389    of its sub-variables.  */
2390
2391 void
2392 add_to_addressable_set (tree ref, bitmap *addresses_taken)
2393 {
2394   tree var;
2395   subvar_t svars;
2396
2397   gcc_assert (addresses_taken);
2398
2399   /* Note that it is *NOT OKAY* to use the target of a COMPONENT_REF
2400      as the only thing we take the address of.  If VAR is a structure,
2401      taking the address of a field means that the whole structure may
2402      be referenced using pointer arithmetic.  See PR 21407 and the
2403      ensuing mailing list discussion.  */
2404   var = get_base_address (ref);
2405   if (var && SSA_VAR_P (var))
2406     {
2407       if (*addresses_taken == NULL)
2408         *addresses_taken = BITMAP_GGC_ALLOC ();      
2409       
2410       if (var_can_have_subvars (var)
2411           && (svars = get_subvars_for_var (var)))
2412         {
2413           subvar_t sv;
2414           for (sv = svars; sv; sv = sv->next)
2415             {
2416               bitmap_set_bit (*addresses_taken, DECL_UID (sv->var));
2417               TREE_ADDRESSABLE (sv->var) = 1;
2418             }
2419         }
2420       else
2421         {
2422           bitmap_set_bit (*addresses_taken, DECL_UID (var));
2423           TREE_ADDRESSABLE (var) = 1;
2424         }
2425     }
2426 }
2427
2428
2429 /* Scan the immediate_use list for VAR making sure its linked properly.
2430    Return TRUE if there is a problem and emit an error message to F.  */
2431
2432 bool
2433 verify_imm_links (FILE *f, tree var)
2434 {
2435   use_operand_p ptr, prev, list;
2436   int count;
2437
2438   gcc_assert (TREE_CODE (var) == SSA_NAME);
2439
2440   list = &(SSA_NAME_IMM_USE_NODE (var));
2441   gcc_assert (list->use == NULL);
2442
2443   if (list->prev == NULL)
2444     {
2445       gcc_assert (list->next == NULL);
2446       return false;
2447     }
2448
2449   prev = list;
2450   count = 0;
2451   for (ptr = list->next; ptr != list; )
2452     {
2453       if (prev != ptr->prev)
2454         goto error;
2455       
2456       if (ptr->use == NULL)
2457         goto error; /* 2 roots, or SAFE guard node.  */
2458       else if (*(ptr->use) != var)
2459         goto error;
2460
2461       prev = ptr;
2462       ptr = ptr->next;
2463
2464       /* Avoid infinite loops.  50,000,000 uses probably indicates a
2465          problem.  */
2466       if (count++ > 50000000)
2467         goto error;
2468     }
2469
2470   /* Verify list in the other direction.  */
2471   prev = list;
2472   for (ptr = list->prev; ptr != list; )
2473     {
2474       if (prev != ptr->next)
2475         goto error;
2476       prev = ptr;
2477       ptr = ptr->prev;
2478       if (count-- < 0)
2479         goto error;
2480     }
2481
2482   if (count != 0)
2483     goto error;
2484
2485   return false;
2486
2487  error:
2488   if (ptr->stmt && stmt_modified_p (ptr->stmt))
2489     {
2490       fprintf (f, " STMT MODIFIED. - <%p> ", (void *)ptr->stmt);
2491       print_generic_stmt (f, ptr->stmt, TDF_SLIM);
2492     }
2493   fprintf (f, " IMM ERROR : (use_p : tree - %p:%p)", (void *)ptr, 
2494            (void *)ptr->use);
2495   print_generic_expr (f, USE_FROM_PTR (ptr), TDF_SLIM);
2496   fprintf(f, "\n");
2497   return true;
2498 }
2499
2500
2501 /* Dump all the immediate uses to FILE.  */
2502
2503 void
2504 dump_immediate_uses_for (FILE *file, tree var)
2505 {
2506   imm_use_iterator iter;
2507   use_operand_p use_p;
2508
2509   gcc_assert (var && TREE_CODE (var) == SSA_NAME);
2510
2511   print_generic_expr (file, var, TDF_SLIM);
2512   fprintf (file, " : -->");
2513   if (has_zero_uses (var))
2514     fprintf (file, " no uses.\n");
2515   else
2516     if (has_single_use (var))
2517       fprintf (file, " single use.\n");
2518     else
2519       fprintf (file, "%d uses.\n", num_imm_uses (var));
2520
2521   FOR_EACH_IMM_USE_FAST (use_p, iter, var)
2522     {
2523       if (use_p->stmt == NULL && use_p->use == NULL)
2524         fprintf (file, "***end of stmt iterator marker***\n");
2525       else
2526         if (!is_gimple_reg (USE_FROM_PTR (use_p)))
2527           print_generic_stmt (file, USE_STMT (use_p), TDF_VOPS);
2528         else
2529           print_generic_stmt (file, USE_STMT (use_p), TDF_SLIM);
2530     }
2531   fprintf(file, "\n");
2532 }
2533
2534
2535 /* Dump all the immediate uses to FILE.  */
2536
2537 void
2538 dump_immediate_uses (FILE *file)
2539 {
2540   tree var;
2541   unsigned int x;
2542
2543   fprintf (file, "Immediate_uses: \n\n");
2544   for (x = 1; x < num_ssa_names; x++)
2545     {
2546       var = ssa_name(x);
2547       if (!var)
2548         continue;
2549       dump_immediate_uses_for (file, var);
2550     }
2551 }
2552
2553
2554 /* Dump def-use edges on stderr.  */
2555
2556 void
2557 debug_immediate_uses (void)
2558 {
2559   dump_immediate_uses (stderr);
2560 }
2561
2562
2563 /* Dump def-use edges on stderr.  */
2564
2565 void
2566 debug_immediate_uses_for (tree var)
2567 {
2568   dump_immediate_uses_for (stderr, var);
2569 }