1/* Data flow functions for trees.
2   Copyright (C) 2001-2015 Free Software Foundation, Inc.
3   Contributed by Diego Novillo <dnovillo@redhat.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3.  If not see
19<http://www.gnu.org/licenses/>.  */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "tm.h"
25#include "hashtab.h"
26#include "hash-set.h"
27#include "machmode.h"
28#include "vec.h"
29#include "double-int.h"
30#include "input.h"
31#include "alias.h"
32#include "symtab.h"
33#include "wide-int.h"
34#include "inchash.h"
35#include "tree.h"
36#include "fold-const.h"
37#include "stor-layout.h"
38#include "tm_p.h"
39#include "predict.h"
40#include "hard-reg-set.h"
41#include "function.h"
42#include "dominance.h"
43#include "cfg.h"
44#include "basic-block.h"
45#include "langhooks.h"
46#include "flags.h"
47#include "tree-pretty-print.h"
48#include "tree-ssa-alias.h"
49#include "internal-fn.h"
50#include "gimple-expr.h"
51#include "is-a.h"
52#include "gimple.h"
53#include "gimple-iterator.h"
54#include "gimple-walk.h"
55#include "gimple-ssa.h"
56#include "tree-phinodes.h"
57#include "ssa-iterators.h"
58#include "stringpool.h"
59#include "tree-ssanames.h"
60#include "rtl.h"
61#include "statistics.h"
62#include "real.h"
63#include "fixed-value.h"
64#include "insn-config.h"
65#include "expmed.h"
66#include "dojump.h"
67#include "explow.h"
68#include "calls.h"
69#include "emit-rtl.h"
70#include "varasm.h"
71#include "stmt.h"
72#include "expr.h"
73#include "tree-dfa.h"
74#include "tree-inline.h"
75#include "tree-pass.h"
76#include "params.h"
77
78/* Build and maintain data flow information for trees.  */
79
80/* Counters used to display DFA and SSA statistics.  */
81struct dfa_stats_d
82{
83  long num_defs;
84  long num_uses;
85  long num_phis;
86  long num_phi_args;
87  size_t max_num_phi_args;
88  long num_vdefs;
89  long num_vuses;
90};
91
92
93/* Local functions.  */
94static void collect_dfa_stats (struct dfa_stats_d *);
95
96
97/*---------------------------------------------------------------------------
98			Dataflow analysis (DFA) routines
99---------------------------------------------------------------------------*/
100
101/* Renumber all of the gimple stmt uids.  */
102
103void
104renumber_gimple_stmt_uids (void)
105{
106  basic_block bb;
107
108  set_gimple_stmt_max_uid (cfun, 0);
109  FOR_ALL_BB_FN (bb, cfun)
110    {
111      gimple_stmt_iterator bsi;
112      for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
113	{
114	  gimple stmt = gsi_stmt (bsi);
115	  gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
116	}
117      for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
118	{
119	  gimple stmt = gsi_stmt (bsi);
120	  gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
121	}
122    }
123}
124
125/* Like renumber_gimple_stmt_uids, but only do work on the basic blocks
126   in BLOCKS, of which there are N_BLOCKS.  Also renumbers PHIs.  */
127
128void
129renumber_gimple_stmt_uids_in_blocks (basic_block *blocks, int n_blocks)
130{
131  int i;
132
133  set_gimple_stmt_max_uid (cfun, 0);
134  for (i = 0; i < n_blocks; i++)
135    {
136      basic_block bb = blocks[i];
137      gimple_stmt_iterator bsi;
138      for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
139	{
140	  gimple stmt = gsi_stmt (bsi);
141	  gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
142	}
143      for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
144	{
145	  gimple stmt = gsi_stmt (bsi);
146	  gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
147	}
148    }
149}
150
151
152
153/*---------------------------------------------------------------------------
154			      Debugging functions
155---------------------------------------------------------------------------*/
156
157/* Dump variable VAR and its may-aliases to FILE.  */
158
159void
160dump_variable (FILE *file, tree var)
161{
162  if (TREE_CODE (var) == SSA_NAME)
163    {
164      if (POINTER_TYPE_P (TREE_TYPE (var)))
165	dump_points_to_info_for (file, var);
166      var = SSA_NAME_VAR (var);
167    }
168
169  if (var == NULL_TREE)
170    {
171      fprintf (file, "<nil>");
172      return;
173    }
174
175  print_generic_expr (file, var, dump_flags);
176
177  fprintf (file, ", UID D.%u", (unsigned) DECL_UID (var));
178  if (DECL_PT_UID (var) != DECL_UID (var))
179    fprintf (file, ", PT-UID D.%u", (unsigned) DECL_PT_UID (var));
180
181  fprintf (file, ", ");
182  print_generic_expr (file, TREE_TYPE (var), dump_flags);
183
184  if (TREE_ADDRESSABLE (var))
185    fprintf (file, ", is addressable");
186
187  if (is_global_var (var))
188    fprintf (file, ", is global");
189
190  if (TREE_THIS_VOLATILE (var))
191    fprintf (file, ", is volatile");
192
193  if (cfun && ssa_default_def (cfun, var))
194    {
195      fprintf (file, ", default def: ");
196      print_generic_expr (file, ssa_default_def (cfun, var), dump_flags);
197    }
198
199  if (DECL_INITIAL (var))
200    {
201      fprintf (file, ", initial: ");
202      print_generic_expr (file, DECL_INITIAL (var), dump_flags);
203    }
204
205  fprintf (file, "\n");
206}
207
208
209/* Dump variable VAR and its may-aliases to stderr.  */
210
211DEBUG_FUNCTION void
212debug_variable (tree var)
213{
214  dump_variable (stderr, var);
215}
216
217
218/* Dump various DFA statistics to FILE.  */
219
220void
221dump_dfa_stats (FILE *file)
222{
223  struct dfa_stats_d dfa_stats;
224
225  unsigned long size, total = 0;
226  const char * const fmt_str   = "%-30s%-13s%12s\n";
227  const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
228  const char * const fmt_str_3 = "%-43s%11lu%c\n";
229  const char *funcname
230    = lang_hooks.decl_printable_name (current_function_decl, 2);
231
232  collect_dfa_stats (&dfa_stats);
233
234  fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
235
236  fprintf (file, "---------------------------------------------------------\n");
237  fprintf (file, fmt_str, "", "  Number of  ", "Memory");
238  fprintf (file, fmt_str, "", "  instances  ", "used ");
239  fprintf (file, "---------------------------------------------------------\n");
240
241  size = dfa_stats.num_uses * sizeof (tree *);
242  total += size;
243  fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
244	   SCALE (size), LABEL (size));
245
246  size = dfa_stats.num_defs * sizeof (tree *);
247  total += size;
248  fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
249	   SCALE (size), LABEL (size));
250
251  size = dfa_stats.num_vuses * sizeof (tree *);
252  total += size;
253  fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
254	   SCALE (size), LABEL (size));
255
256  size = dfa_stats.num_vdefs * sizeof (tree *);
257  total += size;
258  fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
259	   SCALE (size), LABEL (size));
260
261  size = dfa_stats.num_phis * sizeof (struct gphi);
262  total += size;
263  fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
264	   SCALE (size), LABEL (size));
265
266  size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
267  total += size;
268  fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
269 	   SCALE (size), LABEL (size));
270
271  fprintf (file, "---------------------------------------------------------\n");
272  fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
273	   LABEL (total));
274  fprintf (file, "---------------------------------------------------------\n");
275  fprintf (file, "\n");
276
277  if (dfa_stats.num_phis)
278    fprintf (file, "Average number of arguments per PHI node: %.1f (max: %ld)\n",
279	     (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
280	     (long) dfa_stats.max_num_phi_args);
281
282  fprintf (file, "\n");
283}
284
285
286/* Dump DFA statistics on stderr.  */
287
288DEBUG_FUNCTION void
289debug_dfa_stats (void)
290{
291  dump_dfa_stats (stderr);
292}
293
294
295/* Collect DFA statistics and store them in the structure pointed to by
296   DFA_STATS_P.  */
297
298static void
299collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
300{
301  basic_block bb;
302
303  gcc_assert (dfa_stats_p);
304
305  memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
306
307  /* Walk all the statements in the function counting references.  */
308  FOR_EACH_BB_FN (bb, cfun)
309    {
310      for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
311	   gsi_next (&si))
312	{
313	  gphi *phi = si.phi ();
314	  dfa_stats_p->num_phis++;
315	  dfa_stats_p->num_phi_args += gimple_phi_num_args (phi);
316	  if (gimple_phi_num_args (phi) > dfa_stats_p->max_num_phi_args)
317	    dfa_stats_p->max_num_phi_args = gimple_phi_num_args (phi);
318	}
319
320      for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
321	   gsi_next (&si))
322	{
323	  gimple stmt = gsi_stmt (si);
324	  dfa_stats_p->num_defs += NUM_SSA_OPERANDS (stmt, SSA_OP_DEF);
325	  dfa_stats_p->num_uses += NUM_SSA_OPERANDS (stmt, SSA_OP_USE);
326	  dfa_stats_p->num_vdefs += gimple_vdef (stmt) ? 1 : 0;
327	  dfa_stats_p->num_vuses += gimple_vuse (stmt) ? 1 : 0;
328	}
329    }
330}
331
332
333/*---------------------------------------------------------------------------
334			     Miscellaneous helpers
335---------------------------------------------------------------------------*/
336
337/* Lookup VAR UID in the default_defs hashtable and return the associated
338   variable.  */
339
340tree
341ssa_default_def (struct function *fn, tree var)
342{
343  struct tree_decl_minimal ind;
344  struct tree_ssa_name in;
345  gcc_assert (TREE_CODE (var) == VAR_DECL
346	      || TREE_CODE (var) == PARM_DECL
347	      || TREE_CODE (var) == RESULT_DECL);
348  in.var = (tree)&ind;
349  ind.uid = DECL_UID (var);
350  return DEFAULT_DEFS (fn)->find_with_hash ((tree)&in, DECL_UID (var));
351}
352
353/* Insert the pair VAR's UID, DEF into the default_defs hashtable
354   of function FN.  */
355
356void
357set_ssa_default_def (struct function *fn, tree var, tree def)
358{
359  struct tree_decl_minimal ind;
360  struct tree_ssa_name in;
361
362  gcc_assert (TREE_CODE (var) == VAR_DECL
363	      || TREE_CODE (var) == PARM_DECL
364	      || TREE_CODE (var) == RESULT_DECL);
365  in.var = (tree)&ind;
366  ind.uid = DECL_UID (var);
367  if (!def)
368    {
369      tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
370							  DECL_UID (var),
371							  NO_INSERT);
372      if (loc)
373	{
374	  SSA_NAME_IS_DEFAULT_DEF (*(tree *)loc) = false;
375	  DEFAULT_DEFS (fn)->clear_slot (loc);
376	}
377      return;
378    }
379  gcc_assert (TREE_CODE (def) == SSA_NAME && SSA_NAME_VAR (def) == var);
380  tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
381						      DECL_UID (var), INSERT);
382
383  /* Default definition might be changed by tail call optimization.  */
384  if (*loc)
385    SSA_NAME_IS_DEFAULT_DEF (*loc) = false;
386
387   /* Mark DEF as the default definition for VAR.  */
388  *loc = def;
389  SSA_NAME_IS_DEFAULT_DEF (def) = true;
390}
391
392/* Retrieve or create a default definition for VAR.  */
393
394tree
395get_or_create_ssa_default_def (struct function *fn, tree var)
396{
397  tree ddef = ssa_default_def (fn, var);
398  if (ddef == NULL_TREE)
399    {
400      ddef = make_ssa_name_fn (fn, var, gimple_build_nop ());
401      set_ssa_default_def (fn, var, ddef);
402    }
403  return ddef;
404}
405
406
407/* If EXP is a handled component reference for a structure, return the
408   base variable.  The access range is delimited by bit positions *POFFSET and
409   *POFFSET + *PMAX_SIZE.  The access size is *PSIZE bits.  If either
410   *PSIZE or *PMAX_SIZE is -1, they could not be determined.  If *PSIZE
411   and *PMAX_SIZE are equal, the access is non-variable.  */
412
413tree
414get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
415			 HOST_WIDE_INT *psize,
416			 HOST_WIDE_INT *pmax_size)
417{
418  offset_int bitsize = -1;
419  offset_int maxsize;
420  tree size_tree = NULL_TREE;
421  offset_int bit_offset = 0;
422  bool seen_variable_array_ref = false;
423
424  /* First get the final access size from just the outermost expression.  */
425  if (TREE_CODE (exp) == COMPONENT_REF)
426    size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
427  else if (TREE_CODE (exp) == BIT_FIELD_REF)
428    size_tree = TREE_OPERAND (exp, 1);
429  else if (!VOID_TYPE_P (TREE_TYPE (exp)))
430    {
431      machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
432      if (mode == BLKmode)
433	size_tree = TYPE_SIZE (TREE_TYPE (exp));
434      else
435	bitsize = int (GET_MODE_PRECISION (mode));
436    }
437  if (size_tree != NULL_TREE
438      && TREE_CODE (size_tree) == INTEGER_CST)
439    bitsize = wi::to_offset (size_tree);
440
441  /* Initially, maxsize is the same as the accessed element size.
442     In the following it will only grow (or become -1).  */
443  maxsize = bitsize;
444
445  /* Compute cumulative bit-offset for nested component-refs and array-refs,
446     and find the ultimate containing object.  */
447  while (1)
448    {
449      switch (TREE_CODE (exp))
450	{
451	case BIT_FIELD_REF:
452	  bit_offset += wi::to_offset (TREE_OPERAND (exp, 2));
453	  break;
454
455	case COMPONENT_REF:
456	  {
457	    tree field = TREE_OPERAND (exp, 1);
458	    tree this_offset = component_ref_field_offset (exp);
459
460	    if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
461	      {
462		offset_int woffset = wi::lshift (wi::to_offset (this_offset),
463						 LOG2_BITS_PER_UNIT);
464		woffset += wi::to_offset (DECL_FIELD_BIT_OFFSET (field));
465		bit_offset += woffset;
466
467		/* If we had seen a variable array ref already and we just
468		   referenced the last field of a struct or a union member
469		   then we have to adjust maxsize by the padding at the end
470		   of our field.  */
471		if (seen_variable_array_ref && maxsize != -1)
472		  {
473		    tree stype = TREE_TYPE (TREE_OPERAND (exp, 0));
474		    tree next = DECL_CHAIN (field);
475		    while (next && TREE_CODE (next) != FIELD_DECL)
476		      next = DECL_CHAIN (next);
477		    if (!next
478			|| TREE_CODE (stype) != RECORD_TYPE)
479		      {
480			tree fsize = DECL_SIZE_UNIT (field);
481			tree ssize = TYPE_SIZE_UNIT (stype);
482			if (fsize == NULL
483			    || TREE_CODE (fsize) != INTEGER_CST
484			    || ssize == NULL
485			    || TREE_CODE (ssize) != INTEGER_CST)
486			  maxsize = -1;
487			else
488			  {
489			    offset_int tem = (wi::to_offset (ssize)
490					      - wi::to_offset (fsize));
491			    tem = wi::lshift (tem, LOG2_BITS_PER_UNIT);
492			    tem -= woffset;
493			    maxsize += tem;
494			  }
495		      }
496		  }
497	      }
498	    else
499	      {
500		tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
501		/* We need to adjust maxsize to the whole structure bitsize.
502		   But we can subtract any constant offset seen so far,
503		   because that would get us out of the structure otherwise.  */
504		if (maxsize != -1
505		    && csize
506		    && TREE_CODE (csize) == INTEGER_CST)
507		  maxsize = wi::to_offset (csize) - bit_offset;
508		else
509		  maxsize = -1;
510	      }
511	  }
512	  break;
513
514	case ARRAY_REF:
515	case ARRAY_RANGE_REF:
516	  {
517	    tree index = TREE_OPERAND (exp, 1);
518	    tree low_bound, unit_size;
519
520	    /* If the resulting bit-offset is constant, track it.  */
521	    if (TREE_CODE (index) == INTEGER_CST
522		&& (low_bound = array_ref_low_bound (exp),
523 		    TREE_CODE (low_bound) == INTEGER_CST)
524		&& (unit_size = array_ref_element_size (exp),
525		    TREE_CODE (unit_size) == INTEGER_CST))
526	      {
527		offset_int woffset
528		  = wi::sext (wi::to_offset (index) - wi::to_offset (low_bound),
529			      TYPE_PRECISION (TREE_TYPE (index)));
530		woffset *= wi::to_offset (unit_size);
531		woffset = wi::lshift (woffset, LOG2_BITS_PER_UNIT);
532		bit_offset += woffset;
533
534		/* An array ref with a constant index up in the structure
535		   hierarchy will constrain the size of any variable array ref
536		   lower in the access hierarchy.  */
537		seen_variable_array_ref = false;
538	      }
539	    else
540	      {
541		tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
542		/* We need to adjust maxsize to the whole array bitsize.
543		   But we can subtract any constant offset seen so far,
544		   because that would get us outside of the array otherwise.  */
545		if (maxsize != -1
546		    && asize
547		    && TREE_CODE (asize) == INTEGER_CST)
548		  maxsize = wi::to_offset (asize) - bit_offset;
549		else
550		  maxsize = -1;
551
552		/* Remember that we have seen an array ref with a variable
553		   index.  */
554		seen_variable_array_ref = true;
555	      }
556	  }
557	  break;
558
559	case REALPART_EXPR:
560	  break;
561
562	case IMAGPART_EXPR:
563	  bit_offset += bitsize;
564	  break;
565
566	case VIEW_CONVERT_EXPR:
567	  break;
568
569	case TARGET_MEM_REF:
570	  /* Via the variable index or index2 we can reach the
571	     whole object.  Still hand back the decl here.  */
572	  if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR
573	      && (TMR_INDEX (exp) || TMR_INDEX2 (exp)))
574	    {
575	      exp = TREE_OPERAND (TMR_BASE (exp), 0);
576	      bit_offset = 0;
577	      maxsize = -1;
578	      goto done;
579	    }
580	  /* Fallthru.  */
581	case MEM_REF:
582	  /* We need to deal with variable arrays ending structures such as
583	     struct { int length; int a[1]; } x;           x.a[d]
584	     struct { struct { int a; int b; } a[1]; } x;  x.a[d].a
585	     struct { struct { int a[1]; } a[1]; } x;      x.a[0][d], x.a[d][0]
586	     struct { int len; union { int a[1]; struct X x; } u; } x; x.u.a[d]
587	     where we do not know maxsize for variable index accesses to
588	     the array.  The simplest way to conservatively deal with this
589	     is to punt in the case that offset + maxsize reaches the
590	     base type boundary.  This needs to include possible trailing
591	     padding that is there for alignment purposes.  */
592	  if (seen_variable_array_ref
593	      && maxsize != -1
594	      && (TYPE_SIZE (TREE_TYPE (exp)) == NULL_TREE
595		  || TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
596		  || (bit_offset + maxsize
597		      == wi::to_offset (TYPE_SIZE (TREE_TYPE (exp))))))
598	    maxsize = -1;
599
600	  /* Hand back the decl for MEM[&decl, off].  */
601	  if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
602	    {
603	      if (integer_zerop (TREE_OPERAND (exp, 1)))
604		exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
605	      else
606		{
607		  offset_int off = mem_ref_offset (exp);
608		  off = wi::lshift (off, LOG2_BITS_PER_UNIT);
609		  off += bit_offset;
610		  if (wi::fits_shwi_p (off))
611		    {
612		      bit_offset = off;
613		      exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
614		    }
615		}
616	    }
617	  goto done;
618
619	default:
620	  goto done;
621	}
622
623      exp = TREE_OPERAND (exp, 0);
624    }
625
626  /* We need to deal with variable arrays ending structures.  */
627  if (seen_variable_array_ref
628      && maxsize != -1
629      && (TYPE_SIZE (TREE_TYPE (exp)) == NULL_TREE
630	  || TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
631	  || (bit_offset + maxsize
632	      == wi::to_offset (TYPE_SIZE (TREE_TYPE (exp))))))
633    maxsize = -1;
634
635 done:
636  if (!wi::fits_shwi_p (bitsize) || wi::neg_p (bitsize))
637    {
638      *poffset = 0;
639      *psize = -1;
640      *pmax_size = -1;
641
642      return exp;
643    }
644
645  *psize = bitsize.to_shwi ();
646
647  if (!wi::fits_shwi_p (bit_offset))
648    {
649      *poffset = 0;
650      *pmax_size = -1;
651
652      return exp;
653    }
654
655  /* In case of a decl or constant base object we can do better.  */
656
657  if (DECL_P (exp))
658    {
659      /* If maxsize is unknown adjust it according to the size of the
660         base decl.  */
661      if (maxsize == -1
662	  && DECL_SIZE (exp)
663	  && TREE_CODE (DECL_SIZE (exp)) == INTEGER_CST)
664	maxsize = wi::to_offset (DECL_SIZE (exp)) - bit_offset;
665    }
666  else if (CONSTANT_CLASS_P (exp))
667    {
668      /* If maxsize is unknown adjust it according to the size of the
669         base type constant.  */
670      if (maxsize == -1
671	  && TYPE_SIZE (TREE_TYPE (exp))
672	  && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST)
673	maxsize = (wi::to_offset (TYPE_SIZE (TREE_TYPE (exp)))
674		   - bit_offset);
675    }
676
677  /* ???  Due to negative offsets in ARRAY_REF we can end up with
678     negative bit_offset here.  We might want to store a zero offset
679     in this case.  */
680  *poffset = bit_offset.to_shwi ();
681  if (!wi::fits_shwi_p (maxsize) || wi::neg_p (maxsize))
682    *pmax_size = -1;
683  else
684    *pmax_size = maxsize.to_shwi ();
685
686  return exp;
687}
688
689/* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
690   denotes the starting address of the memory access EXP.
691   Returns NULL_TREE if the offset is not constant or any component
692   is not BITS_PER_UNIT-aligned.
693   VALUEIZE if non-NULL is used to valueize SSA names.  It should return
694   its argument or a constant if the argument is known to be constant.  */
695
696tree
697get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
698				 tree (*valueize) (tree))
699{
700  HOST_WIDE_INT byte_offset = 0;
701
702  /* Compute cumulative byte-offset for nested component-refs and array-refs,
703     and find the ultimate containing object.  */
704  while (1)
705    {
706      switch (TREE_CODE (exp))
707	{
708	case BIT_FIELD_REF:
709	  {
710	    HOST_WIDE_INT this_off = TREE_INT_CST_LOW (TREE_OPERAND (exp, 2));
711	    if (this_off % BITS_PER_UNIT)
712	      return NULL_TREE;
713	    byte_offset += this_off / BITS_PER_UNIT;
714	  }
715	  break;
716
717	case COMPONENT_REF:
718	  {
719	    tree field = TREE_OPERAND (exp, 1);
720	    tree this_offset = component_ref_field_offset (exp);
721	    HOST_WIDE_INT hthis_offset;
722
723	    if (!this_offset
724		|| TREE_CODE (this_offset) != INTEGER_CST
725		|| (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
726		    % BITS_PER_UNIT))
727	      return NULL_TREE;
728
729	    hthis_offset = TREE_INT_CST_LOW (this_offset);
730	    hthis_offset += (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
731			     / BITS_PER_UNIT);
732	    byte_offset += hthis_offset;
733	  }
734	  break;
735
736	case ARRAY_REF:
737	case ARRAY_RANGE_REF:
738	  {
739	    tree index = TREE_OPERAND (exp, 1);
740	    tree low_bound, unit_size;
741
742	    if (valueize
743		&& TREE_CODE (index) == SSA_NAME)
744	      index = (*valueize) (index);
745
746	    /* If the resulting bit-offset is constant, track it.  */
747	    if (TREE_CODE (index) == INTEGER_CST
748		&& (low_bound = array_ref_low_bound (exp),
749		    TREE_CODE (low_bound) == INTEGER_CST)
750		&& (unit_size = array_ref_element_size (exp),
751		    TREE_CODE (unit_size) == INTEGER_CST))
752	      {
753		offset_int woffset
754		  = wi::sext (wi::to_offset (index) - wi::to_offset (low_bound),
755			      TYPE_PRECISION (TREE_TYPE (index)));
756		woffset *= wi::to_offset (unit_size);
757		byte_offset += woffset.to_shwi ();
758	      }
759	    else
760	      return NULL_TREE;
761	  }
762	  break;
763
764	case REALPART_EXPR:
765	  break;
766
767	case IMAGPART_EXPR:
768	  byte_offset += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
769	  break;
770
771	case VIEW_CONVERT_EXPR:
772	  break;
773
774	case MEM_REF:
775	  {
776	    tree base = TREE_OPERAND (exp, 0);
777	    if (valueize
778		&& TREE_CODE (base) == SSA_NAME)
779	      base = (*valueize) (base);
780
781	    /* Hand back the decl for MEM[&decl, off].  */
782	    if (TREE_CODE (base) == ADDR_EXPR)
783	      {
784		if (!integer_zerop (TREE_OPERAND (exp, 1)))
785		  {
786		    offset_int off = mem_ref_offset (exp);
787		    byte_offset += off.to_short_addr ();
788		  }
789		exp = TREE_OPERAND (base, 0);
790	      }
791	    goto done;
792	  }
793
794	case TARGET_MEM_REF:
795	  {
796	    tree base = TREE_OPERAND (exp, 0);
797	    if (valueize
798		&& TREE_CODE (base) == SSA_NAME)
799	      base = (*valueize) (base);
800
801	    /* Hand back the decl for MEM[&decl, off].  */
802	    if (TREE_CODE (base) == ADDR_EXPR)
803	      {
804		if (TMR_INDEX (exp) || TMR_INDEX2 (exp))
805		  return NULL_TREE;
806		if (!integer_zerop (TMR_OFFSET (exp)))
807		  {
808		    offset_int off = mem_ref_offset (exp);
809		    byte_offset += off.to_short_addr ();
810		  }
811		exp = TREE_OPERAND (base, 0);
812	      }
813	    goto done;
814	  }
815
816	default:
817	  goto done;
818	}
819
820      exp = TREE_OPERAND (exp, 0);
821    }
822done:
823
824  *poffset = byte_offset;
825  return exp;
826}
827
828/* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
829   denotes the starting address of the memory access EXP.
830   Returns NULL_TREE if the offset is not constant or any component
831   is not BITS_PER_UNIT-aligned.  */
832
833tree
834get_addr_base_and_unit_offset (tree exp, HOST_WIDE_INT *poffset)
835{
836  return get_addr_base_and_unit_offset_1 (exp, poffset, NULL);
837}
838
839/* Returns true if STMT references an SSA_NAME that has
840   SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false.  */
841
842bool
843stmt_references_abnormal_ssa_name (gimple stmt)
844{
845  ssa_op_iter oi;
846  use_operand_p use_p;
847
848  FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
849    {
850      if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p)))
851	return true;
852    }
853
854  return false;
855}
856
857/* Pair of tree and a sorting index, for dump_enumerated_decls.  */
858struct GTY(()) numbered_tree_d
859{
860  tree t;
861  int num;
862};
863typedef struct numbered_tree_d numbered_tree;
864
865
866/* Compare two declarations references by their DECL_UID / sequence number.
867   Called via qsort.  */
868
869static int
870compare_decls_by_uid (const void *pa, const void *pb)
871{
872  const numbered_tree *nt_a = ((const numbered_tree *)pa);
873  const numbered_tree *nt_b = ((const numbered_tree *)pb);
874
875  if (DECL_UID (nt_a->t) != DECL_UID (nt_b->t))
876    return  DECL_UID (nt_a->t) - DECL_UID (nt_b->t);
877  return nt_a->num - nt_b->num;
878}
879
880/* Called via walk_gimple_stmt / walk_gimple_op by dump_enumerated_decls.  */
881static tree
882dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
883{
884  struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
885  vec<numbered_tree> *list = (vec<numbered_tree> *) wi->info;
886  numbered_tree nt;
887
888  if (!DECL_P (*tp))
889    return NULL_TREE;
890  nt.t = *tp;
891  nt.num = list->length ();
892  list->safe_push (nt);
893  *walk_subtrees = 0;
894  return NULL_TREE;
895}
896
897/* Find all the declarations used by the current function, sort them by uid,
898   and emit the sorted list.  Each declaration is tagged with a sequence
899   number indicating when it was found during statement / tree walking,
900   so that TDF_NOUID comparisons of anonymous declarations are still
901   meaningful.  Where a declaration was encountered more than once, we
902   emit only the sequence number of the first encounter.
903   FILE is the dump file where to output the list and FLAGS is as in
904   print_generic_expr.  */
905void
906dump_enumerated_decls (FILE *file, int flags)
907{
908  basic_block bb;
909  struct walk_stmt_info wi;
910  auto_vec<numbered_tree, 40> decl_list;
911
912  memset (&wi, '\0', sizeof (wi));
913  wi.info = (void *) &decl_list;
914  FOR_EACH_BB_FN (bb, cfun)
915    {
916      gimple_stmt_iterator gsi;
917
918      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
919	if (!is_gimple_debug (gsi_stmt (gsi)))
920	  walk_gimple_stmt (&gsi, NULL, dump_enumerated_decls_push, &wi);
921    }
922  decl_list.qsort (compare_decls_by_uid);
923  if (decl_list.length ())
924    {
925      unsigned ix;
926      numbered_tree *ntp;
927      tree last = NULL_TREE;
928
929      fprintf (file, "Declarations used by %s, sorted by DECL_UID:\n",
930	       current_function_name ());
931      FOR_EACH_VEC_ELT (decl_list, ix, ntp)
932	{
933	  if (ntp->t == last)
934	    continue;
935	  fprintf (file, "%d: ", ntp->num);
936	  print_generic_decl (file, ntp->t, flags);
937	  fprintf (file, "\n");
938	  last = ntp->t;
939	}
940    }
941}
942