Home | History | Annotate | Line # | Download | only in gcc
value-relation.cc revision 1.1
      1  1.1  mrg /* Header file for the value range relational processing.
      2  1.1  mrg    Copyright (C) 2020-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Andrew MacLeod <amacleod (at) redhat.com>
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      8  1.1  mrg the terms of the GNU General Public License as published by the Free
      9  1.1  mrg Software Foundation; either version 3, or (at your option) any later
     10  1.1  mrg version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15  1.1  mrg  for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg #include "config.h"
     22  1.1  mrg #include "system.h"
     23  1.1  mrg #include "coretypes.h"
     24  1.1  mrg #include "backend.h"
     25  1.1  mrg #include "tree.h"
     26  1.1  mrg #include "gimple.h"
     27  1.1  mrg #include "ssa.h"
     28  1.1  mrg 
     29  1.1  mrg #include "gimple-range.h"
     30  1.1  mrg #include "tree-pretty-print.h"
     31  1.1  mrg #include "gimple-pretty-print.h"
     32  1.1  mrg #include "alloc-pool.h"
     33  1.1  mrg #include "dominance.h"
     34  1.1  mrg 
     35  1.1  mrg // These VREL codes are arranged such that VREL_NONE is the first
     36  1.1  mrg // code, and all the rest are contiguous up to and including VREL_LAST.
     37  1.1  mrg 
     38  1.1  mrg #define VREL_FIRST              VREL_NONE
     39  1.1  mrg #define VREL_LAST               NE_EXPR
     40  1.1  mrg #define VREL_COUNT              (VREL_LAST - VREL_FIRST + 1)
     41  1.1  mrg 
     42  1.1  mrg // vrel_range_assert will either assert that the tree code passed is valid,
     43  1.1  mrg // or mark invalid codes as unreachable to help with table optimation.
     44  1.1  mrg #if CHECKING_P
     45  1.1  mrg   #define vrel_range_assert(c) 			\
     46  1.1  mrg     gcc_checking_assert ((c) >= VREL_FIRST && (c) <= VREL_LAST)
     47  1.1  mrg #else
     48  1.1  mrg   #define vrel_range_assert(c)			\
     49  1.1  mrg     if ((c) < VREL_FIRST || (c) > VREL_LAST)	\
     50  1.1  mrg       gcc_unreachable ();
     51  1.1  mrg #endif
     52  1.1  mrg 
     53  1.1  mrg static const char *kind_string[VREL_COUNT] =
     54  1.1  mrg { "none", "<", "<=", ">", ">=", "empty", "==", "!=" };
     55  1.1  mrg 
     56  1.1  mrg // Print a relation_kind REL to file F.
     57  1.1  mrg 
     58  1.1  mrg void
     59  1.1  mrg print_relation (FILE *f, relation_kind rel)
     60  1.1  mrg {
     61  1.1  mrg   vrel_range_assert (rel);
     62  1.1  mrg   fprintf (f, " %s ", kind_string[rel - VREL_FIRST]);
     63  1.1  mrg }
     64  1.1  mrg 
     65  1.1  mrg // This table is used to negate the operands.  op1 REL op2 -> !(op1 REL op2).
     66  1.1  mrg relation_kind rr_negate_table[VREL_COUNT] = {
     67  1.1  mrg //     NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY,      EQ_EXPR, NE_EXPR
     68  1.1  mrg   VREL_NONE, GE_EXPR, GT_EXPR, LE_EXPR, LT_EXPR, VREL_EMPTY, NE_EXPR, EQ_EXPR };
     69  1.1  mrg 
     70  1.1  mrg // Negate the relation, as in logical negation.
     71  1.1  mrg 
     72  1.1  mrg relation_kind
     73  1.1  mrg relation_negate (relation_kind r)
     74  1.1  mrg {
     75  1.1  mrg   vrel_range_assert (r);
     76  1.1  mrg   return rr_negate_table [r - VREL_FIRST];
     77  1.1  mrg }
     78  1.1  mrg 
     79  1.1  mrg // This table is used to swap the operands.  op1 REL op2 -> op2 REL op1.
     80  1.1  mrg relation_kind rr_swap_table[VREL_COUNT] = {
     81  1.1  mrg //     NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY,      EQ_EXPR, NE_EXPR
     82  1.1  mrg   VREL_NONE, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR, VREL_EMPTY, EQ_EXPR, NE_EXPR };
     83  1.1  mrg 
     84  1.1  mrg // Return the relation as if the operands were swapped.
     85  1.1  mrg 
     86  1.1  mrg relation_kind
     87  1.1  mrg relation_swap (relation_kind r)
     88  1.1  mrg {
     89  1.1  mrg   vrel_range_assert (r);
     90  1.1  mrg   return rr_swap_table [r - VREL_FIRST];
     91  1.1  mrg }
     92  1.1  mrg 
     93  1.1  mrg // This table is used to perform an intersection between 2 relations.
     94  1.1  mrg 
     95  1.1  mrg relation_kind rr_intersect_table[VREL_COUNT][VREL_COUNT] = {
     96  1.1  mrg //   NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY, EQ_EXPR, NE_EXPR
     97  1.1  mrg // VREL_NONE
     98  1.1  mrg   { VREL_NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, VREL_EMPTY, EQ_EXPR, NE_EXPR },
     99  1.1  mrg // LT_EXPR
    100  1.1  mrg   { LT_EXPR, LT_EXPR, LT_EXPR, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, LT_EXPR },
    101  1.1  mrg // LE_EXPR
    102  1.1  mrg   { LE_EXPR, LT_EXPR, LE_EXPR, VREL_EMPTY, EQ_EXPR, VREL_EMPTY, EQ_EXPR, LT_EXPR },
    103  1.1  mrg // GT_EXPR
    104  1.1  mrg   { GT_EXPR, VREL_EMPTY, VREL_EMPTY, GT_EXPR, GT_EXPR, VREL_EMPTY, VREL_EMPTY, GT_EXPR },
    105  1.1  mrg // GE_EXPR
    106  1.1  mrg   { GE_EXPR, VREL_EMPTY, EQ_EXPR, GT_EXPR, GE_EXPR, VREL_EMPTY, EQ_EXPR, GT_EXPR },
    107  1.1  mrg // VREL_EMPTY
    108  1.1  mrg   { VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY },
    109  1.1  mrg // EQ_EXPR
    110  1.1  mrg   { EQ_EXPR, VREL_EMPTY, EQ_EXPR, VREL_EMPTY, EQ_EXPR, VREL_EMPTY, EQ_EXPR, VREL_EMPTY },
    111  1.1  mrg // NE_EXPR
    112  1.1  mrg   { NE_EXPR, LT_EXPR, LT_EXPR, GT_EXPR, GT_EXPR, VREL_EMPTY, VREL_EMPTY, NE_EXPR } };
    113  1.1  mrg 
    114  1.1  mrg 
    115  1.1  mrg // Intersect relation R1 with relation R2 and return the resulting relation.
    116  1.1  mrg 
    117  1.1  mrg relation_kind
    118  1.1  mrg relation_intersect (relation_kind r1, relation_kind r2)
    119  1.1  mrg {
    120  1.1  mrg   vrel_range_assert (r1);
    121  1.1  mrg   vrel_range_assert (r2);
    122  1.1  mrg   return rr_intersect_table[r1 - VREL_FIRST][r2 - VREL_FIRST];
    123  1.1  mrg }
    124  1.1  mrg 
    125  1.1  mrg 
    126  1.1  mrg // This table is used to perform a union between 2 relations.
    127  1.1  mrg 
    128  1.1  mrg relation_kind rr_union_table[VREL_COUNT][VREL_COUNT] = {
    129  1.1  mrg //    	 NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY, EQ_EXPR, NE_EXPR
    130  1.1  mrg // VREL_NONE
    131  1.1  mrg   { VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE },
    132  1.1  mrg // LT_EXPR
    133  1.1  mrg   { VREL_NONE, LT_EXPR, LE_EXPR, NE_EXPR, VREL_NONE, LT_EXPR, LE_EXPR, NE_EXPR },
    134  1.1  mrg // LE_EXPR
    135  1.1  mrg   { VREL_NONE, LE_EXPR, LE_EXPR, VREL_NONE, VREL_NONE, LE_EXPR, LE_EXPR, VREL_NONE },
    136  1.1  mrg // GT_EXPR
    137  1.1  mrg   { VREL_NONE, NE_EXPR, VREL_NONE, GT_EXPR, GE_EXPR, GT_EXPR, GE_EXPR, NE_EXPR },
    138  1.1  mrg // GE_EXPR
    139  1.1  mrg   { VREL_NONE, VREL_NONE, VREL_NONE, GE_EXPR, GE_EXPR, GE_EXPR, GE_EXPR, VREL_NONE },
    140  1.1  mrg // VREL_EMPTY
    141  1.1  mrg   { VREL_NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, VREL_EMPTY, EQ_EXPR, NE_EXPR },
    142  1.1  mrg // EQ_EXPR
    143  1.1  mrg   { VREL_NONE, LE_EXPR, LE_EXPR, GE_EXPR, GE_EXPR, EQ_EXPR, EQ_EXPR, VREL_NONE },
    144  1.1  mrg // NE_EXPR
    145  1.1  mrg   { VREL_NONE, NE_EXPR, VREL_NONE, NE_EXPR, VREL_NONE, NE_EXPR, VREL_NONE, NE_EXPR } };
    146  1.1  mrg 
    147  1.1  mrg // Union relation R1 with relation R2 and return the result.
    148  1.1  mrg 
    149  1.1  mrg relation_kind
    150  1.1  mrg relation_union (relation_kind r1, relation_kind r2)
    151  1.1  mrg {
    152  1.1  mrg   vrel_range_assert (r1);
    153  1.1  mrg   vrel_range_assert (r2);
    154  1.1  mrg   return rr_union_table[r1 - VREL_FIRST][r2 - VREL_FIRST];
    155  1.1  mrg }
    156  1.1  mrg 
    157  1.1  mrg 
    158  1.1  mrg // This table is used to determine transitivity between 2 relations.
    159  1.1  mrg // (A relation0 B) and (B relation1 C) implies  (A result C)
    160  1.1  mrg 
    161  1.1  mrg relation_kind rr_transitive_table[VREL_COUNT][VREL_COUNT] = {
    162  1.1  mrg //   NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY, EQ_EXPR, NE_EXPR
    163  1.1  mrg // VREL_NONE
    164  1.1  mrg   { VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE },
    165  1.1  mrg // LT_EXPR
    166  1.1  mrg   { VREL_NONE, LT_EXPR, LT_EXPR, VREL_NONE, VREL_NONE, VREL_NONE, LT_EXPR, VREL_NONE },
    167  1.1  mrg // LE_EXPR
    168  1.1  mrg   { VREL_NONE, LT_EXPR, LE_EXPR, VREL_NONE, VREL_NONE, VREL_NONE, LE_EXPR, VREL_NONE },
    169  1.1  mrg // GT_EXPR
    170  1.1  mrg   { VREL_NONE, VREL_NONE, VREL_NONE, GT_EXPR, GT_EXPR, VREL_NONE, GT_EXPR, VREL_NONE },
    171  1.1  mrg // GE_EXPR
    172  1.1  mrg   { VREL_NONE, VREL_NONE, VREL_NONE, GT_EXPR, GE_EXPR, VREL_NONE, GE_EXPR, VREL_NONE },
    173  1.1  mrg // VREL_EMPTY
    174  1.1  mrg   { VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE },
    175  1.1  mrg // EQ_EXPR
    176  1.1  mrg   { VREL_NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, VREL_NONE, EQ_EXPR, VREL_NONE },
    177  1.1  mrg // NE_EXPR
    178  1.1  mrg   { VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE } };
    179  1.1  mrg 
    180  1.1  mrg // Apply transitive operation between relation R1 and relation R2, and
    181  1.1  mrg // return the resulting relation, if any.
    182  1.1  mrg 
    183  1.1  mrg relation_kind
    184  1.1  mrg relation_transitive (relation_kind r1, relation_kind r2)
    185  1.1  mrg {
    186  1.1  mrg   vrel_range_assert (r1);
    187  1.1  mrg   vrel_range_assert (r2);
    188  1.1  mrg   return rr_transitive_table[r1 - VREL_FIRST][r2 - VREL_FIRST];
    189  1.1  mrg }
    190  1.1  mrg 
    191  1.1  mrg // Given an equivalence set EQUIV, set all the bits in B that are still valid
    192  1.1  mrg // members of EQUIV in basic block BB.
    193  1.1  mrg 
    194  1.1  mrg void
    195  1.1  mrg relation_oracle::valid_equivs (bitmap b, const_bitmap equivs, basic_block bb)
    196  1.1  mrg {
    197  1.1  mrg   unsigned i;
    198  1.1  mrg   bitmap_iterator bi;
    199  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (equivs, 0, i, bi)
    200  1.1  mrg     {
    201  1.1  mrg       tree ssa = ssa_name (i);
    202  1.1  mrg       const_bitmap ssa_equiv = equiv_set (ssa, bb);
    203  1.1  mrg       if (ssa_equiv == equivs)
    204  1.1  mrg 	bitmap_set_bit (b, i);
    205  1.1  mrg     }
    206  1.1  mrg }
    207  1.1  mrg 
    208  1.1  mrg // -------------------------------------------------------------------------
    209  1.1  mrg 
    210  1.1  mrg // The very first element in the m_equiv chain is actually just a summary
    211  1.1  mrg // element in which the m_names bitmap is used to indicate that an ssa_name
    212  1.1  mrg // has an equivalence set in this block.
    213  1.1  mrg // This allows for much faster traversal of the DOM chain, as a search for
    214  1.1  mrg // SSA_NAME simply requires walking the DOM chain until a block is found
    215  1.1  mrg // which has the bit for SSA_NAME set. Then scan for the equivalency set in
    216  1.1  mrg // that block.   No previous lists need be searched.
    217  1.1  mrg 
    218  1.1  mrg // If SSA has an equivalence in this list, find and return it.
    219  1.1  mrg // Otherwise return NULL.
    220  1.1  mrg 
    221  1.1  mrg equiv_chain *
    222  1.1  mrg equiv_chain::find (unsigned ssa)
    223  1.1  mrg {
    224  1.1  mrg   equiv_chain *ptr = NULL;
    225  1.1  mrg   // If there are equiv sets and SSA is in one in this list, find it.
    226  1.1  mrg   // Otherwise return NULL.
    227  1.1  mrg   if (bitmap_bit_p (m_names, ssa))
    228  1.1  mrg     {
    229  1.1  mrg       for (ptr = m_next; ptr; ptr = ptr->m_next)
    230  1.1  mrg 	if (bitmap_bit_p (ptr->m_names, ssa))
    231  1.1  mrg 	  break;
    232  1.1  mrg     }
    233  1.1  mrg   return ptr;
    234  1.1  mrg }
    235  1.1  mrg 
    236  1.1  mrg // Dump the names in this equivalence set.
    237  1.1  mrg 
    238  1.1  mrg void
    239  1.1  mrg equiv_chain::dump (FILE *f) const
    240  1.1  mrg {
    241  1.1  mrg   bitmap_iterator bi;
    242  1.1  mrg   unsigned i;
    243  1.1  mrg 
    244  1.1  mrg   if (!m_names)
    245  1.1  mrg     return;
    246  1.1  mrg   fprintf (f, "Equivalence set : [");
    247  1.1  mrg   unsigned c = 0;
    248  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (m_names, 0, i, bi)
    249  1.1  mrg     {
    250  1.1  mrg       if (ssa_name (i))
    251  1.1  mrg 	{
    252  1.1  mrg 	  if (c++)
    253  1.1  mrg 	    fprintf (f, ", ");
    254  1.1  mrg 	  print_generic_expr (f, ssa_name (i), TDF_SLIM);
    255  1.1  mrg 	}
    256  1.1  mrg     }
    257  1.1  mrg   fprintf (f, "]\n");
    258  1.1  mrg }
    259  1.1  mrg 
    260  1.1  mrg // Instantiate an equivalency oracle.
    261  1.1  mrg 
    262  1.1  mrg equiv_oracle::equiv_oracle ()
    263  1.1  mrg {
    264  1.1  mrg   bitmap_obstack_initialize (&m_bitmaps);
    265  1.1  mrg   m_equiv.create (0);
    266  1.1  mrg   m_equiv.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
    267  1.1  mrg   m_equiv_set = BITMAP_ALLOC (&m_bitmaps);
    268  1.1  mrg   obstack_init (&m_chain_obstack);
    269  1.1  mrg   m_self_equiv.create (0);
    270  1.1  mrg   m_self_equiv.safe_grow_cleared (num_ssa_names + 1);
    271  1.1  mrg }
    272  1.1  mrg 
    273  1.1  mrg // Destruct an equivalency oracle.
    274  1.1  mrg 
    275  1.1  mrg equiv_oracle::~equiv_oracle ()
    276  1.1  mrg {
    277  1.1  mrg   m_self_equiv.release ();
    278  1.1  mrg   obstack_free (&m_chain_obstack, NULL);
    279  1.1  mrg   m_equiv.release ();
    280  1.1  mrg   bitmap_obstack_release (&m_bitmaps);
    281  1.1  mrg }
    282  1.1  mrg 
    283  1.1  mrg // Find and return the equivalency set for SSA along the dominators of BB.
    284  1.1  mrg // This is the external API.
    285  1.1  mrg 
    286  1.1  mrg const_bitmap
    287  1.1  mrg equiv_oracle::equiv_set (tree ssa, basic_block bb)
    288  1.1  mrg {
    289  1.1  mrg   // Search the dominator tree for an equivalency.
    290  1.1  mrg   equiv_chain *equiv = find_equiv_dom (ssa, bb);
    291  1.1  mrg   if (equiv)
    292  1.1  mrg     return equiv->m_names;
    293  1.1  mrg 
    294  1.1  mrg   // Otherwise return a cached equiv set containing just this SSA.
    295  1.1  mrg   unsigned v = SSA_NAME_VERSION (ssa);
    296  1.1  mrg   if (v >= m_self_equiv.length ())
    297  1.1  mrg     m_self_equiv.safe_grow_cleared (num_ssa_names + 1);
    298  1.1  mrg 
    299  1.1  mrg   if (!m_self_equiv[v])
    300  1.1  mrg     {
    301  1.1  mrg       m_self_equiv[v] = BITMAP_ALLOC (&m_bitmaps);
    302  1.1  mrg       bitmap_set_bit (m_self_equiv[v], v);
    303  1.1  mrg     }
    304  1.1  mrg   return m_self_equiv[v];
    305  1.1  mrg }
    306  1.1  mrg 
    307  1.1  mrg // Query if thre is a relation (equivalence) between 2 SSA_NAMEs.
    308  1.1  mrg 
    309  1.1  mrg relation_kind
    310  1.1  mrg equiv_oracle::query_relation (basic_block bb, tree ssa1, tree ssa2)
    311  1.1  mrg {
    312  1.1  mrg   // If the 2 ssa names share the same equiv set, they are equal.
    313  1.1  mrg   if (equiv_set (ssa1, bb) == equiv_set (ssa2, bb))
    314  1.1  mrg     return EQ_EXPR;
    315  1.1  mrg   return VREL_NONE;
    316  1.1  mrg }
    317  1.1  mrg 
    318  1.1  mrg // Query if thre is a relation (equivalence) between 2 SSA_NAMEs.
    319  1.1  mrg 
    320  1.1  mrg relation_kind
    321  1.1  mrg equiv_oracle::query_relation (basic_block bb ATTRIBUTE_UNUSED, const_bitmap e1,
    322  1.1  mrg 			      const_bitmap e2)
    323  1.1  mrg {
    324  1.1  mrg   // If the 2 ssa names share the same equiv set, they are equal.
    325  1.1  mrg   if (bitmap_equal_p (e1, e2))
    326  1.1  mrg     return EQ_EXPR;
    327  1.1  mrg   return VREL_NONE;
    328  1.1  mrg }
    329  1.1  mrg 
    330  1.1  mrg // If SSA has an equivalence in block BB, find and return it.
    331  1.1  mrg // Otherwise return NULL.
    332  1.1  mrg 
    333  1.1  mrg equiv_chain *
    334  1.1  mrg equiv_oracle::find_equiv_block (unsigned ssa, int bb) const
    335  1.1  mrg {
    336  1.1  mrg   if (bb >= (int)m_equiv.length () || !m_equiv[bb])
    337  1.1  mrg     return NULL;
    338  1.1  mrg 
    339  1.1  mrg   return m_equiv[bb]->find (ssa);
    340  1.1  mrg }
    341  1.1  mrg 
    342  1.1  mrg // Starting at block BB, walk the dominator chain looking for the nearest
    343  1.1  mrg // equivalence set containing NAME.
    344  1.1  mrg 
    345  1.1  mrg equiv_chain *
    346  1.1  mrg equiv_oracle::find_equiv_dom (tree name, basic_block bb) const
    347  1.1  mrg {
    348  1.1  mrg   unsigned v = SSA_NAME_VERSION (name);
    349  1.1  mrg   // Short circuit looking for names which have no equivalences.
    350  1.1  mrg   // Saves time looking for something which does not exist.
    351  1.1  mrg   if (!bitmap_bit_p (m_equiv_set, v))
    352  1.1  mrg     return NULL;
    353  1.1  mrg 
    354  1.1  mrg   // NAME has at least once equivalence set, check to see if it has one along
    355  1.1  mrg   // the dominator tree.
    356  1.1  mrg   for ( ; bb; bb = get_immediate_dominator (CDI_DOMINATORS, bb))
    357  1.1  mrg     {
    358  1.1  mrg       equiv_chain *ptr = find_equiv_block (v, bb->index);
    359  1.1  mrg       if (ptr)
    360  1.1  mrg 	return ptr;
    361  1.1  mrg     }
    362  1.1  mrg   return NULL;
    363  1.1  mrg }
    364  1.1  mrg 
    365  1.1  mrg // Register equivalance between ssa_name V and set EQUIV in block BB,
    366  1.1  mrg 
    367  1.1  mrg bitmap
    368  1.1  mrg equiv_oracle::register_equiv (basic_block bb, unsigned v, equiv_chain *equiv)
    369  1.1  mrg {
    370  1.1  mrg   // V will have an equivalency now.
    371  1.1  mrg   bitmap_set_bit (m_equiv_set, v);
    372  1.1  mrg 
    373  1.1  mrg   // If that equiv chain is in this block, simply use it.
    374  1.1  mrg   if (equiv->m_bb == bb)
    375  1.1  mrg     {
    376  1.1  mrg       bitmap_set_bit (equiv->m_names, v);
    377  1.1  mrg       bitmap_set_bit (m_equiv[bb->index]->m_names, v);
    378  1.1  mrg       return NULL;
    379  1.1  mrg     }
    380  1.1  mrg 
    381  1.1  mrg   // Otherwise create an equivalence for this block which is a copy
    382  1.1  mrg   // of equiv, the add V to the set.
    383  1.1  mrg   bitmap b = BITMAP_ALLOC (&m_bitmaps);
    384  1.1  mrg   valid_equivs (b, equiv->m_names, bb);
    385  1.1  mrg   bitmap_set_bit (b, v);
    386  1.1  mrg   return b;
    387  1.1  mrg }
    388  1.1  mrg 
    389  1.1  mrg // Register equivalence between set equiv_1 and equiv_2 in block BB.
    390  1.1  mrg // Return NULL if either name can be merged with the other.  Otherwise
    391  1.1  mrg // return a pointer to the combined bitmap of names.  This allows the
    392  1.1  mrg // caller to do any setup required for a new element.
    393  1.1  mrg 
    394  1.1  mrg bitmap
    395  1.1  mrg equiv_oracle::register_equiv (basic_block bb, equiv_chain *equiv_1,
    396  1.1  mrg 			      equiv_chain *equiv_2)
    397  1.1  mrg {
    398  1.1  mrg   // If equiv_1 is already in BB, use it as the combined set.
    399  1.1  mrg   if (equiv_1->m_bb == bb)
    400  1.1  mrg     {
    401  1.1  mrg       valid_equivs (equiv_1->m_names, equiv_2->m_names, bb);
    402  1.1  mrg       // Its hard to delete from a single linked list, so
    403  1.1  mrg       // just clear the second one.
    404  1.1  mrg       if (equiv_2->m_bb == bb)
    405  1.1  mrg 	bitmap_clear (equiv_2->m_names);
    406  1.1  mrg       else
    407  1.1  mrg 	// Ensure the new names are in the summary for BB.
    408  1.1  mrg 	bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_1->m_names);
    409  1.1  mrg       return NULL;
    410  1.1  mrg     }
    411  1.1  mrg   // If equiv_2 is in BB, use it for the combined set.
    412  1.1  mrg   if (equiv_2->m_bb == bb)
    413  1.1  mrg     {
    414  1.1  mrg       valid_equivs (equiv_2->m_names, equiv_1->m_names, bb);
    415  1.1  mrg       // Ensure the new names are in the summary.
    416  1.1  mrg       bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_2->m_names);
    417  1.1  mrg       return NULL;
    418  1.1  mrg     }
    419  1.1  mrg 
    420  1.1  mrg   // At this point, neither equivalence is from this block.
    421  1.1  mrg   bitmap b = BITMAP_ALLOC (&m_bitmaps);
    422  1.1  mrg   valid_equivs (b, equiv_1->m_names, bb);
    423  1.1  mrg   valid_equivs (b, equiv_2->m_names, bb);
    424  1.1  mrg   return b;
    425  1.1  mrg }
    426  1.1  mrg 
    427  1.1  mrg // Create an equivalency set containing only SSA in its definition block.
    428  1.1  mrg // This is done the first time SSA is registered in an equivalency and blocks
    429  1.1  mrg // any DOM searches past the definition.
    430  1.1  mrg 
    431  1.1  mrg void
    432  1.1  mrg equiv_oracle::register_initial_def (tree ssa)
    433  1.1  mrg {
    434  1.1  mrg   if (SSA_NAME_IS_DEFAULT_DEF (ssa))
    435  1.1  mrg     return;
    436  1.1  mrg   basic_block bb = gimple_bb (SSA_NAME_DEF_STMT (ssa));
    437  1.1  mrg   gcc_checking_assert (bb && !find_equiv_dom (ssa, bb));
    438  1.1  mrg 
    439  1.1  mrg   unsigned v = SSA_NAME_VERSION (ssa);
    440  1.1  mrg   bitmap_set_bit (m_equiv_set, v);
    441  1.1  mrg   bitmap equiv_set = BITMAP_ALLOC (&m_bitmaps);
    442  1.1  mrg   bitmap_set_bit (equiv_set, v);
    443  1.1  mrg   add_equiv_to_block (bb, equiv_set);
    444  1.1  mrg }
    445  1.1  mrg 
    446  1.1  mrg // Register an equivalence between SSA1 and SSA2 in block BB.
    447  1.1  mrg // The equivalence oracle maintains a vector of equivalencies indexed by basic
    448  1.1  mrg // block. When an equivalence bteween SSA1 and SSA2 is registered in block BB,
    449  1.1  mrg // a query is made as to what equivalences both names have already, and
    450  1.1  mrg // any preexisting equivalences are merged to create a single equivalence
    451  1.1  mrg // containing all the ssa_names in this basic block.
    452  1.1  mrg 
    453  1.1  mrg void
    454  1.1  mrg equiv_oracle::register_relation (basic_block bb, relation_kind k, tree ssa1,
    455  1.1  mrg 				 tree ssa2)
    456  1.1  mrg {
    457  1.1  mrg   // Only handle equality relations.
    458  1.1  mrg   if (k != EQ_EXPR)
    459  1.1  mrg     return;
    460  1.1  mrg 
    461  1.1  mrg   unsigned v1 = SSA_NAME_VERSION (ssa1);
    462  1.1  mrg   unsigned v2 = SSA_NAME_VERSION (ssa2);
    463  1.1  mrg 
    464  1.1  mrg   // If this is the first time an ssa_name has an equivalency registered
    465  1.1  mrg   // create a self-equivalency record in the def block.
    466  1.1  mrg   if (!bitmap_bit_p (m_equiv_set, v1))
    467  1.1  mrg     register_initial_def (ssa1);
    468  1.1  mrg   if (!bitmap_bit_p (m_equiv_set, v2))
    469  1.1  mrg     register_initial_def (ssa2);
    470  1.1  mrg 
    471  1.1  mrg   equiv_chain *equiv_1 = find_equiv_dom (ssa1, bb);
    472  1.1  mrg   equiv_chain *equiv_2 = find_equiv_dom (ssa2, bb);
    473  1.1  mrg 
    474  1.1  mrg   // Check if they are the same set
    475  1.1  mrg   if (equiv_1 && equiv_1 == equiv_2)
    476  1.1  mrg     return;
    477  1.1  mrg 
    478  1.1  mrg   bitmap equiv_set;
    479  1.1  mrg 
    480  1.1  mrg   // Case where we have 2 SSA_NAMEs that are not in any set.
    481  1.1  mrg   if (!equiv_1 && !equiv_2)
    482  1.1  mrg     {
    483  1.1  mrg       bitmap_set_bit (m_equiv_set, v1);
    484  1.1  mrg       bitmap_set_bit (m_equiv_set, v2);
    485  1.1  mrg 
    486  1.1  mrg       equiv_set = BITMAP_ALLOC (&m_bitmaps);
    487  1.1  mrg       bitmap_set_bit (equiv_set, v1);
    488  1.1  mrg       bitmap_set_bit (equiv_set, v2);
    489  1.1  mrg     }
    490  1.1  mrg   else if (!equiv_1 && equiv_2)
    491  1.1  mrg     equiv_set = register_equiv (bb, v1, equiv_2);
    492  1.1  mrg   else if (equiv_1 && !equiv_2)
    493  1.1  mrg     equiv_set = register_equiv (bb, v2, equiv_1);
    494  1.1  mrg   else
    495  1.1  mrg     equiv_set = register_equiv (bb, equiv_1, equiv_2);
    496  1.1  mrg 
    497  1.1  mrg   // A non-null return is a bitmap that is to be added to the current
    498  1.1  mrg   // block as a new equivalence.
    499  1.1  mrg   if (!equiv_set)
    500  1.1  mrg     return;
    501  1.1  mrg 
    502  1.1  mrg   add_equiv_to_block (bb, equiv_set);
    503  1.1  mrg }
    504  1.1  mrg 
    505  1.1  mrg // Add an equivalency record in block BB containing bitmap EQUIV_SET.
    506  1.1  mrg // Note the internal caller is responible for allocating EQUIV_SET properly.
    507  1.1  mrg 
    508  1.1  mrg void
    509  1.1  mrg equiv_oracle::add_equiv_to_block (basic_block bb, bitmap equiv_set)
    510  1.1  mrg {
    511  1.1  mrg   equiv_chain *ptr;
    512  1.1  mrg 
    513  1.1  mrg   // Check if this is the first time a block has an equivalence added.
    514  1.1  mrg   // and create a header block. And set the summary for this block.
    515  1.1  mrg   if (!m_equiv[bb->index])
    516  1.1  mrg     {
    517  1.1  mrg       ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack,
    518  1.1  mrg 					   sizeof (equiv_chain));
    519  1.1  mrg       ptr->m_names = BITMAP_ALLOC (&m_bitmaps);
    520  1.1  mrg       bitmap_copy (ptr->m_names, equiv_set);
    521  1.1  mrg       ptr->m_bb = bb;
    522  1.1  mrg       ptr->m_next = NULL;
    523  1.1  mrg       m_equiv[bb->index] = ptr;
    524  1.1  mrg     }
    525  1.1  mrg 
    526  1.1  mrg   // Now create the element for this equiv set and initialize it.
    527  1.1  mrg   ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack, sizeof (equiv_chain));
    528  1.1  mrg   ptr->m_names = equiv_set;
    529  1.1  mrg   ptr->m_bb = bb;
    530  1.1  mrg   gcc_checking_assert (bb->index < (int)m_equiv.length ());
    531  1.1  mrg   ptr->m_next = m_equiv[bb->index]->m_next;
    532  1.1  mrg   m_equiv[bb->index]->m_next = ptr;
    533  1.1  mrg   bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_set);
    534  1.1  mrg }
    535  1.1  mrg 
    536  1.1  mrg // Make sure the BB vector is big enough and grow it if needed.
    537  1.1  mrg 
    538  1.1  mrg void
    539  1.1  mrg equiv_oracle::limit_check (basic_block bb)
    540  1.1  mrg {
    541  1.1  mrg   int i = (bb) ? bb->index : last_basic_block_for_fn (cfun);
    542  1.1  mrg   if (i >= (int)m_equiv.length ())
    543  1.1  mrg     m_equiv.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
    544  1.1  mrg }
    545  1.1  mrg 
    546  1.1  mrg // Dump the equivalence sets in BB to file F.
    547  1.1  mrg 
    548  1.1  mrg void
    549  1.1  mrg equiv_oracle::dump (FILE *f, basic_block bb) const
    550  1.1  mrg {
    551  1.1  mrg   if (bb->index >= (int)m_equiv.length ())
    552  1.1  mrg     return;
    553  1.1  mrg   if (!m_equiv[bb->index])
    554  1.1  mrg     return;
    555  1.1  mrg 
    556  1.1  mrg   equiv_chain *ptr = m_equiv[bb->index]->m_next;
    557  1.1  mrg   for (; ptr; ptr = ptr->m_next)
    558  1.1  mrg     ptr->dump (f);
    559  1.1  mrg }
    560  1.1  mrg 
    561  1.1  mrg // Dump all equivalence sets known to the oracle.
    562  1.1  mrg 
    563  1.1  mrg void
    564  1.1  mrg equiv_oracle::dump (FILE *f) const
    565  1.1  mrg {
    566  1.1  mrg   fprintf (f, "Equivalency dump\n");
    567  1.1  mrg   for (unsigned i = 0; i < m_equiv.length (); i++)
    568  1.1  mrg     if (m_equiv[i] && BASIC_BLOCK_FOR_FN (cfun, i))
    569  1.1  mrg       {
    570  1.1  mrg 	fprintf (f, "BB%d\n", i);
    571  1.1  mrg 	dump (f, BASIC_BLOCK_FOR_FN (cfun, i));
    572  1.1  mrg       }
    573  1.1  mrg }
    574  1.1  mrg 
    575  1.1  mrg 
    576  1.1  mrg // --------------------------------------------------------------------------
    577  1.1  mrg 
    578  1.1  mrg // The value-relation class is used to encapsulate the represention of an
    579  1.1  mrg // individual relation between 2 ssa-names, and to facilitate operating on
    580  1.1  mrg // the relation.
    581  1.1  mrg 
    582  1.1  mrg class value_relation
    583  1.1  mrg {
    584  1.1  mrg public:
    585  1.1  mrg   value_relation ();
    586  1.1  mrg   value_relation (relation_kind kind, tree n1, tree n2);
    587  1.1  mrg   void set_relation (relation_kind kind, tree n1, tree n2);
    588  1.1  mrg 
    589  1.1  mrg   inline relation_kind kind () const { return related; }
    590  1.1  mrg   inline tree op1 () const { return name1; }
    591  1.1  mrg   inline tree op2 () const { return name2; }
    592  1.1  mrg 
    593  1.1  mrg   bool union_ (value_relation &p);
    594  1.1  mrg   bool intersect (value_relation &p);
    595  1.1  mrg   void negate ();
    596  1.1  mrg   bool apply_transitive (const value_relation &rel);
    597  1.1  mrg 
    598  1.1  mrg   void dump (FILE *f) const;
    599  1.1  mrg private:
    600  1.1  mrg   relation_kind related;
    601  1.1  mrg   tree name1, name2;
    602  1.1  mrg };
    603  1.1  mrg 
    604  1.1  mrg // Set relation R between ssa_name N1 and N2.
    605  1.1  mrg 
    606  1.1  mrg inline void
    607  1.1  mrg value_relation::set_relation (relation_kind r, tree n1, tree n2)
    608  1.1  mrg {
    609  1.1  mrg   gcc_checking_assert (SSA_NAME_VERSION (n1) != SSA_NAME_VERSION (n2));
    610  1.1  mrg   related = r;
    611  1.1  mrg   name1 = n1;
    612  1.1  mrg   name2 = n2;
    613  1.1  mrg }
    614  1.1  mrg 
    615  1.1  mrg // Default constructor.
    616  1.1  mrg 
    617  1.1  mrg inline
    618  1.1  mrg value_relation::value_relation ()
    619  1.1  mrg {
    620  1.1  mrg   related = VREL_NONE;
    621  1.1  mrg   name1 = NULL_TREE;
    622  1.1  mrg   name2 = NULL_TREE;
    623  1.1  mrg }
    624  1.1  mrg 
    625  1.1  mrg // Constructor for relation R between SSA version N1 nd N2.
    626  1.1  mrg 
    627  1.1  mrg inline
    628  1.1  mrg value_relation::value_relation (relation_kind kind, tree n1, tree n2)
    629  1.1  mrg {
    630  1.1  mrg   set_relation (kind, n1, n2);
    631  1.1  mrg }
    632  1.1  mrg 
    633  1.1  mrg // Negate the current relation.
    634  1.1  mrg 
    635  1.1  mrg void
    636  1.1  mrg value_relation::negate ()
    637  1.1  mrg {
    638  1.1  mrg   related = relation_negate (related);
    639  1.1  mrg }
    640  1.1  mrg 
    641  1.1  mrg // Perform an intersection between 2 relations. *this &&= p.
    642  1.1  mrg 
    643  1.1  mrg bool
    644  1.1  mrg value_relation::intersect (value_relation &p)
    645  1.1  mrg {
    646  1.1  mrg   // Save previous value
    647  1.1  mrg   relation_kind old = related;
    648  1.1  mrg 
    649  1.1  mrg   if (p.op1 () == op1 () && p.op2 () == op2 ())
    650  1.1  mrg     related = relation_intersect (kind (), p.kind ());
    651  1.1  mrg   else if (p.op2 () == op1 () && p.op1 () == op2 ())
    652  1.1  mrg     related = relation_intersect (kind (), relation_swap (p.kind ()));
    653  1.1  mrg   else
    654  1.1  mrg     return false;
    655  1.1  mrg 
    656  1.1  mrg   return old != related;
    657  1.1  mrg }
    658  1.1  mrg 
    659  1.1  mrg // Perform a union between 2 relations. *this ||= p.
    660  1.1  mrg 
    661  1.1  mrg bool
    662  1.1  mrg value_relation::union_ (value_relation &p)
    663  1.1  mrg {
    664  1.1  mrg   // Save previous value
    665  1.1  mrg   relation_kind old = related;
    666  1.1  mrg 
    667  1.1  mrg   if (p.op1 () == op1 () && p.op2 () == op2 ())
    668  1.1  mrg     related = relation_union (kind(), p.kind());
    669  1.1  mrg   else if (p.op2 () == op1 () && p.op1 () == op2 ())
    670  1.1  mrg     related = relation_union (kind(), relation_swap (p.kind ()));
    671  1.1  mrg   else
    672  1.1  mrg     return false;
    673  1.1  mrg 
    674  1.1  mrg   return old != related;
    675  1.1  mrg }
    676  1.1  mrg 
    677  1.1  mrg // Identify and apply any transitive relations between REL
    678  1.1  mrg // and THIS.  Return true if there was a transformation.
    679  1.1  mrg 
    680  1.1  mrg bool
    681  1.1  mrg value_relation::apply_transitive (const value_relation &rel)
    682  1.1  mrg {
    683  1.1  mrg   relation_kind k = VREL_NONE;
    684  1.1  mrg 
    685  1.1  mrg   // Idenity any common operand, and notrmalize the relations to
    686  1.1  mrg   // the form : A < B  B < C produces A < C
    687  1.1  mrg   if (rel.op1 () == name2)
    688  1.1  mrg     {
    689  1.1  mrg       // A < B   B < C
    690  1.1  mrg       if (rel.op2 () == name1)
    691  1.1  mrg 	return false;
    692  1.1  mrg       k = relation_transitive (kind (), rel.kind ());
    693  1.1  mrg       if (k != VREL_NONE)
    694  1.1  mrg 	{
    695  1.1  mrg 	  related = k;
    696  1.1  mrg 	  name2 = rel.op2 ();
    697  1.1  mrg 	  return true;
    698  1.1  mrg 	}
    699  1.1  mrg     }
    700  1.1  mrg   else if (rel.op1 () == name1)
    701  1.1  mrg     {
    702  1.1  mrg       // B > A   B < C
    703  1.1  mrg       if (rel.op2 () == name2)
    704  1.1  mrg 	return false;
    705  1.1  mrg       k = relation_transitive (relation_swap (kind ()), rel.kind ());
    706  1.1  mrg       if (k != VREL_NONE)
    707  1.1  mrg 	{
    708  1.1  mrg 	  related = k;
    709  1.1  mrg 	  name1 = name2;
    710  1.1  mrg 	  name2 = rel.op2 ();
    711  1.1  mrg 	  return true;
    712  1.1  mrg 	}
    713  1.1  mrg     }
    714  1.1  mrg   else if (rel.op2 () == name2)
    715  1.1  mrg     {
    716  1.1  mrg        // A < B   C > B
    717  1.1  mrg        if (rel.op1 () == name1)
    718  1.1  mrg 	 return false;
    719  1.1  mrg       k = relation_transitive (kind (), relation_swap (rel.kind ()));
    720  1.1  mrg       if (k != VREL_NONE)
    721  1.1  mrg 	{
    722  1.1  mrg 	  related = k;
    723  1.1  mrg 	  name2 = rel.op1 ();
    724  1.1  mrg 	  return true;
    725  1.1  mrg 	}
    726  1.1  mrg     }
    727  1.1  mrg   else if (rel.op2 () == name1)
    728  1.1  mrg     {
    729  1.1  mrg       // B > A  C > B
    730  1.1  mrg       if (rel.op1 () == name2)
    731  1.1  mrg 	return false;
    732  1.1  mrg       k = relation_transitive (relation_swap (kind ()),
    733  1.1  mrg 			       relation_swap (rel.kind ()));
    734  1.1  mrg       if (k != VREL_NONE)
    735  1.1  mrg 	{
    736  1.1  mrg 	  related = k;
    737  1.1  mrg 	  name1 = name2;
    738  1.1  mrg 	  name2 = rel.op1 ();
    739  1.1  mrg 	  return true;
    740  1.1  mrg 	}
    741  1.1  mrg     }
    742  1.1  mrg   return false;
    743  1.1  mrg }
    744  1.1  mrg 
    745  1.1  mrg // Dump the relation to file F.
    746  1.1  mrg 
    747  1.1  mrg void
    748  1.1  mrg value_relation::dump (FILE *f) const
    749  1.1  mrg {
    750  1.1  mrg   if (!name1 || !name2)
    751  1.1  mrg     {
    752  1.1  mrg       fprintf (f, "uninitialized");
    753  1.1  mrg       return;
    754  1.1  mrg     }
    755  1.1  mrg   fputc ('(', f);
    756  1.1  mrg   print_generic_expr (f, op1 (), TDF_SLIM);
    757  1.1  mrg   print_relation (f, kind ());
    758  1.1  mrg   print_generic_expr (f, op2 (), TDF_SLIM);
    759  1.1  mrg   fputc(')', f);
    760  1.1  mrg }
    761  1.1  mrg 
    762  1.1  mrg // This container is used to link relations in a chain.
    763  1.1  mrg 
    764  1.1  mrg class relation_chain : public value_relation
    765  1.1  mrg {
    766  1.1  mrg public:
    767  1.1  mrg   relation_chain *m_next;
    768  1.1  mrg };
    769  1.1  mrg 
    770  1.1  mrg // ------------------------------------------------------------------------
    771  1.1  mrg 
    772  1.1  mrg // Find the relation between any ssa_name in B1 and any name in B2 in LIST.
    773  1.1  mrg // This will allow equivalencies to be applied to any SSA_NAME in a relation.
    774  1.1  mrg 
    775  1.1  mrg relation_kind
    776  1.1  mrg relation_chain_head::find_relation (const_bitmap b1, const_bitmap b2) const
    777  1.1  mrg {
    778  1.1  mrg   if (!m_names)
    779  1.1  mrg     return VREL_NONE;
    780  1.1  mrg 
    781  1.1  mrg   // If both b1 and b2 aren't referenced in thie block, cant be a relation
    782  1.1  mrg   if (!bitmap_intersect_p (m_names, b1) || !bitmap_intersect_p (m_names, b2))
    783  1.1  mrg     return VREL_NONE;
    784  1.1  mrg 
    785  1.1  mrg   // Search for the fiorst relation that contains BOTH an element from B1
    786  1.1  mrg   // and B2, and return that relation.
    787  1.1  mrg   for (relation_chain *ptr = m_head; ptr ; ptr = ptr->m_next)
    788  1.1  mrg     {
    789  1.1  mrg       unsigned op1 = SSA_NAME_VERSION (ptr->op1 ());
    790  1.1  mrg       unsigned op2 = SSA_NAME_VERSION (ptr->op2 ());
    791  1.1  mrg       if (bitmap_bit_p (b1, op1) && bitmap_bit_p (b2, op2))
    792  1.1  mrg 	return ptr->kind ();
    793  1.1  mrg       if (bitmap_bit_p (b1, op2) && bitmap_bit_p (b2, op1))
    794  1.1  mrg 	return relation_swap (ptr->kind ());
    795  1.1  mrg     }
    796  1.1  mrg 
    797  1.1  mrg   return VREL_NONE;
    798  1.1  mrg }
    799  1.1  mrg 
    800  1.1  mrg // Instantiate a relation oracle.
    801  1.1  mrg 
    802  1.1  mrg dom_oracle::dom_oracle ()
    803  1.1  mrg {
    804  1.1  mrg   m_relations.create (0);
    805  1.1  mrg   m_relations.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
    806  1.1  mrg   m_relation_set = BITMAP_ALLOC (&m_bitmaps);
    807  1.1  mrg   m_tmp = BITMAP_ALLOC (&m_bitmaps);
    808  1.1  mrg   m_tmp2 = BITMAP_ALLOC (&m_bitmaps);
    809  1.1  mrg }
    810  1.1  mrg 
    811  1.1  mrg // Destruct a relation oracle.
    812  1.1  mrg 
    813  1.1  mrg dom_oracle::~dom_oracle ()
    814  1.1  mrg {
    815  1.1  mrg   m_relations.release ();
    816  1.1  mrg }
    817  1.1  mrg 
    818  1.1  mrg // Register relation K between ssa_name OP1 and OP2 on STMT.
    819  1.1  mrg 
    820  1.1  mrg void
    821  1.1  mrg relation_oracle::register_stmt (gimple *stmt, relation_kind k, tree op1,
    822  1.1  mrg 				tree op2)
    823  1.1  mrg {
    824  1.1  mrg   gcc_checking_assert (TREE_CODE (op1) == SSA_NAME);
    825  1.1  mrg   gcc_checking_assert (TREE_CODE (op2) == SSA_NAME);
    826  1.1  mrg   gcc_checking_assert (stmt && gimple_bb (stmt));
    827  1.1  mrg 
    828  1.1  mrg   // Don't register lack of a relation.
    829  1.1  mrg   if (k == VREL_NONE)
    830  1.1  mrg     return;
    831  1.1  mrg 
    832  1.1  mrg   if (dump_file && (dump_flags & TDF_DETAILS))
    833  1.1  mrg     {
    834  1.1  mrg       value_relation vr (k, op1, op2);
    835  1.1  mrg       fprintf (dump_file, " Registering value_relation ");
    836  1.1  mrg       vr.dump (dump_file);
    837  1.1  mrg       fprintf (dump_file, " (bb%d) at ", gimple_bb (stmt)->index);
    838  1.1  mrg       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
    839  1.1  mrg     }
    840  1.1  mrg 
    841  1.1  mrg   // If an equivalence is being added between a PHI and one of its arguments
    842  1.1  mrg   // make sure that that argument is not defined in the same block.
    843  1.1  mrg   // This can happen along back edges and the equivalence will not be
    844  1.1  mrg   // applicable as it would require a use before def.
    845  1.1  mrg   if (k == EQ_EXPR && is_a<gphi *> (stmt))
    846  1.1  mrg     {
    847  1.1  mrg       tree phi_def = gimple_phi_result (stmt);
    848  1.1  mrg       gcc_checking_assert (phi_def == op1 || phi_def == op2);
    849  1.1  mrg       tree arg = op2;
    850  1.1  mrg       if (phi_def == op2)
    851  1.1  mrg 	arg = op1;
    852  1.1  mrg       if (gimple_bb (stmt) == gimple_bb (SSA_NAME_DEF_STMT (arg)))
    853  1.1  mrg 	{
    854  1.1  mrg 	  if (dump_file && (dump_flags & TDF_DETAILS))
    855  1.1  mrg 	    {
    856  1.1  mrg 	      fprintf (dump_file, "  Not registered due to ");
    857  1.1  mrg 	      print_generic_expr (dump_file, arg, TDF_SLIM);
    858  1.1  mrg 	      fprintf (dump_file, " being defined in the same block.\n");
    859  1.1  mrg 	    }
    860  1.1  mrg 	  return;
    861  1.1  mrg 	}
    862  1.1  mrg     }
    863  1.1  mrg   register_relation (gimple_bb (stmt), k, op1, op2);
    864  1.1  mrg }
    865  1.1  mrg 
    866  1.1  mrg // Register relation K between ssa_name OP1 and OP2 on edge E.
    867  1.1  mrg 
    868  1.1  mrg void
    869  1.1  mrg relation_oracle::register_edge (edge e, relation_kind k, tree op1, tree op2)
    870  1.1  mrg {
    871  1.1  mrg   gcc_checking_assert (TREE_CODE (op1) == SSA_NAME);
    872  1.1  mrg   gcc_checking_assert (TREE_CODE (op2) == SSA_NAME);
    873  1.1  mrg 
    874  1.1  mrg   // Do not register lack of relation, or blocks which have more than
    875  1.1  mrg   // edge E for a predecessor.
    876  1.1  mrg   if (k == VREL_NONE || !single_pred_p (e->dest))
    877  1.1  mrg     return;
    878  1.1  mrg 
    879  1.1  mrg   if (dump_file && (dump_flags & TDF_DETAILS))
    880  1.1  mrg     {
    881  1.1  mrg       value_relation vr (k, op1, op2);
    882  1.1  mrg       fprintf (dump_file, " Registering value_relation ");
    883  1.1  mrg       vr.dump (dump_file);
    884  1.1  mrg       fprintf (dump_file, " on (%d->%d)\n", e->src->index, e->dest->index);
    885  1.1  mrg     }
    886  1.1  mrg 
    887  1.1  mrg   register_relation (e->dest, k, op1, op2);
    888  1.1  mrg }
    889  1.1  mrg 
    890  1.1  mrg // Register relation K between OP! and OP2 in block BB.
    891  1.1  mrg // This creates the record and searches for existing records in the dominator
    892  1.1  mrg // tree to merge with.
    893  1.1  mrg 
    894  1.1  mrg void
    895  1.1  mrg dom_oracle::register_relation (basic_block bb, relation_kind k, tree op1,
    896  1.1  mrg 			       tree op2)
    897  1.1  mrg {
    898  1.1  mrg   // If the 2 ssa_names are the same, do nothing.  An equivalence is implied,
    899  1.1  mrg   // and no other relation makes sense.
    900  1.1  mrg   if (op1 == op2)
    901  1.1  mrg     return;
    902  1.1  mrg 
    903  1.1  mrg   // Equivalencies are handled by the equivalence oracle.
    904  1.1  mrg   if (k == EQ_EXPR)
    905  1.1  mrg     equiv_oracle::register_relation (bb, k, op1, op2);
    906  1.1  mrg   else
    907  1.1  mrg     {
    908  1.1  mrg       relation_chain *ptr = set_one_relation (bb, k, op1, op2);
    909  1.1  mrg       if (ptr)
    910  1.1  mrg 	register_transitives (bb, *ptr);
    911  1.1  mrg     }
    912  1.1  mrg }
    913  1.1  mrg 
    914  1.1  mrg // Register relation K between OP! and OP2 in block BB.
    915  1.1  mrg // This creates the record and searches for existing records in the dominator
    916  1.1  mrg // tree to merge with.  Return the record, or NULL if no record was created.
    917  1.1  mrg 
    918  1.1  mrg relation_chain *
    919  1.1  mrg dom_oracle::set_one_relation (basic_block bb, relation_kind k, tree op1,
    920  1.1  mrg 			      tree op2)
    921  1.1  mrg {
    922  1.1  mrg   gcc_checking_assert (k != VREL_NONE && k != EQ_EXPR);
    923  1.1  mrg 
    924  1.1  mrg   value_relation vr(k, op1, op2);
    925  1.1  mrg   int bbi = bb->index;
    926  1.1  mrg 
    927  1.1  mrg   if (bbi >= (int)m_relations.length())
    928  1.1  mrg     m_relations.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
    929  1.1  mrg 
    930  1.1  mrg   // Summary bitmap indicating what ssa_names have relations in this BB.
    931  1.1  mrg   bitmap bm = m_relations[bbi].m_names;
    932  1.1  mrg   if (!bm)
    933  1.1  mrg     bm = m_relations[bbi].m_names = BITMAP_ALLOC (&m_bitmaps);
    934  1.1  mrg   unsigned v1 = SSA_NAME_VERSION (op1);
    935  1.1  mrg   unsigned v2 = SSA_NAME_VERSION (op2);
    936  1.1  mrg 
    937  1.1  mrg   relation_kind curr;
    938  1.1  mrg   relation_chain *ptr;
    939  1.1  mrg   curr = find_relation_block (bbi, v1, v2, &ptr);
    940  1.1  mrg   // There is an existing relation in this block, just intersect with it.
    941  1.1  mrg   if (curr != VREL_NONE)
    942  1.1  mrg     {
    943  1.1  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
    944  1.1  mrg 	{
    945  1.1  mrg 	  fprintf (dump_file, "    Intersecting with existing ");
    946  1.1  mrg 	  ptr->dump (dump_file);
    947  1.1  mrg 	}
    948  1.1  mrg       // Check into whether we can simply replace the relation rather than
    949  1.1  mrg       // intersecting it.  THis may help with some optimistic iterative
    950  1.1  mrg       // updating algorithms.
    951  1.1  mrg       ptr->intersect (vr);
    952  1.1  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
    953  1.1  mrg 	{
    954  1.1  mrg 	  fprintf (dump_file, " to produce ");
    955  1.1  mrg 	  ptr->dump (dump_file);
    956  1.1  mrg 	  fprintf (dump_file, "\n");
    957  1.1  mrg 	}
    958  1.1  mrg     }
    959  1.1  mrg   else
    960  1.1  mrg     {
    961  1.1  mrg       if (m_relations[bbi].m_num_relations >= param_relation_block_limit)
    962  1.1  mrg 	{
    963  1.1  mrg 	  if (dump_file && (dump_flags & TDF_DETAILS))
    964  1.1  mrg 	    fprintf (dump_file, "  Not registered due to bb being full\n");
    965  1.1  mrg 	  return NULL;
    966  1.1  mrg 	}
    967  1.1  mrg       m_relations[bbi].m_num_relations++;
    968  1.1  mrg       // Check for an existing relation further up the DOM chain.
    969  1.1  mrg       // By including dominating relations, The first one found in any search
    970  1.1  mrg       // will be the aggregate of all the previous ones.
    971  1.1  mrg       curr = find_relation_dom (bb, v1, v2);
    972  1.1  mrg       if (curr != VREL_NONE)
    973  1.1  mrg 	k = relation_intersect (curr, k);
    974  1.1  mrg 
    975  1.1  mrg       bitmap_set_bit (bm, v1);
    976  1.1  mrg       bitmap_set_bit (bm, v2);
    977  1.1  mrg       bitmap_set_bit (m_relation_set, v1);
    978  1.1  mrg       bitmap_set_bit (m_relation_set, v2);
    979  1.1  mrg 
    980  1.1  mrg       ptr = (relation_chain *) obstack_alloc (&m_chain_obstack,
    981  1.1  mrg 					      sizeof (relation_chain));
    982  1.1  mrg       ptr->set_relation (k, op1, op2);
    983  1.1  mrg       ptr->m_next = m_relations[bbi].m_head;
    984  1.1  mrg       m_relations[bbi].m_head = ptr;
    985  1.1  mrg     }
    986  1.1  mrg   return ptr;
    987  1.1  mrg }
    988  1.1  mrg 
    989  1.1  mrg // Starting at ROOT_BB search the DOM tree  looking for relations which
    990  1.1  mrg // may produce transitive relations to RELATION.  EQUIV1 and EQUIV2 are
    991  1.1  mrg // bitmaps for op1/op2 and any of their equivalences that should also be
    992  1.1  mrg // considered.
    993  1.1  mrg 
    994  1.1  mrg void
    995  1.1  mrg dom_oracle::register_transitives (basic_block root_bb,
    996  1.1  mrg 				  const value_relation &relation)
    997  1.1  mrg {
    998  1.1  mrg   basic_block bb;
    999  1.1  mrg   // Only apply transitives to certain kinds of operations.
   1000  1.1  mrg   switch (relation.kind ())
   1001  1.1  mrg     {
   1002  1.1  mrg       case LE_EXPR:
   1003  1.1  mrg       case LT_EXPR:
   1004  1.1  mrg       case GT_EXPR:
   1005  1.1  mrg       case GE_EXPR:
   1006  1.1  mrg 	break;
   1007  1.1  mrg       default:
   1008  1.1  mrg 	return;
   1009  1.1  mrg     }
   1010  1.1  mrg 
   1011  1.1  mrg   const_bitmap equiv1 = equiv_set (relation.op1 (), root_bb);
   1012  1.1  mrg   const_bitmap equiv2 = equiv_set (relation.op2 (), root_bb);
   1013  1.1  mrg 
   1014  1.1  mrg   for (bb = root_bb; bb; bb = get_immediate_dominator (CDI_DOMINATORS, bb))
   1015  1.1  mrg     {
   1016  1.1  mrg       int bbi = bb->index;
   1017  1.1  mrg       if (bbi >= (int)m_relations.length())
   1018  1.1  mrg 	continue;
   1019  1.1  mrg       const_bitmap bm = m_relations[bbi].m_names;
   1020  1.1  mrg       if (!bm)
   1021  1.1  mrg 	continue;
   1022  1.1  mrg       if (!bitmap_intersect_p (bm, equiv1) && !bitmap_intersect_p (bm, equiv2))
   1023  1.1  mrg 	continue;
   1024  1.1  mrg       // At least one of the 2 ops has a relation in this block.
   1025  1.1  mrg       relation_chain *ptr;
   1026  1.1  mrg       for (ptr = m_relations[bbi].m_head; ptr ; ptr = ptr->m_next)
   1027  1.1  mrg 	{
   1028  1.1  mrg 	  // In the presence of an equivalence, 2 operands may do not
   1029  1.1  mrg 	  // naturally match. ie  with equivalence a_2 == b_3
   1030  1.1  mrg 	  // given c_1 < a_2 && b_3 < d_4
   1031  1.1  mrg 	  // convert the second relation (b_3 < d_4) to match any
   1032  1.1  mrg 	  // equivalences to found in the first relation.
   1033  1.1  mrg 	  // ie convert b_3 < d_4 to a_2 < d_4, which then exposes the
   1034  1.1  mrg 	  // transitive operation:  c_1 < a_2 && a_2 < d_4 -> c_1 < d_4
   1035  1.1  mrg 
   1036  1.1  mrg 	  tree r1, r2;
   1037  1.1  mrg 	  tree p1 = ptr->op1 ();
   1038  1.1  mrg 	  tree p2 = ptr->op2 ();
   1039  1.1  mrg 	  // Find which equivalence is in the first operand.
   1040  1.1  mrg 	  if (bitmap_bit_p (equiv1, SSA_NAME_VERSION (p1)))
   1041  1.1  mrg 	    r1 = p1;
   1042  1.1  mrg 	  else if (bitmap_bit_p (equiv1, SSA_NAME_VERSION (p2)))
   1043  1.1  mrg 	    r1 = p2;
   1044  1.1  mrg 	  else
   1045  1.1  mrg 	    r1 = NULL_TREE;
   1046  1.1  mrg 
   1047  1.1  mrg 	  // Find which equivalence is in the second operand.
   1048  1.1  mrg 	  if (bitmap_bit_p (equiv2, SSA_NAME_VERSION (p1)))
   1049  1.1  mrg 	    r2 = p1;
   1050  1.1  mrg 	  else if (bitmap_bit_p (equiv2, SSA_NAME_VERSION (p2)))
   1051  1.1  mrg 	    r2 = p2;
   1052  1.1  mrg 	  else
   1053  1.1  mrg 	    r2 = NULL_TREE;
   1054  1.1  mrg 
   1055  1.1  mrg 	  // Ignore if both NULL (not relevant relation) or the same,
   1056  1.1  mrg 	  if (r1 == r2)
   1057  1.1  mrg 	    continue;
   1058  1.1  mrg 
   1059  1.1  mrg 	  // Any operand not an equivalence, just take the real operand.
   1060  1.1  mrg 	  if (!r1)
   1061  1.1  mrg 	    r1 = relation.op1 ();
   1062  1.1  mrg 	  if (!r2)
   1063  1.1  mrg 	    r2 = relation.op2 ();
   1064  1.1  mrg 
   1065  1.1  mrg 	  value_relation nr (relation.kind (), r1, r2);
   1066  1.1  mrg 	  if (nr.apply_transitive (*ptr))
   1067  1.1  mrg 	    {
   1068  1.1  mrg 	      if (!set_one_relation (root_bb, nr.kind (), nr.op1 (), nr.op2 ()))
   1069  1.1  mrg 		return;
   1070  1.1  mrg 	      if (dump_file && (dump_flags & TDF_DETAILS))
   1071  1.1  mrg 		{
   1072  1.1  mrg 		  fprintf (dump_file, "   Registering transitive relation ");
   1073  1.1  mrg 		  nr.dump (dump_file);
   1074  1.1  mrg 		  fputc ('\n', dump_file);
   1075  1.1  mrg 		}
   1076  1.1  mrg 	    }
   1077  1.1  mrg 
   1078  1.1  mrg 	}
   1079  1.1  mrg     }
   1080  1.1  mrg }
   1081  1.1  mrg 
   1082  1.1  mrg // Find the relation between any ssa_name in B1 and any name in B2 in block BB.
   1083  1.1  mrg // This will allow equivalencies to be applied to any SSA_NAME in a relation.
   1084  1.1  mrg 
   1085  1.1  mrg relation_kind
   1086  1.1  mrg dom_oracle::find_relation_block (unsigned bb, const_bitmap b1,
   1087  1.1  mrg 				      const_bitmap b2) const
   1088  1.1  mrg {
   1089  1.1  mrg   if (bb >= m_relations.length())
   1090  1.1  mrg     return VREL_NONE;
   1091  1.1  mrg 
   1092  1.1  mrg   return m_relations[bb].find_relation (b1, b2);
   1093  1.1  mrg }
   1094  1.1  mrg 
   1095  1.1  mrg // Search the DOM tree for a relation between an element of equivalency set B1
   1096  1.1  mrg // and B2, starting with block BB.
   1097  1.1  mrg 
   1098  1.1  mrg relation_kind
   1099  1.1  mrg dom_oracle::query_relation (basic_block bb, const_bitmap b1,
   1100  1.1  mrg 			    const_bitmap b2)
   1101  1.1  mrg {
   1102  1.1  mrg   relation_kind r;
   1103  1.1  mrg   if (bitmap_equal_p (b1, b2))
   1104  1.1  mrg     return EQ_EXPR;
   1105  1.1  mrg 
   1106  1.1  mrg   // If either name does not occur in a relation anywhere, there isnt one.
   1107  1.1  mrg   if (!bitmap_intersect_p (m_relation_set, b1)
   1108  1.1  mrg       || !bitmap_intersect_p (m_relation_set, b2))
   1109  1.1  mrg     return VREL_NONE;
   1110  1.1  mrg 
   1111  1.1  mrg   // Search each block in the DOM tree checking.
   1112  1.1  mrg   for ( ; bb; bb = get_immediate_dominator (CDI_DOMINATORS, bb))
   1113  1.1  mrg     {
   1114  1.1  mrg       r = find_relation_block (bb->index, b1, b2);
   1115  1.1  mrg       if (r != VREL_NONE)
   1116  1.1  mrg 	return r;
   1117  1.1  mrg     }
   1118  1.1  mrg   return VREL_NONE;
   1119  1.1  mrg 
   1120  1.1  mrg }
   1121  1.1  mrg 
   1122  1.1  mrg // Find a relation in block BB between ssa version V1 and V2.  If a relation
   1123  1.1  mrg // is found, return a pointer to the chain object in OBJ.
   1124  1.1  mrg 
   1125  1.1  mrg relation_kind
   1126  1.1  mrg dom_oracle::find_relation_block (int bb, unsigned v1, unsigned v2,
   1127  1.1  mrg 				     relation_chain **obj) const
   1128  1.1  mrg {
   1129  1.1  mrg   if (bb >= (int)m_relations.length())
   1130  1.1  mrg     return VREL_NONE;
   1131  1.1  mrg 
   1132  1.1  mrg   const_bitmap bm = m_relations[bb].m_names;
   1133  1.1  mrg   if (!bm)
   1134  1.1  mrg     return VREL_NONE;
   1135  1.1  mrg 
   1136  1.1  mrg   // If both b1 and b2 aren't referenced in thie block, cant be a relation
   1137  1.1  mrg   if (!bitmap_bit_p (bm, v1) || !bitmap_bit_p (bm, v2))
   1138  1.1  mrg     return VREL_NONE;
   1139  1.1  mrg 
   1140  1.1  mrg   relation_chain *ptr;
   1141  1.1  mrg   for (ptr = m_relations[bb].m_head; ptr ; ptr = ptr->m_next)
   1142  1.1  mrg     {
   1143  1.1  mrg       unsigned op1 = SSA_NAME_VERSION (ptr->op1 ());
   1144  1.1  mrg       unsigned op2 = SSA_NAME_VERSION (ptr->op2 ());
   1145  1.1  mrg       if (v1 == op1 && v2 == op2)
   1146  1.1  mrg 	{
   1147  1.1  mrg 	  if (obj)
   1148  1.1  mrg 	    *obj = ptr;
   1149  1.1  mrg 	  return ptr->kind ();
   1150  1.1  mrg 	}
   1151  1.1  mrg       if (v1 == op2 && v2 == op1)
   1152  1.1  mrg 	{
   1153  1.1  mrg 	  if (obj)
   1154  1.1  mrg 	    *obj = ptr;
   1155  1.1  mrg 	  return relation_swap (ptr->kind ());
   1156  1.1  mrg 	}
   1157  1.1  mrg     }
   1158  1.1  mrg 
   1159  1.1  mrg   return VREL_NONE;
   1160  1.1  mrg }
   1161  1.1  mrg 
   1162  1.1  mrg // Find a relation between SSA version V1 and V2 in the dominator tree
   1163  1.1  mrg // starting with block BB
   1164  1.1  mrg 
   1165  1.1  mrg relation_kind
   1166  1.1  mrg dom_oracle::find_relation_dom (basic_block bb, unsigned v1, unsigned v2) const
   1167  1.1  mrg {
   1168  1.1  mrg   relation_kind r;
   1169  1.1  mrg   // IF either name does not occur in a relation anywhere, there isnt one.
   1170  1.1  mrg   if (!bitmap_bit_p (m_relation_set, v1) || !bitmap_bit_p (m_relation_set, v2))
   1171  1.1  mrg     return VREL_NONE;
   1172  1.1  mrg 
   1173  1.1  mrg   for ( ; bb; bb = get_immediate_dominator (CDI_DOMINATORS, bb))
   1174  1.1  mrg     {
   1175  1.1  mrg       r = find_relation_block (bb->index, v1, v2);
   1176  1.1  mrg       if (r != VREL_NONE)
   1177  1.1  mrg 	return r;
   1178  1.1  mrg     }
   1179  1.1  mrg   return VREL_NONE;
   1180  1.1  mrg 
   1181  1.1  mrg }
   1182  1.1  mrg 
   1183  1.1  mrg // Query if there is a relation between SSA1 and SS2 in block BB or a
   1184  1.1  mrg // dominator of BB
   1185  1.1  mrg 
   1186  1.1  mrg relation_kind
   1187  1.1  mrg dom_oracle::query_relation (basic_block bb, tree ssa1, tree ssa2)
   1188  1.1  mrg {
   1189  1.1  mrg   relation_kind kind;
   1190  1.1  mrg   unsigned v1 = SSA_NAME_VERSION (ssa1);
   1191  1.1  mrg   unsigned v2 = SSA_NAME_VERSION (ssa2);
   1192  1.1  mrg   if (v1 == v2)
   1193  1.1  mrg     return EQ_EXPR;
   1194  1.1  mrg 
   1195  1.1  mrg   // Check for equivalence first.  They must be in each equivalency set.
   1196  1.1  mrg   const_bitmap equiv1 = equiv_set (ssa1, bb);
   1197  1.1  mrg   const_bitmap equiv2 = equiv_set (ssa2, bb);
   1198  1.1  mrg   if (bitmap_bit_p (equiv1, v2) && bitmap_bit_p (equiv2, v1))
   1199  1.1  mrg     return EQ_EXPR;
   1200  1.1  mrg 
   1201  1.1  mrg   // Initially look for a direct relationship and just return that.
   1202  1.1  mrg   kind = find_relation_dom (bb, v1, v2);
   1203  1.1  mrg   if (kind != VREL_NONE)
   1204  1.1  mrg     return kind;
   1205  1.1  mrg 
   1206  1.1  mrg   // Query using the equiovalence sets.
   1207  1.1  mrg   kind = query_relation (bb, equiv1, equiv2);
   1208  1.1  mrg   return kind;
   1209  1.1  mrg }
   1210  1.1  mrg 
   1211  1.1  mrg // Dump all the relations in block BB to file F.
   1212  1.1  mrg 
   1213  1.1  mrg void
   1214  1.1  mrg dom_oracle::dump (FILE *f, basic_block bb) const
   1215  1.1  mrg {
   1216  1.1  mrg   equiv_oracle::dump (f,bb);
   1217  1.1  mrg 
   1218  1.1  mrg   if (bb->index >= (int)m_relations.length ())
   1219  1.1  mrg     return;
   1220  1.1  mrg   if (!m_relations[bb->index].m_names)
   1221  1.1  mrg     return;
   1222  1.1  mrg 
   1223  1.1  mrg   relation_chain *ptr = m_relations[bb->index].m_head;
   1224  1.1  mrg   for (; ptr; ptr = ptr->m_next)
   1225  1.1  mrg     {
   1226  1.1  mrg       fprintf (f, "Relational : ");
   1227  1.1  mrg       ptr->dump (f);
   1228  1.1  mrg       fprintf (f, "\n");
   1229  1.1  mrg     }
   1230  1.1  mrg }
   1231  1.1  mrg 
   1232  1.1  mrg // Dump all the relations known to file F.
   1233  1.1  mrg 
   1234  1.1  mrg void
   1235  1.1  mrg dom_oracle::dump (FILE *f) const
   1236  1.1  mrg {
   1237  1.1  mrg   fprintf (f, "Relation dump\n");
   1238  1.1  mrg   for (unsigned i = 0; i < m_relations.length (); i++)
   1239  1.1  mrg     if (BASIC_BLOCK_FOR_FN (cfun, i))
   1240  1.1  mrg       {
   1241  1.1  mrg 	fprintf (f, "BB%d\n", i);
   1242  1.1  mrg 	dump (f, BASIC_BLOCK_FOR_FN (cfun, i));
   1243  1.1  mrg       }
   1244  1.1  mrg }
   1245  1.1  mrg 
   1246  1.1  mrg void
   1247  1.1  mrg relation_oracle::debug () const
   1248  1.1  mrg {
   1249  1.1  mrg   dump (stderr);
   1250  1.1  mrg }
   1251  1.1  mrg 
   1252  1.1  mrg path_oracle::path_oracle (relation_oracle *oracle)
   1253  1.1  mrg {
   1254  1.1  mrg   set_root_oracle (oracle);
   1255  1.1  mrg   bitmap_obstack_initialize (&m_bitmaps);
   1256  1.1  mrg   obstack_init (&m_chain_obstack);
   1257  1.1  mrg 
   1258  1.1  mrg   // Initialize header records.
   1259  1.1  mrg   m_equiv.m_names = BITMAP_ALLOC (&m_bitmaps);
   1260  1.1  mrg   m_equiv.m_bb = NULL;
   1261  1.1  mrg   m_equiv.m_next = NULL;
   1262  1.1  mrg   m_relations.m_names = BITMAP_ALLOC (&m_bitmaps);
   1263  1.1  mrg   m_relations.m_head = NULL;
   1264  1.1  mrg   m_killed_defs = BITMAP_ALLOC (&m_bitmaps);
   1265  1.1  mrg }
   1266  1.1  mrg 
   1267  1.1  mrg path_oracle::~path_oracle ()
   1268  1.1  mrg {
   1269  1.1  mrg   obstack_free (&m_chain_obstack, NULL);
   1270  1.1  mrg   bitmap_obstack_release (&m_bitmaps);
   1271  1.1  mrg }
   1272  1.1  mrg 
   1273  1.1  mrg // Return the equiv set for SSA, and if there isn't one, check for equivs
   1274  1.1  mrg // starting in block BB.
   1275  1.1  mrg 
   1276  1.1  mrg const_bitmap
   1277  1.1  mrg path_oracle::equiv_set (tree ssa, basic_block bb)
   1278  1.1  mrg {
   1279  1.1  mrg   // Check the list first.
   1280  1.1  mrg   equiv_chain *ptr = m_equiv.find (SSA_NAME_VERSION (ssa));
   1281  1.1  mrg   if (ptr)
   1282  1.1  mrg     return ptr->m_names;
   1283  1.1  mrg 
   1284  1.1  mrg   // Otherwise defer to the root oracle.
   1285  1.1  mrg   if (m_root)
   1286  1.1  mrg     return m_root->equiv_set (ssa, bb);
   1287  1.1  mrg 
   1288  1.1  mrg   // Allocate a throw away bitmap if there isn't a root oracle.
   1289  1.1  mrg   bitmap tmp = BITMAP_ALLOC (&m_bitmaps);
   1290  1.1  mrg   bitmap_set_bit (tmp, SSA_NAME_VERSION (ssa));
   1291  1.1  mrg   return tmp;
   1292  1.1  mrg }
   1293  1.1  mrg 
   1294  1.1  mrg // Register an equivalence between SSA1 and SSA2 resolving unkowns from
   1295  1.1  mrg // block BB.
   1296  1.1  mrg 
   1297  1.1  mrg void
   1298  1.1  mrg path_oracle::register_equiv (basic_block bb, tree ssa1, tree ssa2)
   1299  1.1  mrg {
   1300  1.1  mrg   const_bitmap equiv_1 = equiv_set (ssa1, bb);
   1301  1.1  mrg   const_bitmap equiv_2 = equiv_set (ssa2, bb);
   1302  1.1  mrg 
   1303  1.1  mrg   // Check if they are the same set, if so, we're done.
   1304  1.1  mrg   if (bitmap_equal_p (equiv_1, equiv_2))
   1305  1.1  mrg     return;
   1306  1.1  mrg 
   1307  1.1  mrg   // Don't mess around, simply create a new record and insert it first.
   1308  1.1  mrg   bitmap b = BITMAP_ALLOC (&m_bitmaps);
   1309  1.1  mrg   valid_equivs (b, equiv_1, bb);
   1310  1.1  mrg   valid_equivs (b, equiv_2, bb);
   1311  1.1  mrg 
   1312  1.1  mrg   equiv_chain *ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack,
   1313  1.1  mrg 						    sizeof (equiv_chain));
   1314  1.1  mrg   ptr->m_names = b;
   1315  1.1  mrg   ptr->m_bb = NULL;
   1316  1.1  mrg   ptr->m_next = m_equiv.m_next;
   1317  1.1  mrg   m_equiv.m_next = ptr;
   1318  1.1  mrg   bitmap_ior_into (m_equiv.m_names, b);
   1319  1.1  mrg }
   1320  1.1  mrg 
   1321  1.1  mrg // Register killing definition of an SSA_NAME.
   1322  1.1  mrg 
   1323  1.1  mrg void
   1324  1.1  mrg path_oracle::killing_def (tree ssa)
   1325  1.1  mrg {
   1326  1.1  mrg   if (dump_file && (dump_flags & TDF_DETAILS))
   1327  1.1  mrg     {
   1328  1.1  mrg       fprintf (dump_file, " Registering killing_def (path_oracle) ");
   1329  1.1  mrg       print_generic_expr (dump_file, ssa, TDF_SLIM);
   1330  1.1  mrg       fprintf (dump_file, "\n");
   1331  1.1  mrg     }
   1332  1.1  mrg 
   1333  1.1  mrg   unsigned v = SSA_NAME_VERSION (ssa);
   1334  1.1  mrg 
   1335  1.1  mrg   bitmap_set_bit (m_killed_defs, v);
   1336  1.1  mrg 
   1337  1.1  mrg   // Walk the equivalency list and remove SSA from any equivalencies.
   1338  1.1  mrg   if (bitmap_bit_p (m_equiv.m_names, v))
   1339  1.1  mrg     {
   1340  1.1  mrg       for (equiv_chain *ptr = m_equiv.m_next; ptr; ptr = ptr->m_next)
   1341  1.1  mrg 	if (bitmap_bit_p (ptr->m_names, v))
   1342  1.1  mrg 	  bitmap_clear_bit (ptr->m_names, v);
   1343  1.1  mrg     }
   1344  1.1  mrg   else
   1345  1.1  mrg     bitmap_set_bit (m_equiv.m_names, v);
   1346  1.1  mrg 
   1347  1.1  mrg   // Now add an equivalency with itself so we don't look to the root oracle.
   1348  1.1  mrg   bitmap b = BITMAP_ALLOC (&m_bitmaps);
   1349  1.1  mrg   bitmap_set_bit (b, v);
   1350  1.1  mrg   equiv_chain *ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack,
   1351  1.1  mrg 						    sizeof (equiv_chain));
   1352  1.1  mrg   ptr->m_names = b;
   1353  1.1  mrg   ptr->m_bb = NULL;
   1354  1.1  mrg   ptr->m_next = m_equiv.m_next;
   1355  1.1  mrg   m_equiv.m_next = ptr;
   1356  1.1  mrg 
   1357  1.1  mrg   // Walk the relation list and remove SSA from any relations.
   1358  1.1  mrg   if (!bitmap_bit_p (m_relations.m_names, v))
   1359  1.1  mrg     return;
   1360  1.1  mrg 
   1361  1.1  mrg   bitmap_clear_bit (m_relations.m_names, v);
   1362  1.1  mrg   relation_chain **prev = &(m_relations.m_head);
   1363  1.1  mrg   relation_chain *next = NULL;
   1364  1.1  mrg   for (relation_chain *ptr = m_relations.m_head; ptr; ptr = next)
   1365  1.1  mrg     {
   1366  1.1  mrg       gcc_checking_assert (*prev == ptr);
   1367  1.1  mrg       next = ptr->m_next;
   1368  1.1  mrg       if (SSA_NAME_VERSION (ptr->op1 ()) == v
   1369  1.1  mrg 	  || SSA_NAME_VERSION (ptr->op2 ()) == v)
   1370  1.1  mrg 	*prev = ptr->m_next;
   1371  1.1  mrg       else
   1372  1.1  mrg 	prev = &(ptr->m_next);
   1373  1.1  mrg     }
   1374  1.1  mrg }
   1375  1.1  mrg 
   1376  1.1  mrg // Register relation K between SSA1 and SSA2, resolving unknowns by
   1377  1.1  mrg // querying from BB.
   1378  1.1  mrg 
   1379  1.1  mrg void
   1380  1.1  mrg path_oracle::register_relation (basic_block bb, relation_kind k, tree ssa1,
   1381  1.1  mrg 				tree ssa2)
   1382  1.1  mrg {
   1383  1.1  mrg   if (dump_file && (dump_flags & TDF_DETAILS))
   1384  1.1  mrg     {
   1385  1.1  mrg       value_relation vr (k, ssa1, ssa2);
   1386  1.1  mrg       fprintf (dump_file, " Registering value_relation (path_oracle) ");
   1387  1.1  mrg       vr.dump (dump_file);
   1388  1.1  mrg       fprintf (dump_file, " (root: bb%d)\n", bb->index);
   1389  1.1  mrg     }
   1390  1.1  mrg 
   1391  1.1  mrg   relation_kind curr = query_relation (bb, ssa1, ssa2);
   1392  1.1  mrg   if (curr != VREL_NONE)
   1393  1.1  mrg     k = relation_intersect (curr, k);
   1394  1.1  mrg 
   1395  1.1  mrg   if (k == EQ_EXPR)
   1396  1.1  mrg     {
   1397  1.1  mrg       register_equiv (bb, ssa1, ssa2);
   1398  1.1  mrg       return;
   1399  1.1  mrg     }
   1400  1.1  mrg 
   1401  1.1  mrg   bitmap_set_bit (m_relations.m_names, SSA_NAME_VERSION (ssa1));
   1402  1.1  mrg   bitmap_set_bit (m_relations.m_names, SSA_NAME_VERSION (ssa2));
   1403  1.1  mrg   relation_chain *ptr = (relation_chain *) obstack_alloc (&m_chain_obstack,
   1404  1.1  mrg 						      sizeof (relation_chain));
   1405  1.1  mrg   ptr->set_relation (k, ssa1, ssa2);
   1406  1.1  mrg   ptr->m_next = m_relations.m_head;
   1407  1.1  mrg   m_relations.m_head = ptr;
   1408  1.1  mrg }
   1409  1.1  mrg 
   1410  1.1  mrg // Query for a relationship between equiv set B1 and B2, resolving unknowns
   1411  1.1  mrg // starting at block BB.
   1412  1.1  mrg 
   1413  1.1  mrg relation_kind
   1414  1.1  mrg path_oracle::query_relation (basic_block bb, const_bitmap b1, const_bitmap b2)
   1415  1.1  mrg {
   1416  1.1  mrg   if (bitmap_equal_p (b1, b2))
   1417  1.1  mrg     return EQ_EXPR;
   1418  1.1  mrg 
   1419  1.1  mrg   relation_kind k = m_relations.find_relation (b1, b2);
   1420  1.1  mrg 
   1421  1.1  mrg   // Do not look at the root oracle for names that have been killed
   1422  1.1  mrg   // along the path.
   1423  1.1  mrg   if (bitmap_intersect_p (m_killed_defs, b1)
   1424  1.1  mrg       || bitmap_intersect_p (m_killed_defs, b2))
   1425  1.1  mrg     return k;
   1426  1.1  mrg 
   1427  1.1  mrg   if (k == VREL_NONE && m_root)
   1428  1.1  mrg     k = m_root->query_relation (bb, b1, b2);
   1429  1.1  mrg 
   1430  1.1  mrg   return k;
   1431  1.1  mrg }
   1432  1.1  mrg 
   1433  1.1  mrg // Query for a relationship between SSA1 and SSA2, resolving unknowns
   1434  1.1  mrg // starting at block BB.
   1435  1.1  mrg 
   1436  1.1  mrg relation_kind
   1437  1.1  mrg path_oracle::query_relation (basic_block bb, tree ssa1, tree ssa2)
   1438  1.1  mrg {
   1439  1.1  mrg   unsigned v1 = SSA_NAME_VERSION (ssa1);
   1440  1.1  mrg   unsigned v2 = SSA_NAME_VERSION (ssa2);
   1441  1.1  mrg 
   1442  1.1  mrg   if (v1 == v2)
   1443  1.1  mrg     return EQ_EXPR;
   1444  1.1  mrg 
   1445  1.1  mrg   const_bitmap equiv_1 = equiv_set (ssa1, bb);
   1446  1.1  mrg   const_bitmap equiv_2 = equiv_set (ssa2, bb);
   1447  1.1  mrg   if (bitmap_bit_p (equiv_1, v2) && bitmap_bit_p (equiv_2, v1))
   1448  1.1  mrg     return EQ_EXPR;
   1449  1.1  mrg 
   1450  1.1  mrg   return query_relation (bb, equiv_1, equiv_2);
   1451  1.1  mrg }
   1452  1.1  mrg 
   1453  1.1  mrg // Reset any relations registered on this path.
   1454  1.1  mrg 
   1455  1.1  mrg void
   1456  1.1  mrg path_oracle::reset_path ()
   1457  1.1  mrg {
   1458  1.1  mrg   m_equiv.m_next = NULL;
   1459  1.1  mrg   bitmap_clear (m_equiv.m_names);
   1460  1.1  mrg   m_relations.m_head = NULL;
   1461  1.1  mrg   bitmap_clear (m_relations.m_names);
   1462  1.1  mrg }
   1463  1.1  mrg 
   1464  1.1  mrg // Dump relation in basic block... Do nothing here.
   1465  1.1  mrg 
   1466  1.1  mrg void
   1467  1.1  mrg path_oracle::dump (FILE *, basic_block) const
   1468  1.1  mrg {
   1469  1.1  mrg }
   1470  1.1  mrg 
   1471  1.1  mrg // Dump the relations and equivalencies found in the path.
   1472  1.1  mrg 
   1473  1.1  mrg void
   1474  1.1  mrg path_oracle::dump (FILE *f) const
   1475  1.1  mrg {
   1476  1.1  mrg   equiv_chain *ptr = m_equiv.m_next;
   1477  1.1  mrg   relation_chain *ptr2 = m_relations.m_head;
   1478  1.1  mrg 
   1479  1.1  mrg   if (ptr || ptr2)
   1480  1.1  mrg     fprintf (f, "\npath_oracle:\n");
   1481  1.1  mrg 
   1482  1.1  mrg   for (; ptr; ptr = ptr->m_next)
   1483  1.1  mrg     ptr->dump (f);
   1484  1.1  mrg 
   1485  1.1  mrg   for (; ptr2; ptr2 = ptr2->m_next)
   1486  1.1  mrg     {
   1487  1.1  mrg       fprintf (f, "Relational : ");
   1488  1.1  mrg       ptr2->dump (f);
   1489  1.1  mrg       fprintf (f, "\n");
   1490  1.1  mrg     }
   1491  1.1  mrg }
   1492