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