1 1.1 mrg /* Tail merging for gimple. 2 1.1 mrg Copyright (C) 2011-2022 Free Software Foundation, Inc. 3 1.1 mrg Contributed by Tom de Vries (tom (at) codesourcery.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 8 1.1 mrg it under the terms of the GNU General Public License as published by 9 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 10 1.1 mrg any later version. 11 1.1 mrg 12 1.1 mrg GCC is distributed in the hope that it will be useful, 13 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 mrg GNU General Public License 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 /* Pass overview. 22 1.1 mrg 23 1.1 mrg 24 1.1 mrg MOTIVATIONAL EXAMPLE 25 1.1 mrg 26 1.1 mrg gimple representation of gcc/testsuite/gcc.dg/pr43864.c at 27 1.1 mrg 28 1.1 mrg hprofStartupp (charD.1 * outputFileNameD.2600, charD.1 * ctxD.2601) 29 1.1 mrg { 30 1.1 mrg struct FILED.1638 * fpD.2605; 31 1.1 mrg charD.1 fileNameD.2604[1000]; 32 1.1 mrg intD.0 D.3915; 33 1.1 mrg const charD.1 * restrict outputFileName.0D.3914; 34 1.1 mrg 35 1.1 mrg # BLOCK 2 freq:10000 36 1.1 mrg # PRED: ENTRY [100.0%] (fallthru,exec) 37 1.1 mrg # PT = nonlocal { D.3926 } (restr) 38 1.1 mrg outputFileName.0D.3914_3 39 1.1 mrg = (const charD.1 * restrict) outputFileNameD.2600_2(D); 40 1.1 mrg # .MEMD.3923_13 = VDEF <.MEMD.3923_12(D)> 41 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr) 42 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr) 43 1.1 mrg sprintfD.759 (&fileNameD.2604, outputFileName.0D.3914_3); 44 1.1 mrg # .MEMD.3923_14 = VDEF <.MEMD.3923_13> 45 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr) 46 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr) 47 1.1 mrg D.3915_4 = accessD.2606 (&fileNameD.2604, 1); 48 1.1 mrg if (D.3915_4 == 0) 49 1.1 mrg goto <bb 3>; 50 1.1 mrg else 51 1.1 mrg goto <bb 4>; 52 1.1 mrg # SUCC: 3 [10.0%] (true,exec) 4 [90.0%] (false,exec) 53 1.1 mrg 54 1.1 mrg # BLOCK 3 freq:1000 55 1.1 mrg # PRED: 2 [10.0%] (true,exec) 56 1.1 mrg # .MEMD.3923_15 = VDEF <.MEMD.3923_14> 57 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr) 58 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr) 59 1.1 mrg freeD.898 (ctxD.2601_5(D)); 60 1.1 mrg goto <bb 7>; 61 1.1 mrg # SUCC: 7 [100.0%] (fallthru,exec) 62 1.1 mrg 63 1.1 mrg # BLOCK 4 freq:9000 64 1.1 mrg # PRED: 2 [90.0%] (false,exec) 65 1.1 mrg # .MEMD.3923_16 = VDEF <.MEMD.3923_14> 66 1.1 mrg # PT = nonlocal escaped 67 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr) 68 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr) 69 1.1 mrg fpD.2605_8 = fopenD.1805 (&fileNameD.2604[0], 0B); 70 1.1 mrg if (fpD.2605_8 == 0B) 71 1.1 mrg goto <bb 5>; 72 1.1 mrg else 73 1.1 mrg goto <bb 6>; 74 1.1 mrg # SUCC: 5 [1.9%] (true,exec) 6 [98.1%] (false,exec) 75 1.1 mrg 76 1.1 mrg # BLOCK 5 freq:173 77 1.1 mrg # PRED: 4 [1.9%] (true,exec) 78 1.1 mrg # .MEMD.3923_17 = VDEF <.MEMD.3923_16> 79 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr) 80 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr) 81 1.1 mrg freeD.898 (ctxD.2601_5(D)); 82 1.1 mrg goto <bb 7>; 83 1.1 mrg # SUCC: 7 [100.0%] (fallthru,exec) 84 1.1 mrg 85 1.1 mrg # BLOCK 6 freq:8827 86 1.1 mrg # PRED: 4 [98.1%] (false,exec) 87 1.1 mrg # .MEMD.3923_18 = VDEF <.MEMD.3923_16> 88 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr) 89 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr) 90 1.1 mrg fooD.2599 (outputFileNameD.2600_2(D), fpD.2605_8); 91 1.1 mrg # SUCC: 7 [100.0%] (fallthru,exec) 92 1.1 mrg 93 1.1 mrg # BLOCK 7 freq:10000 94 1.1 mrg # PRED: 3 [100.0%] (fallthru,exec) 5 [100.0%] (fallthru,exec) 95 1.1 mrg 6 [100.0%] (fallthru,exec) 96 1.1 mrg # PT = nonlocal null 97 1.1 mrg 98 1.1 mrg # ctxD.2601_1 = PHI <0B(3), 0B(5), ctxD.2601_5(D)(6)> 99 1.1 mrg # .MEMD.3923_11 = PHI <.MEMD.3923_15(3), .MEMD.3923_17(5), 100 1.1 mrg .MEMD.3923_18(6)> 101 1.1 mrg # VUSE <.MEMD.3923_11> 102 1.1 mrg return ctxD.2601_1; 103 1.1 mrg # SUCC: EXIT [100.0%] 104 1.1 mrg } 105 1.1 mrg 106 1.1 mrg bb 3 and bb 5 can be merged. The blocks have different predecessors, but the 107 1.1 mrg same successors, and the same operations. 108 1.1 mrg 109 1.1 mrg 110 1.1 mrg CONTEXT 111 1.1 mrg 112 1.1 mrg A technique called tail merging (or cross jumping) can fix the example 113 1.1 mrg above. For a block, we look for common code at the end (the tail) of the 114 1.1 mrg predecessor blocks, and insert jumps from one block to the other. 115 1.1 mrg The example is a special case for tail merging, in that 2 whole blocks 116 1.1 mrg can be merged, rather than just the end parts of it. 117 1.1 mrg We currently only focus on whole block merging, so in that sense 118 1.1 mrg calling this pass tail merge is a bit of a misnomer. 119 1.1 mrg 120 1.1 mrg We distinguish 2 kinds of situations in which blocks can be merged: 121 1.1 mrg - same operations, same predecessors. The successor edges coming from one 122 1.1 mrg block are redirected to come from the other block. 123 1.1 mrg - same operations, same successors. The predecessor edges entering one block 124 1.1 mrg are redirected to enter the other block. Note that this operation might 125 1.1 mrg involve introducing phi operations. 126 1.1 mrg 127 1.1 mrg For efficient implementation, we would like to value numbers the blocks, and 128 1.1 mrg have a comparison operator that tells us whether the blocks are equal. 129 1.1 mrg Besides being runtime efficient, block value numbering should also abstract 130 1.1 mrg from irrelevant differences in order of operations, much like normal value 131 1.1 mrg numbering abstracts from irrelevant order of operations. 132 1.1 mrg 133 1.1 mrg For the first situation (same_operations, same predecessors), normal value 134 1.1 mrg numbering fits well. We can calculate a block value number based on the 135 1.1 mrg value numbers of the defs and vdefs. 136 1.1 mrg 137 1.1 mrg For the second situation (same operations, same successors), this approach 138 1.1 mrg doesn't work so well. We can illustrate this using the example. The calls 139 1.1 mrg to free use different vdefs: MEMD.3923_16 and MEMD.3923_14, and these will 140 1.1 mrg remain different in value numbering, since they represent different memory 141 1.1 mrg states. So the resulting vdefs of the frees will be different in value 142 1.1 mrg numbering, so the block value numbers will be different. 143 1.1 mrg 144 1.1 mrg The reason why we call the blocks equal is not because they define the same 145 1.1 mrg values, but because uses in the blocks use (possibly different) defs in the 146 1.1 mrg same way. To be able to detect this efficiently, we need to do some kind of 147 1.1 mrg reverse value numbering, meaning number the uses rather than the defs, and 148 1.1 mrg calculate a block value number based on the value number of the uses. 149 1.1 mrg Ideally, a block comparison operator will also indicate which phis are needed 150 1.1 mrg to merge the blocks. 151 1.1 mrg 152 1.1 mrg For the moment, we don't do block value numbering, but we do insn-by-insn 153 1.1 mrg matching, using scc value numbers to match operations with results, and 154 1.1 mrg structural comparison otherwise, while ignoring vop mismatches. 155 1.1 mrg 156 1.1 mrg 157 1.1 mrg IMPLEMENTATION 158 1.1 mrg 159 1.1 mrg 1. The pass first determines all groups of blocks with the same successor 160 1.1 mrg blocks. 161 1.1 mrg 2. Within each group, it tries to determine clusters of equal basic blocks. 162 1.1 mrg 3. The clusters are applied. 163 1.1 mrg 4. The same successor groups are updated. 164 1.1 mrg 5. This process is repeated from 2 onwards, until no more changes. 165 1.1 mrg 166 1.1 mrg 167 1.1 mrg LIMITATIONS/TODO 168 1.1 mrg 169 1.1 mrg - block only 170 1.1 mrg - handles only 'same operations, same successors'. 171 1.1 mrg It handles same predecessors as a special subcase though. 172 1.1 mrg - does not implement the reverse value numbering and block value numbering. 173 1.1 mrg - improve memory allocation: use garbage collected memory, obstacks, 174 1.1 mrg allocpools where appropriate. 175 1.1 mrg - no insertion of gimple_reg phis, We only introduce vop-phis. 176 1.1 mrg - handle blocks with gimple_reg phi_nodes. 177 1.1 mrg 178 1.1 mrg 179 1.1 mrg PASS PLACEMENT 180 1.1 mrg This 'pass' is not a stand-alone gimple pass, but runs as part of 181 1.1 mrg pass_pre, in order to share the value numbering. 182 1.1 mrg 183 1.1 mrg 184 1.1 mrg SWITCHES 185 1.1 mrg 186 1.1 mrg - ftree-tail-merge. On at -O2. We may have to enable it only at -Os. */ 187 1.1 mrg 188 1.1 mrg #include "config.h" 189 1.1 mrg #include "system.h" 190 1.1 mrg #include "coretypes.h" 191 1.1 mrg #include "backend.h" 192 1.1 mrg #include "tree.h" 193 1.1 mrg #include "gimple.h" 194 1.1 mrg #include "cfghooks.h" 195 1.1 mrg #include "tree-pass.h" 196 1.1 mrg #include "ssa.h" 197 1.1 mrg #include "fold-const.h" 198 1.1 mrg #include "trans-mem.h" 199 1.1 mrg #include "cfganal.h" 200 1.1 mrg #include "cfgcleanup.h" 201 1.1 mrg #include "gimple-iterator.h" 202 1.1 mrg #include "tree-cfg.h" 203 1.1 mrg #include "tree-into-ssa.h" 204 1.1 mrg #include "tree-ssa-sccvn.h" 205 1.1 mrg #include "cfgloop.h" 206 1.1 mrg #include "tree-eh.h" 207 1.1 mrg #include "tree-cfgcleanup.h" 208 1.1 mrg 209 1.1 mrg const int ignore_edge_flags = EDGE_DFS_BACK | EDGE_EXECUTABLE; 210 1.1 mrg 211 1.1 mrg /* Describes a group of bbs with the same successors. The successor bbs are 212 1.1 mrg cached in succs, and the successor edge flags are cached in succ_flags. 213 1.1 mrg If a bb has the EDGE_TRUE/FALSE_VALUE flags swapped compared to succ_flags, 214 1.1 mrg it's marked in inverse. 215 1.1 mrg Additionally, the hash value for the struct is cached in hashval, and 216 1.1 mrg in_worklist indicates whether it's currently part of worklist. */ 217 1.1 mrg 218 1.1 mrg struct same_succ : pointer_hash <same_succ> 219 1.1 mrg { 220 1.1 mrg /* The bbs that have the same successor bbs. */ 221 1.1 mrg bitmap bbs; 222 1.1 mrg /* The successor bbs. */ 223 1.1 mrg bitmap succs; 224 1.1 mrg /* Indicates whether the EDGE_TRUE/FALSE_VALUEs of succ_flags are swapped for 225 1.1 mrg bb. */ 226 1.1 mrg bitmap inverse; 227 1.1 mrg /* The edge flags for each of the successor bbs. */ 228 1.1 mrg vec<int> succ_flags; 229 1.1 mrg /* Indicates whether the struct is currently in the worklist. */ 230 1.1 mrg bool in_worklist; 231 1.1 mrg /* The hash value of the struct. */ 232 1.1 mrg hashval_t hashval; 233 1.1 mrg 234 1.1 mrg /* hash_table support. */ 235 1.1 mrg static inline hashval_t hash (const same_succ *); 236 1.1 mrg static int equal (const same_succ *, const same_succ *); 237 1.1 mrg static void remove (same_succ *); 238 1.1 mrg }; 239 1.1 mrg 240 1.1 mrg /* hash routine for hash_table support, returns hashval of E. */ 241 1.1 mrg 242 1.1 mrg inline hashval_t 243 1.1 mrg same_succ::hash (const same_succ *e) 244 1.1 mrg { 245 1.1 mrg return e->hashval; 246 1.1 mrg } 247 1.1 mrg 248 1.1 mrg /* A group of bbs where 1 bb from bbs can replace the other bbs. */ 249 1.1 mrg 250 1.1 mrg struct bb_cluster 251 1.1 mrg { 252 1.1 mrg /* The bbs in the cluster. */ 253 1.1 mrg bitmap bbs; 254 1.1 mrg /* The preds of the bbs in the cluster. */ 255 1.1 mrg bitmap preds; 256 1.1 mrg /* Index in all_clusters vector. */ 257 1.1 mrg int index; 258 1.1 mrg /* The bb to replace the cluster with. */ 259 1.1 mrg basic_block rep_bb; 260 1.1 mrg }; 261 1.1 mrg 262 1.1 mrg /* Per bb-info. */ 263 1.1 mrg 264 1.1 mrg struct aux_bb_info 265 1.1 mrg { 266 1.1 mrg /* The number of non-debug statements in the bb. */ 267 1.1 mrg int size; 268 1.1 mrg /* The same_succ that this bb is a member of. */ 269 1.1 mrg same_succ *bb_same_succ; 270 1.1 mrg /* The cluster that this bb is a member of. */ 271 1.1 mrg bb_cluster *cluster; 272 1.1 mrg /* The vop state at the exit of a bb. This is shortlived data, used to 273 1.1 mrg communicate data between update_block_by and update_vuses. */ 274 1.1 mrg tree vop_at_exit; 275 1.1 mrg /* The bb that either contains or is dominated by the dependencies of the 276 1.1 mrg bb. */ 277 1.1 mrg basic_block dep_bb; 278 1.1 mrg }; 279 1.1 mrg 280 1.1 mrg /* Macros to access the fields of struct aux_bb_info. */ 281 1.1 mrg 282 1.1 mrg #define BB_SIZE(bb) (((struct aux_bb_info *)bb->aux)->size) 283 1.1 mrg #define BB_SAME_SUCC(bb) (((struct aux_bb_info *)bb->aux)->bb_same_succ) 284 1.1 mrg #define BB_CLUSTER(bb) (((struct aux_bb_info *)bb->aux)->cluster) 285 1.1 mrg #define BB_VOP_AT_EXIT(bb) (((struct aux_bb_info *)bb->aux)->vop_at_exit) 286 1.1 mrg #define BB_DEP_BB(bb) (((struct aux_bb_info *)bb->aux)->dep_bb) 287 1.1 mrg 288 1.1 mrg /* Valueization helper querying the VN lattice. */ 289 1.1 mrg 290 1.1 mrg static tree 291 1.1 mrg tail_merge_valueize (tree name) 292 1.1 mrg { 293 1.1 mrg if (TREE_CODE (name) == SSA_NAME 294 1.1 mrg && has_VN_INFO (name)) 295 1.1 mrg { 296 1.1 mrg tree tem = VN_INFO (name)->valnum; 297 1.1 mrg if (tem != VN_TOP) 298 1.1 mrg return tem; 299 1.1 mrg } 300 1.1 mrg return name; 301 1.1 mrg } 302 1.1 mrg 303 1.1 mrg /* Returns true if the only effect a statement STMT has, is to define locally 304 1.1 mrg used SSA_NAMEs. */ 305 1.1 mrg 306 1.1 mrg static bool 307 1.1 mrg stmt_local_def (gimple *stmt) 308 1.1 mrg { 309 1.1 mrg basic_block bb, def_bb; 310 1.1 mrg imm_use_iterator iter; 311 1.1 mrg use_operand_p use_p; 312 1.1 mrg tree val; 313 1.1 mrg def_operand_p def_p; 314 1.1 mrg 315 1.1 mrg if (gimple_vdef (stmt) != NULL_TREE 316 1.1 mrg || gimple_has_side_effects (stmt) 317 1.1 mrg || gimple_could_trap_p_1 (stmt, false, false) 318 1.1 mrg || gimple_vuse (stmt) != NULL_TREE 319 1.1 mrg /* Copied from tree-ssa-ifcombine.cc:bb_no_side_effects_p(): 320 1.1 mrg const calls don't match any of the above, yet they could 321 1.1 mrg still have some side-effects - they could contain 322 1.1 mrg gimple_could_trap_p statements, like floating point 323 1.1 mrg exceptions or integer division by zero. See PR70586. 324 1.1 mrg FIXME: perhaps gimple_has_side_effects or gimple_could_trap_p 325 1.1 mrg should handle this. */ 326 1.1 mrg || is_gimple_call (stmt)) 327 1.1 mrg return false; 328 1.1 mrg 329 1.1 mrg def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF); 330 1.1 mrg if (def_p == NULL) 331 1.1 mrg return false; 332 1.1 mrg 333 1.1 mrg val = DEF_FROM_PTR (def_p); 334 1.1 mrg if (val == NULL_TREE || TREE_CODE (val) != SSA_NAME) 335 1.1 mrg return false; 336 1.1 mrg 337 1.1 mrg def_bb = gimple_bb (stmt); 338 1.1 mrg 339 1.1 mrg FOR_EACH_IMM_USE_FAST (use_p, iter, val) 340 1.1 mrg { 341 1.1 mrg if (is_gimple_debug (USE_STMT (use_p))) 342 1.1 mrg continue; 343 1.1 mrg bb = gimple_bb (USE_STMT (use_p)); 344 1.1 mrg if (bb == def_bb) 345 1.1 mrg continue; 346 1.1 mrg 347 1.1 mrg if (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI 348 1.1 mrg && EDGE_PRED (bb, PHI_ARG_INDEX_FROM_USE (use_p))->src == def_bb) 349 1.1 mrg continue; 350 1.1 mrg 351 1.1 mrg return false; 352 1.1 mrg } 353 1.1 mrg 354 1.1 mrg return true; 355 1.1 mrg } 356 1.1 mrg 357 1.1 mrg /* Let GSI skip forwards over local defs. */ 358 1.1 mrg 359 1.1 mrg static void 360 1.1 mrg gsi_advance_fw_nondebug_nonlocal (gimple_stmt_iterator *gsi) 361 1.1 mrg { 362 1.1 mrg gimple *stmt; 363 1.1 mrg 364 1.1 mrg while (true) 365 1.1 mrg { 366 1.1 mrg if (gsi_end_p (*gsi)) 367 1.1 mrg return; 368 1.1 mrg stmt = gsi_stmt (*gsi); 369 1.1 mrg if (!stmt_local_def (stmt)) 370 1.1 mrg return; 371 1.1 mrg gsi_next_nondebug (gsi); 372 1.1 mrg } 373 1.1 mrg } 374 1.1 mrg 375 1.1 mrg /* VAL1 and VAL2 are either: 376 1.1 mrg - uses in BB1 and BB2, or 377 1.1 mrg - phi alternatives for BB1 and BB2. 378 1.1 mrg Return true if the uses have the same gvn value. */ 379 1.1 mrg 380 1.1 mrg static bool 381 1.1 mrg gvn_uses_equal (tree val1, tree val2) 382 1.1 mrg { 383 1.1 mrg gcc_checking_assert (val1 != NULL_TREE && val2 != NULL_TREE); 384 1.1 mrg 385 1.1 mrg if (val1 == val2) 386 1.1 mrg return true; 387 1.1 mrg 388 1.1 mrg if (tail_merge_valueize (val1) != tail_merge_valueize (val2)) 389 1.1 mrg return false; 390 1.1 mrg 391 1.1 mrg return ((TREE_CODE (val1) == SSA_NAME || CONSTANT_CLASS_P (val1)) 392 1.1 mrg && (TREE_CODE (val2) == SSA_NAME || CONSTANT_CLASS_P (val2))); 393 1.1 mrg } 394 1.1 mrg 395 1.1 mrg /* Prints E to FILE. */ 396 1.1 mrg 397 1.1 mrg static void 398 1.1 mrg same_succ_print (FILE *file, const same_succ *e) 399 1.1 mrg { 400 1.1 mrg unsigned int i; 401 1.1 mrg bitmap_print (file, e->bbs, "bbs:", "\n"); 402 1.1 mrg bitmap_print (file, e->succs, "succs:", "\n"); 403 1.1 mrg bitmap_print (file, e->inverse, "inverse:", "\n"); 404 1.1 mrg fprintf (file, "flags:"); 405 1.1 mrg for (i = 0; i < e->succ_flags.length (); ++i) 406 1.1 mrg fprintf (file, " %x", e->succ_flags[i]); 407 1.1 mrg fprintf (file, "\n"); 408 1.1 mrg } 409 1.1 mrg 410 1.1 mrg /* Prints same_succ VE to VFILE. */ 411 1.1 mrg 412 1.1 mrg inline int 413 1.1 mrg ssa_same_succ_print_traverse (same_succ **pe, FILE *file) 414 1.1 mrg { 415 1.1 mrg const same_succ *e = *pe; 416 1.1 mrg same_succ_print (file, e); 417 1.1 mrg return 1; 418 1.1 mrg } 419 1.1 mrg 420 1.1 mrg /* Update BB_DEP_BB (USE_BB), given a use of VAL in USE_BB. */ 421 1.1 mrg 422 1.1 mrg static void 423 1.1 mrg update_dep_bb (basic_block use_bb, tree val) 424 1.1 mrg { 425 1.1 mrg basic_block dep_bb; 426 1.1 mrg 427 1.1 mrg /* Not a dep. */ 428 1.1 mrg if (TREE_CODE (val) != SSA_NAME) 429 1.1 mrg return; 430 1.1 mrg 431 1.1 mrg /* Skip use of global def. */ 432 1.1 mrg if (SSA_NAME_IS_DEFAULT_DEF (val)) 433 1.1 mrg return; 434 1.1 mrg 435 1.1 mrg /* Skip use of local def. */ 436 1.1 mrg dep_bb = gimple_bb (SSA_NAME_DEF_STMT (val)); 437 1.1 mrg if (dep_bb == use_bb) 438 1.1 mrg return; 439 1.1 mrg 440 1.1 mrg if (BB_DEP_BB (use_bb) == NULL 441 1.1 mrg || dominated_by_p (CDI_DOMINATORS, dep_bb, BB_DEP_BB (use_bb))) 442 1.1 mrg BB_DEP_BB (use_bb) = dep_bb; 443 1.1 mrg } 444 1.1 mrg 445 1.1 mrg /* Update BB_DEP_BB, given the dependencies in STMT. */ 446 1.1 mrg 447 1.1 mrg static void 448 1.1 mrg stmt_update_dep_bb (gimple *stmt) 449 1.1 mrg { 450 1.1 mrg ssa_op_iter iter; 451 1.1 mrg use_operand_p use; 452 1.1 mrg 453 1.1 mrg FOR_EACH_SSA_USE_OPERAND (use, stmt, iter, SSA_OP_USE) 454 1.1 mrg update_dep_bb (gimple_bb (stmt), USE_FROM_PTR (use)); 455 1.1 mrg } 456 1.1 mrg 457 1.1 mrg /* Calculates hash value for same_succ VE. */ 458 1.1 mrg 459 1.1 mrg static hashval_t 460 1.1 mrg same_succ_hash (const same_succ *e) 461 1.1 mrg { 462 1.1 mrg inchash::hash hstate (bitmap_hash (e->succs)); 463 1.1 mrg int flags; 464 1.1 mrg unsigned int i; 465 1.1 mrg unsigned int first = bitmap_first_set_bit (e->bbs); 466 1.1 mrg basic_block bb = BASIC_BLOCK_FOR_FN (cfun, first); 467 1.1 mrg int size = 0; 468 1.1 mrg gimple *stmt; 469 1.1 mrg tree arg; 470 1.1 mrg unsigned int s; 471 1.1 mrg bitmap_iterator bs; 472 1.1 mrg 473 1.1 mrg for (gimple_stmt_iterator gsi = gsi_start_nondebug_bb (bb); 474 1.1 mrg !gsi_end_p (gsi); gsi_next_nondebug (&gsi)) 475 1.1 mrg { 476 1.1 mrg stmt = gsi_stmt (gsi); 477 1.1 mrg stmt_update_dep_bb (stmt); 478 1.1 mrg if (stmt_local_def (stmt)) 479 1.1 mrg continue; 480 1.1 mrg size++; 481 1.1 mrg 482 1.1 mrg hstate.add_int (gimple_code (stmt)); 483 1.1 mrg if (is_gimple_assign (stmt)) 484 1.1 mrg hstate.add_int (gimple_assign_rhs_code (stmt)); 485 1.1 mrg if (!is_gimple_call (stmt)) 486 1.1 mrg continue; 487 1.1 mrg if (gimple_call_internal_p (stmt)) 488 1.1 mrg hstate.add_int (gimple_call_internal_fn (stmt)); 489 1.1 mrg else 490 1.1 mrg { 491 1.1 mrg inchash::add_expr (gimple_call_fn (stmt), hstate); 492 1.1 mrg if (gimple_call_chain (stmt)) 493 1.1 mrg inchash::add_expr (gimple_call_chain (stmt), hstate); 494 1.1 mrg } 495 1.1 mrg for (i = 0; i < gimple_call_num_args (stmt); i++) 496 1.1 mrg { 497 1.1 mrg arg = gimple_call_arg (stmt, i); 498 1.1 mrg arg = tail_merge_valueize (arg); 499 1.1 mrg inchash::add_expr (arg, hstate); 500 1.1 mrg } 501 1.1 mrg } 502 1.1 mrg 503 1.1 mrg hstate.add_int (size); 504 1.1 mrg BB_SIZE (bb) = size; 505 1.1 mrg 506 1.1 mrg hstate.add_int (bb->loop_father->num); 507 1.1 mrg 508 1.1 mrg for (i = 0; i < e->succ_flags.length (); ++i) 509 1.1 mrg { 510 1.1 mrg flags = e->succ_flags[i]; 511 1.1 mrg flags = flags & ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE); 512 1.1 mrg hstate.add_int (flags); 513 1.1 mrg } 514 1.1 mrg 515 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (e->succs, 0, s, bs) 516 1.1 mrg { 517 1.1 mrg int n = find_edge (bb, BASIC_BLOCK_FOR_FN (cfun, s))->dest_idx; 518 1.1 mrg for (gphi_iterator gsi = gsi_start_phis (BASIC_BLOCK_FOR_FN (cfun, s)); 519 1.1 mrg !gsi_end_p (gsi); 520 1.1 mrg gsi_next (&gsi)) 521 1.1 mrg { 522 1.1 mrg gphi *phi = gsi.phi (); 523 1.1 mrg tree lhs = gimple_phi_result (phi); 524 1.1 mrg tree val = gimple_phi_arg_def (phi, n); 525 1.1 mrg 526 1.1 mrg if (virtual_operand_p (lhs)) 527 1.1 mrg continue; 528 1.1 mrg update_dep_bb (bb, val); 529 1.1 mrg } 530 1.1 mrg } 531 1.1 mrg 532 1.1 mrg return hstate.end (); 533 1.1 mrg } 534 1.1 mrg 535 1.1 mrg /* Returns true if E1 and E2 have 2 successors, and if the successor flags 536 1.1 mrg are inverse for the EDGE_TRUE_VALUE and EDGE_FALSE_VALUE flags, and equal for 537 1.1 mrg the other edge flags. */ 538 1.1 mrg 539 1.1 mrg static bool 540 1.1 mrg inverse_flags (const same_succ *e1, const same_succ *e2) 541 1.1 mrg { 542 1.1 mrg int f1a, f1b, f2a, f2b; 543 1.1 mrg int mask = ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE); 544 1.1 mrg 545 1.1 mrg if (e1->succ_flags.length () != 2) 546 1.1 mrg return false; 547 1.1 mrg 548 1.1 mrg f1a = e1->succ_flags[0]; 549 1.1 mrg f1b = e1->succ_flags[1]; 550 1.1 mrg f2a = e2->succ_flags[0]; 551 1.1 mrg f2b = e2->succ_flags[1]; 552 1.1 mrg 553 1.1 mrg if (f1a == f2a && f1b == f2b) 554 1.1 mrg return false; 555 1.1 mrg 556 1.1 mrg return (f1a & mask) == (f2a & mask) && (f1b & mask) == (f2b & mask); 557 1.1 mrg } 558 1.1 mrg 559 1.1 mrg /* Compares SAME_SUCCs E1 and E2. */ 560 1.1 mrg 561 1.1 mrg int 562 1.1 mrg same_succ::equal (const same_succ *e1, const same_succ *e2) 563 1.1 mrg { 564 1.1 mrg unsigned int i, first1, first2; 565 1.1 mrg gimple_stmt_iterator gsi1, gsi2; 566 1.1 mrg gimple *s1, *s2; 567 1.1 mrg basic_block bb1, bb2; 568 1.1 mrg 569 1.1 mrg if (e1 == e2) 570 1.1 mrg return 1; 571 1.1 mrg 572 1.1 mrg if (e1->hashval != e2->hashval) 573 1.1 mrg return 0; 574 1.1 mrg 575 1.1 mrg if (e1->succ_flags.length () != e2->succ_flags.length ()) 576 1.1 mrg return 0; 577 1.1 mrg 578 1.1 mrg if (!bitmap_equal_p (e1->succs, e2->succs)) 579 1.1 mrg return 0; 580 1.1 mrg 581 1.1 mrg if (!inverse_flags (e1, e2)) 582 1.1 mrg { 583 1.1 mrg for (i = 0; i < e1->succ_flags.length (); ++i) 584 1.1 mrg if (e1->succ_flags[i] != e2->succ_flags[i]) 585 1.1 mrg return 0; 586 1.1 mrg } 587 1.1 mrg 588 1.1 mrg first1 = bitmap_first_set_bit (e1->bbs); 589 1.1 mrg first2 = bitmap_first_set_bit (e2->bbs); 590 1.1 mrg 591 1.1 mrg bb1 = BASIC_BLOCK_FOR_FN (cfun, first1); 592 1.1 mrg bb2 = BASIC_BLOCK_FOR_FN (cfun, first2); 593 1.1 mrg 594 1.1 mrg if (BB_SIZE (bb1) != BB_SIZE (bb2)) 595 1.1 mrg return 0; 596 1.1 mrg 597 1.1 mrg if (bb1->loop_father != bb2->loop_father) 598 1.1 mrg return 0; 599 1.1 mrg 600 1.1 mrg gsi1 = gsi_start_nondebug_bb (bb1); 601 1.1 mrg gsi2 = gsi_start_nondebug_bb (bb2); 602 1.1 mrg gsi_advance_fw_nondebug_nonlocal (&gsi1); 603 1.1 mrg gsi_advance_fw_nondebug_nonlocal (&gsi2); 604 1.1 mrg while (!(gsi_end_p (gsi1) || gsi_end_p (gsi2))) 605 1.1 mrg { 606 1.1 mrg s1 = gsi_stmt (gsi1); 607 1.1 mrg s2 = gsi_stmt (gsi2); 608 1.1 mrg if (gimple_code (s1) != gimple_code (s2)) 609 1.1 mrg return 0; 610 1.1 mrg if (is_gimple_call (s1) && !gimple_call_same_target_p (s1, s2)) 611 1.1 mrg return 0; 612 1.1 mrg gsi_next_nondebug (&gsi1); 613 1.1 mrg gsi_next_nondebug (&gsi2); 614 1.1 mrg gsi_advance_fw_nondebug_nonlocal (&gsi1); 615 1.1 mrg gsi_advance_fw_nondebug_nonlocal (&gsi2); 616 1.1 mrg } 617 1.1 mrg 618 1.1 mrg return 1; 619 1.1 mrg } 620 1.1 mrg 621 1.1 mrg /* Alloc and init a new SAME_SUCC. */ 622 1.1 mrg 623 1.1 mrg static same_succ * 624 1.1 mrg same_succ_alloc (void) 625 1.1 mrg { 626 1.1 mrg same_succ *same = XNEW (struct same_succ); 627 1.1 mrg 628 1.1 mrg same->bbs = BITMAP_ALLOC (NULL); 629 1.1 mrg same->succs = BITMAP_ALLOC (NULL); 630 1.1 mrg same->inverse = BITMAP_ALLOC (NULL); 631 1.1 mrg same->succ_flags.create (10); 632 1.1 mrg same->in_worklist = false; 633 1.1 mrg 634 1.1 mrg return same; 635 1.1 mrg } 636 1.1 mrg 637 1.1 mrg /* Delete same_succ E. */ 638 1.1 mrg 639 1.1 mrg void 640 1.1 mrg same_succ::remove (same_succ *e) 641 1.1 mrg { 642 1.1 mrg BITMAP_FREE (e->bbs); 643 1.1 mrg BITMAP_FREE (e->succs); 644 1.1 mrg BITMAP_FREE (e->inverse); 645 1.1 mrg e->succ_flags.release (); 646 1.1 mrg 647 1.1 mrg XDELETE (e); 648 1.1 mrg } 649 1.1 mrg 650 1.1 mrg /* Reset same_succ SAME. */ 651 1.1 mrg 652 1.1 mrg static void 653 1.1 mrg same_succ_reset (same_succ *same) 654 1.1 mrg { 655 1.1 mrg bitmap_clear (same->bbs); 656 1.1 mrg bitmap_clear (same->succs); 657 1.1 mrg bitmap_clear (same->inverse); 658 1.1 mrg same->succ_flags.truncate (0); 659 1.1 mrg } 660 1.1 mrg 661 1.1 mrg static hash_table<same_succ> *same_succ_htab; 662 1.1 mrg 663 1.1 mrg /* Array that is used to store the edge flags for a successor. */ 664 1.1 mrg 665 1.1 mrg static int *same_succ_edge_flags; 666 1.1 mrg 667 1.1 mrg /* Bitmap that is used to mark bbs that are recently deleted. */ 668 1.1 mrg 669 1.1 mrg static bitmap deleted_bbs; 670 1.1 mrg 671 1.1 mrg /* Bitmap that is used to mark predecessors of bbs that are 672 1.1 mrg deleted. */ 673 1.1 mrg 674 1.1 mrg static bitmap deleted_bb_preds; 675 1.1 mrg 676 1.1 mrg /* Prints same_succ_htab to stderr. */ 677 1.1 mrg 678 1.1 mrg extern void debug_same_succ (void); 679 1.1 mrg DEBUG_FUNCTION void 680 1.1 mrg debug_same_succ ( void) 681 1.1 mrg { 682 1.1 mrg same_succ_htab->traverse <FILE *, ssa_same_succ_print_traverse> (stderr); 683 1.1 mrg } 684 1.1 mrg 685 1.1 mrg 686 1.1 mrg /* Vector of bbs to process. */ 687 1.1 mrg 688 1.1 mrg static vec<same_succ *> worklist; 689 1.1 mrg 690 1.1 mrg /* Prints worklist to FILE. */ 691 1.1 mrg 692 1.1 mrg static void 693 1.1 mrg print_worklist (FILE *file) 694 1.1 mrg { 695 1.1 mrg unsigned int i; 696 1.1 mrg for (i = 0; i < worklist.length (); ++i) 697 1.1 mrg same_succ_print (file, worklist[i]); 698 1.1 mrg } 699 1.1 mrg 700 1.1 mrg /* Adds SAME to worklist. */ 701 1.1 mrg 702 1.1 mrg static void 703 1.1 mrg add_to_worklist (same_succ *same) 704 1.1 mrg { 705 1.1 mrg if (same->in_worklist) 706 1.1 mrg return; 707 1.1 mrg 708 1.1 mrg if (bitmap_count_bits (same->bbs) < 2) 709 1.1 mrg return; 710 1.1 mrg 711 1.1 mrg same->in_worklist = true; 712 1.1 mrg worklist.safe_push (same); 713 1.1 mrg } 714 1.1 mrg 715 1.1 mrg /* Add BB to same_succ_htab. */ 716 1.1 mrg 717 1.1 mrg static void 718 1.1 mrg find_same_succ_bb (basic_block bb, same_succ **same_p) 719 1.1 mrg { 720 1.1 mrg unsigned int j; 721 1.1 mrg bitmap_iterator bj; 722 1.1 mrg same_succ *same = *same_p; 723 1.1 mrg same_succ **slot; 724 1.1 mrg edge_iterator ei; 725 1.1 mrg edge e; 726 1.1 mrg 727 1.1 mrg if (bb == NULL) 728 1.1 mrg return; 729 1.1 mrg bitmap_set_bit (same->bbs, bb->index); 730 1.1 mrg FOR_EACH_EDGE (e, ei, bb->succs) 731 1.1 mrg { 732 1.1 mrg int index = e->dest->index; 733 1.1 mrg bitmap_set_bit (same->succs, index); 734 1.1 mrg same_succ_edge_flags[index] = (e->flags & ~ignore_edge_flags); 735 1.1 mrg } 736 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (same->succs, 0, j, bj) 737 1.1 mrg same->succ_flags.safe_push (same_succ_edge_flags[j]); 738 1.1 mrg 739 1.1 mrg same->hashval = same_succ_hash (same); 740 1.1 mrg 741 1.1 mrg slot = same_succ_htab->find_slot_with_hash (same, same->hashval, INSERT); 742 1.1 mrg if (*slot == NULL) 743 1.1 mrg { 744 1.1 mrg *slot = same; 745 1.1 mrg BB_SAME_SUCC (bb) = same; 746 1.1 mrg add_to_worklist (same); 747 1.1 mrg *same_p = NULL; 748 1.1 mrg } 749 1.1 mrg else 750 1.1 mrg { 751 1.1 mrg bitmap_set_bit ((*slot)->bbs, bb->index); 752 1.1 mrg BB_SAME_SUCC (bb) = *slot; 753 1.1 mrg add_to_worklist (*slot); 754 1.1 mrg if (inverse_flags (same, *slot)) 755 1.1 mrg bitmap_set_bit ((*slot)->inverse, bb->index); 756 1.1 mrg same_succ_reset (same); 757 1.1 mrg } 758 1.1 mrg } 759 1.1 mrg 760 1.1 mrg /* Find bbs with same successors. */ 761 1.1 mrg 762 1.1 mrg static void 763 1.1 mrg find_same_succ (void) 764 1.1 mrg { 765 1.1 mrg same_succ *same = same_succ_alloc (); 766 1.1 mrg basic_block bb; 767 1.1 mrg 768 1.1 mrg FOR_EACH_BB_FN (bb, cfun) 769 1.1 mrg { 770 1.1 mrg find_same_succ_bb (bb, &same); 771 1.1 mrg if (same == NULL) 772 1.1 mrg same = same_succ_alloc (); 773 1.1 mrg } 774 1.1 mrg 775 1.1 mrg same_succ::remove (same); 776 1.1 mrg } 777 1.1 mrg 778 1.1 mrg /* Initializes worklist administration. */ 779 1.1 mrg 780 1.1 mrg static void 781 1.1 mrg init_worklist (void) 782 1.1 mrg { 783 1.1 mrg alloc_aux_for_blocks (sizeof (struct aux_bb_info)); 784 1.1 mrg same_succ_htab = new hash_table<same_succ> (n_basic_blocks_for_fn (cfun)); 785 1.1 mrg same_succ_edge_flags = XCNEWVEC (int, last_basic_block_for_fn (cfun)); 786 1.1 mrg deleted_bbs = BITMAP_ALLOC (NULL); 787 1.1 mrg deleted_bb_preds = BITMAP_ALLOC (NULL); 788 1.1 mrg worklist.create (n_basic_blocks_for_fn (cfun)); 789 1.1 mrg find_same_succ (); 790 1.1 mrg 791 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 792 1.1 mrg { 793 1.1 mrg fprintf (dump_file, "initial worklist:\n"); 794 1.1 mrg print_worklist (dump_file); 795 1.1 mrg } 796 1.1 mrg } 797 1.1 mrg 798 1.1 mrg /* Deletes worklist administration. */ 799 1.1 mrg 800 1.1 mrg static void 801 1.1 mrg delete_worklist (void) 802 1.1 mrg { 803 1.1 mrg free_aux_for_blocks (); 804 1.1 mrg delete same_succ_htab; 805 1.1 mrg same_succ_htab = NULL; 806 1.1 mrg XDELETEVEC (same_succ_edge_flags); 807 1.1 mrg same_succ_edge_flags = NULL; 808 1.1 mrg BITMAP_FREE (deleted_bbs); 809 1.1 mrg BITMAP_FREE (deleted_bb_preds); 810 1.1 mrg worklist.release (); 811 1.1 mrg } 812 1.1 mrg 813 1.1 mrg /* Mark BB as deleted, and mark its predecessors. */ 814 1.1 mrg 815 1.1 mrg static void 816 1.1 mrg mark_basic_block_deleted (basic_block bb) 817 1.1 mrg { 818 1.1 mrg edge e; 819 1.1 mrg edge_iterator ei; 820 1.1 mrg 821 1.1 mrg bitmap_set_bit (deleted_bbs, bb->index); 822 1.1 mrg 823 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds) 824 1.1 mrg bitmap_set_bit (deleted_bb_preds, e->src->index); 825 1.1 mrg } 826 1.1 mrg 827 1.1 mrg /* Removes BB from its corresponding same_succ. */ 828 1.1 mrg 829 1.1 mrg static void 830 1.1 mrg same_succ_flush_bb (basic_block bb) 831 1.1 mrg { 832 1.1 mrg same_succ *same = BB_SAME_SUCC (bb); 833 1.1 mrg if (! same) 834 1.1 mrg return; 835 1.1 mrg 836 1.1 mrg BB_SAME_SUCC (bb) = NULL; 837 1.1 mrg if (bitmap_single_bit_set_p (same->bbs)) 838 1.1 mrg same_succ_htab->remove_elt_with_hash (same, same->hashval); 839 1.1 mrg else 840 1.1 mrg bitmap_clear_bit (same->bbs, bb->index); 841 1.1 mrg } 842 1.1 mrg 843 1.1 mrg /* Removes all bbs in BBS from their corresponding same_succ. */ 844 1.1 mrg 845 1.1 mrg static void 846 1.1 mrg same_succ_flush_bbs (bitmap bbs) 847 1.1 mrg { 848 1.1 mrg unsigned int i; 849 1.1 mrg bitmap_iterator bi; 850 1.1 mrg 851 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (bbs, 0, i, bi) 852 1.1 mrg same_succ_flush_bb (BASIC_BLOCK_FOR_FN (cfun, i)); 853 1.1 mrg } 854 1.1 mrg 855 1.1 mrg /* Release the last vdef in BB, either normal or phi result. */ 856 1.1 mrg 857 1.1 mrg static void 858 1.1 mrg release_last_vdef (basic_block bb) 859 1.1 mrg { 860 1.1 mrg for (gimple_stmt_iterator i = gsi_last_bb (bb); !gsi_end_p (i); 861 1.1 mrg gsi_prev_nondebug (&i)) 862 1.1 mrg { 863 1.1 mrg gimple *stmt = gsi_stmt (i); 864 1.1 mrg if (gimple_vdef (stmt) == NULL_TREE) 865 1.1 mrg continue; 866 1.1 mrg 867 1.1 mrg mark_virtual_operand_for_renaming (gimple_vdef (stmt)); 868 1.1 mrg return; 869 1.1 mrg } 870 1.1 mrg 871 1.1 mrg for (gphi_iterator i = gsi_start_phis (bb); !gsi_end_p (i); 872 1.1 mrg gsi_next (&i)) 873 1.1 mrg { 874 1.1 mrg gphi *phi = i.phi (); 875 1.1 mrg tree res = gimple_phi_result (phi); 876 1.1 mrg 877 1.1 mrg if (!virtual_operand_p (res)) 878 1.1 mrg continue; 879 1.1 mrg 880 1.1 mrg mark_virtual_phi_result_for_renaming (phi); 881 1.1 mrg return; 882 1.1 mrg } 883 1.1 mrg } 884 1.1 mrg 885 1.1 mrg /* For deleted_bb_preds, find bbs with same successors. */ 886 1.1 mrg 887 1.1 mrg static void 888 1.1 mrg update_worklist (void) 889 1.1 mrg { 890 1.1 mrg unsigned int i; 891 1.1 mrg bitmap_iterator bi; 892 1.1 mrg basic_block bb; 893 1.1 mrg same_succ *same; 894 1.1 mrg 895 1.1 mrg bitmap_and_compl_into (deleted_bb_preds, deleted_bbs); 896 1.1 mrg bitmap_clear (deleted_bbs); 897 1.1 mrg 898 1.1 mrg bitmap_clear_bit (deleted_bb_preds, ENTRY_BLOCK); 899 1.1 mrg same_succ_flush_bbs (deleted_bb_preds); 900 1.1 mrg 901 1.1 mrg same = same_succ_alloc (); 902 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (deleted_bb_preds, 0, i, bi) 903 1.1 mrg { 904 1.1 mrg bb = BASIC_BLOCK_FOR_FN (cfun, i); 905 1.1 mrg gcc_assert (bb != NULL); 906 1.1 mrg find_same_succ_bb (bb, &same); 907 1.1 mrg if (same == NULL) 908 1.1 mrg same = same_succ_alloc (); 909 1.1 mrg } 910 1.1 mrg same_succ::remove (same); 911 1.1 mrg bitmap_clear (deleted_bb_preds); 912 1.1 mrg } 913 1.1 mrg 914 1.1 mrg /* Prints cluster C to FILE. */ 915 1.1 mrg 916 1.1 mrg static void 917 1.1 mrg print_cluster (FILE *file, bb_cluster *c) 918 1.1 mrg { 919 1.1 mrg if (c == NULL) 920 1.1 mrg return; 921 1.1 mrg bitmap_print (file, c->bbs, "bbs:", "\n"); 922 1.1 mrg bitmap_print (file, c->preds, "preds:", "\n"); 923 1.1 mrg } 924 1.1 mrg 925 1.1 mrg /* Prints cluster C to stderr. */ 926 1.1 mrg 927 1.1 mrg extern void debug_cluster (bb_cluster *); 928 1.1 mrg DEBUG_FUNCTION void 929 1.1 mrg debug_cluster (bb_cluster *c) 930 1.1 mrg { 931 1.1 mrg print_cluster (stderr, c); 932 1.1 mrg } 933 1.1 mrg 934 1.1 mrg /* Update C->rep_bb, given that BB is added to the cluster. */ 935 1.1 mrg 936 1.1 mrg static void 937 1.1 mrg update_rep_bb (bb_cluster *c, basic_block bb) 938 1.1 mrg { 939 1.1 mrg /* Initial. */ 940 1.1 mrg if (c->rep_bb == NULL) 941 1.1 mrg { 942 1.1 mrg c->rep_bb = bb; 943 1.1 mrg return; 944 1.1 mrg } 945 1.1 mrg 946 1.1 mrg /* Current needs no deps, keep it. */ 947 1.1 mrg if (BB_DEP_BB (c->rep_bb) == NULL) 948 1.1 mrg return; 949 1.1 mrg 950 1.1 mrg /* Bb needs no deps, change rep_bb. */ 951 1.1 mrg if (BB_DEP_BB (bb) == NULL) 952 1.1 mrg { 953 1.1 mrg c->rep_bb = bb; 954 1.1 mrg return; 955 1.1 mrg } 956 1.1 mrg 957 1.1 mrg /* Bb needs last deps earlier than current, change rep_bb. A potential 958 1.1 mrg problem with this, is that the first deps might also be earlier, which 959 1.1 mrg would mean we prefer longer lifetimes for the deps. To be able to check 960 1.1 mrg for this, we would have to trace BB_FIRST_DEP_BB as well, besides 961 1.1 mrg BB_DEP_BB, which is really BB_LAST_DEP_BB. 962 1.1 mrg The benefit of choosing the bb with last deps earlier, is that it can 963 1.1 mrg potentially be used as replacement for more bbs. */ 964 1.1 mrg if (dominated_by_p (CDI_DOMINATORS, BB_DEP_BB (c->rep_bb), BB_DEP_BB (bb))) 965 1.1 mrg c->rep_bb = bb; 966 1.1 mrg } 967 1.1 mrg 968 1.1 mrg /* Add BB to cluster C. Sets BB in C->bbs, and preds of BB in C->preds. */ 969 1.1 mrg 970 1.1 mrg static void 971 1.1 mrg add_bb_to_cluster (bb_cluster *c, basic_block bb) 972 1.1 mrg { 973 1.1 mrg edge e; 974 1.1 mrg edge_iterator ei; 975 1.1 mrg 976 1.1 mrg bitmap_set_bit (c->bbs, bb->index); 977 1.1 mrg 978 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds) 979 1.1 mrg bitmap_set_bit (c->preds, e->src->index); 980 1.1 mrg 981 1.1 mrg update_rep_bb (c, bb); 982 1.1 mrg } 983 1.1 mrg 984 1.1 mrg /* Allocate and init new cluster. */ 985 1.1 mrg 986 1.1 mrg static bb_cluster * 987 1.1 mrg new_cluster (void) 988 1.1 mrg { 989 1.1 mrg bb_cluster *c; 990 1.1 mrg c = XCNEW (bb_cluster); 991 1.1 mrg c->bbs = BITMAP_ALLOC (NULL); 992 1.1 mrg c->preds = BITMAP_ALLOC (NULL); 993 1.1 mrg c->rep_bb = NULL; 994 1.1 mrg return c; 995 1.1 mrg } 996 1.1 mrg 997 1.1 mrg /* Delete clusters. */ 998 1.1 mrg 999 1.1 mrg static void 1000 1.1 mrg delete_cluster (bb_cluster *c) 1001 1.1 mrg { 1002 1.1 mrg if (c == NULL) 1003 1.1 mrg return; 1004 1.1 mrg BITMAP_FREE (c->bbs); 1005 1.1 mrg BITMAP_FREE (c->preds); 1006 1.1 mrg XDELETE (c); 1007 1.1 mrg } 1008 1.1 mrg 1009 1.1 mrg 1010 1.1 mrg /* Array that contains all clusters. */ 1011 1.1 mrg 1012 1.1 mrg static vec<bb_cluster *> all_clusters; 1013 1.1 mrg 1014 1.1 mrg /* Allocate all cluster vectors. */ 1015 1.1 mrg 1016 1.1 mrg static void 1017 1.1 mrg alloc_cluster_vectors (void) 1018 1.1 mrg { 1019 1.1 mrg all_clusters.create (n_basic_blocks_for_fn (cfun)); 1020 1.1 mrg } 1021 1.1 mrg 1022 1.1 mrg /* Reset all cluster vectors. */ 1023 1.1 mrg 1024 1.1 mrg static void 1025 1.1 mrg reset_cluster_vectors (void) 1026 1.1 mrg { 1027 1.1 mrg unsigned int i; 1028 1.1 mrg basic_block bb; 1029 1.1 mrg for (i = 0; i < all_clusters.length (); ++i) 1030 1.1 mrg delete_cluster (all_clusters[i]); 1031 1.1 mrg all_clusters.truncate (0); 1032 1.1 mrg FOR_EACH_BB_FN (bb, cfun) 1033 1.1 mrg BB_CLUSTER (bb) = NULL; 1034 1.1 mrg } 1035 1.1 mrg 1036 1.1 mrg /* Delete all cluster vectors. */ 1037 1.1 mrg 1038 1.1 mrg static void 1039 1.1 mrg delete_cluster_vectors (void) 1040 1.1 mrg { 1041 1.1 mrg unsigned int i; 1042 1.1 mrg for (i = 0; i < all_clusters.length (); ++i) 1043 1.1 mrg delete_cluster (all_clusters[i]); 1044 1.1 mrg all_clusters.release (); 1045 1.1 mrg } 1046 1.1 mrg 1047 1.1 mrg /* Merge cluster C2 into C1. */ 1048 1.1 mrg 1049 1.1 mrg static void 1050 1.1 mrg merge_clusters (bb_cluster *c1, bb_cluster *c2) 1051 1.1 mrg { 1052 1.1 mrg bitmap_ior_into (c1->bbs, c2->bbs); 1053 1.1 mrg bitmap_ior_into (c1->preds, c2->preds); 1054 1.1 mrg } 1055 1.1 mrg 1056 1.1 mrg /* Register equivalence of BB1 and BB2 (members of cluster C). Store c in 1057 1.1 mrg all_clusters, or merge c with existing cluster. */ 1058 1.1 mrg 1059 1.1 mrg static void 1060 1.1 mrg set_cluster (basic_block bb1, basic_block bb2) 1061 1.1 mrg { 1062 1.1 mrg basic_block merge_bb, other_bb; 1063 1.1 mrg bb_cluster *merge, *old, *c; 1064 1.1 mrg 1065 1.1 mrg if (BB_CLUSTER (bb1) == NULL && BB_CLUSTER (bb2) == NULL) 1066 1.1 mrg { 1067 1.1 mrg c = new_cluster (); 1068 1.1 mrg add_bb_to_cluster (c, bb1); 1069 1.1 mrg add_bb_to_cluster (c, bb2); 1070 1.1 mrg BB_CLUSTER (bb1) = c; 1071 1.1 mrg BB_CLUSTER (bb2) = c; 1072 1.1 mrg c->index = all_clusters.length (); 1073 1.1 mrg all_clusters.safe_push (c); 1074 1.1 mrg } 1075 1.1 mrg else if (BB_CLUSTER (bb1) == NULL || BB_CLUSTER (bb2) == NULL) 1076 1.1 mrg { 1077 1.1 mrg merge_bb = BB_CLUSTER (bb1) == NULL ? bb2 : bb1; 1078 1.1 mrg other_bb = BB_CLUSTER (bb1) == NULL ? bb1 : bb2; 1079 1.1 mrg merge = BB_CLUSTER (merge_bb); 1080 1.1 mrg add_bb_to_cluster (merge, other_bb); 1081 1.1 mrg BB_CLUSTER (other_bb) = merge; 1082 1.1 mrg } 1083 1.1 mrg else if (BB_CLUSTER (bb1) != BB_CLUSTER (bb2)) 1084 1.1 mrg { 1085 1.1 mrg unsigned int i; 1086 1.1 mrg bitmap_iterator bi; 1087 1.1 mrg 1088 1.1 mrg old = BB_CLUSTER (bb2); 1089 1.1 mrg merge = BB_CLUSTER (bb1); 1090 1.1 mrg merge_clusters (merge, old); 1091 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (old->bbs, 0, i, bi) 1092 1.1 mrg BB_CLUSTER (BASIC_BLOCK_FOR_FN (cfun, i)) = merge; 1093 1.1 mrg all_clusters[old->index] = NULL; 1094 1.1 mrg update_rep_bb (merge, old->rep_bb); 1095 1.1 mrg delete_cluster (old); 1096 1.1 mrg } 1097 1.1 mrg else 1098 1.1 mrg gcc_unreachable (); 1099 1.1 mrg } 1100 1.1 mrg 1101 1.1 mrg /* Return true if gimple operands T1 and T2 have the same value. */ 1102 1.1 mrg 1103 1.1 mrg static bool 1104 1.1 mrg gimple_operand_equal_value_p (tree t1, tree t2) 1105 1.1 mrg { 1106 1.1 mrg if (t1 == t2) 1107 1.1 mrg return true; 1108 1.1 mrg 1109 1.1 mrg if (t1 == NULL_TREE 1110 1.1 mrg || t2 == NULL_TREE) 1111 1.1 mrg return false; 1112 1.1 mrg 1113 1.1 mrg if (operand_equal_p (t1, t2, OEP_MATCH_SIDE_EFFECTS)) 1114 1.1 mrg return true; 1115 1.1 mrg 1116 1.1 mrg return gvn_uses_equal (t1, t2); 1117 1.1 mrg } 1118 1.1 mrg 1119 1.1 mrg /* Return true if gimple statements S1 and S2 are equal. Gimple_bb (s1) and 1120 1.1 mrg gimple_bb (s2) are members of SAME_SUCC. */ 1121 1.1 mrg 1122 1.1 mrg static bool 1123 1.1 mrg gimple_equal_p (same_succ *same_succ, gimple *s1, gimple *s2) 1124 1.1 mrg { 1125 1.1 mrg unsigned int i; 1126 1.1 mrg tree lhs1, lhs2; 1127 1.1 mrg basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2); 1128 1.1 mrg tree t1, t2; 1129 1.1 mrg bool inv_cond; 1130 1.1 mrg enum tree_code code1, code2; 1131 1.1 mrg 1132 1.1 mrg if (gimple_code (s1) != gimple_code (s2)) 1133 1.1 mrg return false; 1134 1.1 mrg 1135 1.1 mrg switch (gimple_code (s1)) 1136 1.1 mrg { 1137 1.1 mrg case GIMPLE_CALL: 1138 1.1 mrg if (!gimple_call_same_target_p (s1, s2)) 1139 1.1 mrg return false; 1140 1.1 mrg 1141 1.1 mrg t1 = gimple_call_chain (s1); 1142 1.1 mrg t2 = gimple_call_chain (s2); 1143 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2)) 1144 1.1 mrg return false; 1145 1.1 mrg 1146 1.1 mrg if (gimple_call_num_args (s1) != gimple_call_num_args (s2)) 1147 1.1 mrg return false; 1148 1.1 mrg 1149 1.1 mrg for (i = 0; i < gimple_call_num_args (s1); ++i) 1150 1.1 mrg { 1151 1.1 mrg t1 = gimple_call_arg (s1, i); 1152 1.1 mrg t2 = gimple_call_arg (s2, i); 1153 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2)) 1154 1.1 mrg return false; 1155 1.1 mrg } 1156 1.1 mrg 1157 1.1 mrg lhs1 = gimple_get_lhs (s1); 1158 1.1 mrg lhs2 = gimple_get_lhs (s2); 1159 1.1 mrg if (lhs1 == NULL_TREE && lhs2 == NULL_TREE) 1160 1.1 mrg return true; 1161 1.1 mrg if (lhs1 == NULL_TREE || lhs2 == NULL_TREE) 1162 1.1 mrg return false; 1163 1.1 mrg if (TREE_CODE (lhs1) == SSA_NAME && TREE_CODE (lhs2) == SSA_NAME) 1164 1.1 mrg return tail_merge_valueize (lhs1) == tail_merge_valueize (lhs2); 1165 1.1 mrg return operand_equal_p (lhs1, lhs2, 0); 1166 1.1 mrg 1167 1.1 mrg case GIMPLE_ASSIGN: 1168 1.1 mrg if (gimple_assign_rhs_code (s1) != gimple_assign_rhs_code (s2)) 1169 1.1 mrg return false; 1170 1.1 mrg 1171 1.1 mrg lhs1 = gimple_get_lhs (s1); 1172 1.1 mrg lhs2 = gimple_get_lhs (s2); 1173 1.1 mrg if (TREE_CODE (lhs1) != SSA_NAME 1174 1.1 mrg && TREE_CODE (lhs2) != SSA_NAME) 1175 1.1 mrg return (operand_equal_p (lhs1, lhs2, 0) 1176 1.1 mrg && gimple_operand_equal_value_p (gimple_assign_rhs1 (s1), 1177 1.1 mrg gimple_assign_rhs1 (s2))); 1178 1.1 mrg 1179 1.1 mrg if (TREE_CODE (lhs1) != SSA_NAME 1180 1.1 mrg || TREE_CODE (lhs2) != SSA_NAME) 1181 1.1 mrg return false; 1182 1.1 mrg 1183 1.1 mrg gcc_checking_assert (gimple_num_args (s1) == gimple_num_args (s2)); 1184 1.1 mrg for (i = 0; i < gimple_num_args (s1); ++i) 1185 1.1 mrg { 1186 1.1 mrg t1 = gimple_arg (s1, i); 1187 1.1 mrg t2 = gimple_arg (s2, i); 1188 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2)) 1189 1.1 mrg return false; 1190 1.1 mrg } 1191 1.1 mrg return true; 1192 1.1 mrg 1193 1.1 mrg case GIMPLE_COND: 1194 1.1 mrg t1 = gimple_cond_lhs (s1); 1195 1.1 mrg t2 = gimple_cond_lhs (s2); 1196 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2)) 1197 1.1 mrg return false; 1198 1.1 mrg 1199 1.1 mrg t1 = gimple_cond_rhs (s1); 1200 1.1 mrg t2 = gimple_cond_rhs (s2); 1201 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2)) 1202 1.1 mrg return false; 1203 1.1 mrg 1204 1.1 mrg code1 = gimple_cond_code (s1); 1205 1.1 mrg code2 = gimple_cond_code (s2); 1206 1.1 mrg inv_cond = (bitmap_bit_p (same_succ->inverse, bb1->index) 1207 1.1 mrg != bitmap_bit_p (same_succ->inverse, bb2->index)); 1208 1.1 mrg if (inv_cond) 1209 1.1 mrg { 1210 1.1 mrg bool honor_nans = HONOR_NANS (t1); 1211 1.1 mrg code2 = invert_tree_comparison (code2, honor_nans); 1212 1.1 mrg } 1213 1.1 mrg return code1 == code2; 1214 1.1 mrg 1215 1.1 mrg default: 1216 1.1 mrg return false; 1217 1.1 mrg } 1218 1.1 mrg } 1219 1.1 mrg 1220 1.1 mrg /* Let GSI skip backwards over local defs. Return the earliest vuse in VUSE. 1221 1.1 mrg Return true in VUSE_ESCAPED if the vuse influenced a SSA_OP_DEF of one of the 1222 1.1 mrg processed statements. */ 1223 1.1 mrg 1224 1.1 mrg static void 1225 1.1 mrg gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi, tree *vuse, 1226 1.1 mrg bool *vuse_escaped) 1227 1.1 mrg { 1228 1.1 mrg gimple *stmt; 1229 1.1 mrg tree lvuse; 1230 1.1 mrg 1231 1.1 mrg while (true) 1232 1.1 mrg { 1233 1.1 mrg if (gsi_end_p (*gsi)) 1234 1.1 mrg return; 1235 1.1 mrg stmt = gsi_stmt (*gsi); 1236 1.1 mrg 1237 1.1 mrg lvuse = gimple_vuse (stmt); 1238 1.1 mrg if (lvuse != NULL_TREE) 1239 1.1 mrg { 1240 1.1 mrg *vuse = lvuse; 1241 1.1 mrg if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_DEF)) 1242 1.1 mrg *vuse_escaped = true; 1243 1.1 mrg } 1244 1.1 mrg 1245 1.1 mrg if (!stmt_local_def (stmt)) 1246 1.1 mrg return; 1247 1.1 mrg gsi_prev_nondebug (gsi); 1248 1.1 mrg } 1249 1.1 mrg } 1250 1.1 mrg 1251 1.1 mrg /* Return true if equal (in the sense of gimple_equal_p) statements STMT1 and 1252 1.1 mrg STMT2 are allowed to be merged. */ 1253 1.1 mrg 1254 1.1 mrg static bool 1255 1.1 mrg merge_stmts_p (gimple *stmt1, gimple *stmt2) 1256 1.1 mrg { 1257 1.1 mrg /* What could be better than this here is to blacklist the bb 1258 1.1 mrg containing the stmt, when encountering the stmt f.i. in 1259 1.1 mrg same_succ_hash. */ 1260 1.1 mrg if (is_tm_ending (stmt1)) 1261 1.1 mrg return false; 1262 1.1 mrg 1263 1.1 mrg /* Verify EH landing pads. */ 1264 1.1 mrg if (lookup_stmt_eh_lp_fn (cfun, stmt1) != lookup_stmt_eh_lp_fn (cfun, stmt2)) 1265 1.1 mrg return false; 1266 1.1 mrg 1267 1.1 mrg if (is_gimple_call (stmt1) 1268 1.1 mrg && gimple_call_internal_p (stmt1)) 1269 1.1 mrg switch (gimple_call_internal_fn (stmt1)) 1270 1.1 mrg { 1271 1.1 mrg case IFN_UBSAN_NULL: 1272 1.1 mrg case IFN_UBSAN_BOUNDS: 1273 1.1 mrg case IFN_UBSAN_VPTR: 1274 1.1 mrg case IFN_UBSAN_CHECK_ADD: 1275 1.1 mrg case IFN_UBSAN_CHECK_SUB: 1276 1.1 mrg case IFN_UBSAN_CHECK_MUL: 1277 1.1 mrg case IFN_UBSAN_OBJECT_SIZE: 1278 1.1 mrg case IFN_UBSAN_PTR: 1279 1.1 mrg case IFN_ASAN_CHECK: 1280 1.1 mrg /* For these internal functions, gimple_location is an implicit 1281 1.1 mrg parameter, which will be used explicitly after expansion. 1282 1.1 mrg Merging these statements may cause confusing line numbers in 1283 1.1 mrg sanitizer messages. */ 1284 1.1 mrg return gimple_location (stmt1) == gimple_location (stmt2); 1285 1.1 mrg default: 1286 1.1 mrg break; 1287 1.1 mrg } 1288 1.1 mrg 1289 1.1 mrg return true; 1290 1.1 mrg } 1291 1.1 mrg 1292 1.1 mrg /* Determines whether BB1 and BB2 (members of same_succ) are duplicates. If so, 1293 1.1 mrg clusters them. */ 1294 1.1 mrg 1295 1.1 mrg static void 1296 1.1 mrg find_duplicate (same_succ *same_succ, basic_block bb1, basic_block bb2) 1297 1.1 mrg { 1298 1.1 mrg gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1); 1299 1.1 mrg gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2); 1300 1.1 mrg tree vuse1 = NULL_TREE, vuse2 = NULL_TREE; 1301 1.1 mrg bool vuse_escaped = false; 1302 1.1 mrg 1303 1.1 mrg gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped); 1304 1.1 mrg gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped); 1305 1.1 mrg 1306 1.1 mrg while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2)) 1307 1.1 mrg { 1308 1.1 mrg gimple *stmt1 = gsi_stmt (gsi1); 1309 1.1 mrg gimple *stmt2 = gsi_stmt (gsi2); 1310 1.1 mrg 1311 1.1 mrg if (gimple_code (stmt1) == GIMPLE_LABEL 1312 1.1 mrg && gimple_code (stmt2) == GIMPLE_LABEL) 1313 1.1 mrg break; 1314 1.1 mrg 1315 1.1 mrg if (!gimple_equal_p (same_succ, stmt1, stmt2)) 1316 1.1 mrg return; 1317 1.1 mrg 1318 1.1 mrg if (!merge_stmts_p (stmt1, stmt2)) 1319 1.1 mrg return; 1320 1.1 mrg 1321 1.1 mrg gsi_prev_nondebug (&gsi1); 1322 1.1 mrg gsi_prev_nondebug (&gsi2); 1323 1.1 mrg gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped); 1324 1.1 mrg gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped); 1325 1.1 mrg } 1326 1.1 mrg 1327 1.1 mrg while (!gsi_end_p (gsi1) && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL) 1328 1.1 mrg { 1329 1.1 mrg tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi1))); 1330 1.1 mrg if (DECL_NONLOCAL (label) || FORCED_LABEL (label)) 1331 1.1 mrg return; 1332 1.1 mrg gsi_prev (&gsi1); 1333 1.1 mrg } 1334 1.1 mrg while (!gsi_end_p (gsi2) && gimple_code (gsi_stmt (gsi2)) == GIMPLE_LABEL) 1335 1.1 mrg { 1336 1.1 mrg tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi2))); 1337 1.1 mrg if (DECL_NONLOCAL (label) || FORCED_LABEL (label)) 1338 1.1 mrg return; 1339 1.1 mrg gsi_prev (&gsi2); 1340 1.1 mrg } 1341 1.1 mrg if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2))) 1342 1.1 mrg return; 1343 1.1 mrg 1344 1.1 mrg /* If the incoming vuses are not the same, and the vuse escaped into an 1345 1.1 mrg SSA_OP_DEF, then merging the 2 blocks will change the value of the def, 1346 1.1 mrg which potentially means the semantics of one of the blocks will be changed. 1347 1.1 mrg TODO: make this check more precise. */ 1348 1.1 mrg if (vuse_escaped && vuse1 != vuse2) 1349 1.1 mrg return; 1350 1.1 mrg 1351 1.1 mrg if (dump_file) 1352 1.1 mrg fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n", 1353 1.1 mrg bb1->index, bb2->index); 1354 1.1 mrg 1355 1.1 mrg set_cluster (bb1, bb2); 1356 1.1 mrg } 1357 1.1 mrg 1358 1.1 mrg /* Returns whether for all phis in DEST the phi alternatives for E1 and 1359 1.1 mrg E2 are equal. */ 1360 1.1 mrg 1361 1.1 mrg static bool 1362 1.1 mrg same_phi_alternatives_1 (basic_block dest, edge e1, edge e2) 1363 1.1 mrg { 1364 1.1 mrg int n1 = e1->dest_idx, n2 = e2->dest_idx; 1365 1.1 mrg gphi_iterator gsi; 1366 1.1 mrg 1367 1.1 mrg for (gsi = gsi_start_phis (dest); !gsi_end_p (gsi); gsi_next (&gsi)) 1368 1.1 mrg { 1369 1.1 mrg gphi *phi = gsi.phi (); 1370 1.1 mrg tree lhs = gimple_phi_result (phi); 1371 1.1 mrg tree val1 = gimple_phi_arg_def (phi, n1); 1372 1.1 mrg tree val2 = gimple_phi_arg_def (phi, n2); 1373 1.1 mrg 1374 1.1 mrg if (virtual_operand_p (lhs)) 1375 1.1 mrg continue; 1376 1.1 mrg 1377 1.1 mrg if (operand_equal_for_phi_arg_p (val1, val2)) 1378 1.1 mrg continue; 1379 1.1 mrg if (gvn_uses_equal (val1, val2)) 1380 1.1 mrg continue; 1381 1.1 mrg 1382 1.1 mrg return false; 1383 1.1 mrg } 1384 1.1 mrg 1385 1.1 mrg return true; 1386 1.1 mrg } 1387 1.1 mrg 1388 1.1 mrg /* Returns whether for all successors of BB1 and BB2 (members of SAME_SUCC), the 1389 1.1 mrg phi alternatives for BB1 and BB2 are equal. */ 1390 1.1 mrg 1391 1.1 mrg static bool 1392 1.1 mrg same_phi_alternatives (same_succ *same_succ, basic_block bb1, basic_block bb2) 1393 1.1 mrg { 1394 1.1 mrg unsigned int s; 1395 1.1 mrg bitmap_iterator bs; 1396 1.1 mrg edge e1, e2; 1397 1.1 mrg basic_block succ; 1398 1.1 mrg 1399 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (same_succ->succs, 0, s, bs) 1400 1.1 mrg { 1401 1.1 mrg succ = BASIC_BLOCK_FOR_FN (cfun, s); 1402 1.1 mrg e1 = find_edge (bb1, succ); 1403 1.1 mrg e2 = find_edge (bb2, succ); 1404 1.1 mrg if (e1->flags & EDGE_COMPLEX 1405 1.1 mrg || e2->flags & EDGE_COMPLEX) 1406 1.1 mrg return false; 1407 1.1 mrg 1408 1.1 mrg /* For all phis in bb, the phi alternatives for e1 and e2 need to have 1409 1.1 mrg the same value. */ 1410 1.1 mrg if (!same_phi_alternatives_1 (succ, e1, e2)) 1411 1.1 mrg return false; 1412 1.1 mrg } 1413 1.1 mrg 1414 1.1 mrg return true; 1415 1.1 mrg } 1416 1.1 mrg 1417 1.1 mrg /* Return true if BB has non-vop phis. */ 1418 1.1 mrg 1419 1.1 mrg static bool 1420 1.1 mrg bb_has_non_vop_phi (basic_block bb) 1421 1.1 mrg { 1422 1.1 mrg gimple_seq phis = phi_nodes (bb); 1423 1.1 mrg gimple *phi; 1424 1.1 mrg 1425 1.1 mrg if (phis == NULL) 1426 1.1 mrg return false; 1427 1.1 mrg 1428 1.1 mrg if (!gimple_seq_singleton_p (phis)) 1429 1.1 mrg return true; 1430 1.1 mrg 1431 1.1 mrg phi = gimple_seq_first_stmt (phis); 1432 1.1 mrg return !virtual_operand_p (gimple_phi_result (phi)); 1433 1.1 mrg } 1434 1.1 mrg 1435 1.1 mrg /* Returns true if redirecting the incoming edges of FROM to TO maintains the 1436 1.1 mrg invariant that uses in FROM are dominates by their defs. */ 1437 1.1 mrg 1438 1.1 mrg static bool 1439 1.1 mrg deps_ok_for_redirect_from_bb_to_bb (basic_block from, basic_block to) 1440 1.1 mrg { 1441 1.1 mrg basic_block cd, dep_bb = BB_DEP_BB (to); 1442 1.1 mrg edge_iterator ei; 1443 1.1 mrg edge e; 1444 1.1 mrg 1445 1.1 mrg if (dep_bb == NULL) 1446 1.1 mrg return true; 1447 1.1 mrg 1448 1.1 mrg bitmap from_preds = BITMAP_ALLOC (NULL); 1449 1.1 mrg FOR_EACH_EDGE (e, ei, from->preds) 1450 1.1 mrg bitmap_set_bit (from_preds, e->src->index); 1451 1.1 mrg cd = nearest_common_dominator_for_set (CDI_DOMINATORS, from_preds); 1452 1.1 mrg BITMAP_FREE (from_preds); 1453 1.1 mrg 1454 1.1 mrg return dominated_by_p (CDI_DOMINATORS, dep_bb, cd); 1455 1.1 mrg } 1456 1.1 mrg 1457 1.1 mrg /* Returns true if replacing BB1 (or its replacement bb) by BB2 (or its 1458 1.1 mrg replacement bb) and vice versa maintains the invariant that uses in the 1459 1.1 mrg replacement are dominates by their defs. */ 1460 1.1 mrg 1461 1.1 mrg static bool 1462 1.1 mrg deps_ok_for_redirect (basic_block bb1, basic_block bb2) 1463 1.1 mrg { 1464 1.1 mrg if (BB_CLUSTER (bb1) != NULL) 1465 1.1 mrg bb1 = BB_CLUSTER (bb1)->rep_bb; 1466 1.1 mrg 1467 1.1 mrg if (BB_CLUSTER (bb2) != NULL) 1468 1.1 mrg bb2 = BB_CLUSTER (bb2)->rep_bb; 1469 1.1 mrg 1470 1.1 mrg return (deps_ok_for_redirect_from_bb_to_bb (bb1, bb2) 1471 1.1 mrg && deps_ok_for_redirect_from_bb_to_bb (bb2, bb1)); 1472 1.1 mrg } 1473 1.1 mrg 1474 1.1 mrg /* Within SAME_SUCC->bbs, find clusters of bbs which can be merged. */ 1475 1.1 mrg 1476 1.1 mrg static void 1477 1.1 mrg find_clusters_1 (same_succ *same_succ) 1478 1.1 mrg { 1479 1.1 mrg basic_block bb1, bb2; 1480 1.1 mrg unsigned int i, j; 1481 1.1 mrg bitmap_iterator bi, bj; 1482 1.1 mrg int nr_comparisons; 1483 1.1 mrg int max_comparisons = param_max_tail_merge_comparisons; 1484 1.1 mrg 1485 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, 0, i, bi) 1486 1.1 mrg { 1487 1.1 mrg bb1 = BASIC_BLOCK_FOR_FN (cfun, i); 1488 1.1 mrg 1489 1.1 mrg /* TODO: handle blocks with phi-nodes. We'll have to find corresponding 1490 1.1 mrg phi-nodes in bb1 and bb2, with the same alternatives for the same 1491 1.1 mrg preds. */ 1492 1.1 mrg if (bb_has_non_vop_phi (bb1) || bb_has_eh_pred (bb1) 1493 1.1 mrg || bb_has_abnormal_pred (bb1)) 1494 1.1 mrg continue; 1495 1.1 mrg 1496 1.1 mrg nr_comparisons = 0; 1497 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, i + 1, j, bj) 1498 1.1 mrg { 1499 1.1 mrg bb2 = BASIC_BLOCK_FOR_FN (cfun, j); 1500 1.1 mrg 1501 1.1 mrg if (bb_has_non_vop_phi (bb2) || bb_has_eh_pred (bb2) 1502 1.1 mrg || bb_has_abnormal_pred (bb2)) 1503 1.1 mrg continue; 1504 1.1 mrg 1505 1.1 mrg if (BB_CLUSTER (bb1) != NULL && BB_CLUSTER (bb1) == BB_CLUSTER (bb2)) 1506 1.1 mrg continue; 1507 1.1 mrg 1508 1.1 mrg /* Limit quadratic behavior. */ 1509 1.1 mrg nr_comparisons++; 1510 1.1 mrg if (nr_comparisons > max_comparisons) 1511 1.1 mrg break; 1512 1.1 mrg 1513 1.1 mrg /* This is a conservative dependency check. We could test more 1514 1.1 mrg precise for allowed replacement direction. */ 1515 1.1 mrg if (!deps_ok_for_redirect (bb1, bb2)) 1516 1.1 mrg continue; 1517 1.1 mrg 1518 1.1 mrg if (!(same_phi_alternatives (same_succ, bb1, bb2))) 1519 1.1 mrg continue; 1520 1.1 mrg 1521 1.1 mrg find_duplicate (same_succ, bb1, bb2); 1522 1.1 mrg } 1523 1.1 mrg } 1524 1.1 mrg } 1525 1.1 mrg 1526 1.1 mrg /* Find clusters of bbs which can be merged. */ 1527 1.1 mrg 1528 1.1 mrg static void 1529 1.1 mrg find_clusters (void) 1530 1.1 mrg { 1531 1.1 mrg same_succ *same; 1532 1.1 mrg 1533 1.1 mrg while (!worklist.is_empty ()) 1534 1.1 mrg { 1535 1.1 mrg same = worklist.pop (); 1536 1.1 mrg same->in_worklist = false; 1537 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1538 1.1 mrg { 1539 1.1 mrg fprintf (dump_file, "processing worklist entry\n"); 1540 1.1 mrg same_succ_print (dump_file, same); 1541 1.1 mrg } 1542 1.1 mrg find_clusters_1 (same); 1543 1.1 mrg } 1544 1.1 mrg } 1545 1.1 mrg 1546 1.1 mrg /* Returns the vop phi of BB, if any. */ 1547 1.1 mrg 1548 1.1 mrg static gphi * 1549 1.1 mrg vop_phi (basic_block bb) 1550 1.1 mrg { 1551 1.1 mrg gphi *stmt; 1552 1.1 mrg gphi_iterator gsi; 1553 1.1 mrg for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1554 1.1 mrg { 1555 1.1 mrg stmt = gsi.phi (); 1556 1.1 mrg if (! virtual_operand_p (gimple_phi_result (stmt))) 1557 1.1 mrg continue; 1558 1.1 mrg return stmt; 1559 1.1 mrg } 1560 1.1 mrg return NULL; 1561 1.1 mrg } 1562 1.1 mrg 1563 1.1 mrg /* Redirect all edges from BB1 to BB2, removes BB1 and marks it as removed. */ 1564 1.1 mrg 1565 1.1 mrg static void 1566 1.1 mrg replace_block_by (basic_block bb1, basic_block bb2) 1567 1.1 mrg { 1568 1.1 mrg edge pred_edge; 1569 1.1 mrg unsigned int i; 1570 1.1 mrg gphi *bb2_phi; 1571 1.1 mrg 1572 1.1 mrg bb2_phi = vop_phi (bb2); 1573 1.1 mrg 1574 1.1 mrg /* Mark the basic block as deleted. */ 1575 1.1 mrg mark_basic_block_deleted (bb1); 1576 1.1 mrg 1577 1.1 mrg /* Redirect the incoming edges of bb1 to bb2. */ 1578 1.1 mrg for (i = EDGE_COUNT (bb1->preds); i > 0 ; --i) 1579 1.1 mrg { 1580 1.1 mrg pred_edge = EDGE_PRED (bb1, i - 1); 1581 1.1 mrg pred_edge = redirect_edge_and_branch (pred_edge, bb2); 1582 1.1 mrg gcc_assert (pred_edge != NULL); 1583 1.1 mrg 1584 1.1 mrg if (bb2_phi == NULL) 1585 1.1 mrg continue; 1586 1.1 mrg 1587 1.1 mrg /* The phi might have run out of capacity when the redirect added an 1588 1.1 mrg argument, which means it could have been replaced. Refresh it. */ 1589 1.1 mrg bb2_phi = vop_phi (bb2); 1590 1.1 mrg 1591 1.1 mrg add_phi_arg (bb2_phi, SSA_NAME_VAR (gimple_phi_result (bb2_phi)), 1592 1.1 mrg pred_edge, UNKNOWN_LOCATION); 1593 1.1 mrg } 1594 1.1 mrg 1595 1.1 mrg 1596 1.1 mrg /* Merge the outgoing edge counts from bb1 onto bb2. */ 1597 1.1 mrg edge e1, e2; 1598 1.1 mrg edge_iterator ei; 1599 1.1 mrg 1600 1.1 mrg if (bb2->count.initialized_p ()) 1601 1.1 mrg FOR_EACH_EDGE (e1, ei, bb1->succs) 1602 1.1 mrg { 1603 1.1 mrg e2 = find_edge (bb2, e1->dest); 1604 1.1 mrg gcc_assert (e2); 1605 1.1 mrg 1606 1.1 mrg /* If probabilities are same, we are done. 1607 1.1 mrg If counts are nonzero we can distribute accordingly. In remaining 1608 1.1 mrg cases just avreage the values and hope for the best. */ 1609 1.1 mrg e2->probability = e1->probability.combine_with_count 1610 1.1 mrg (bb1->count, e2->probability, bb2->count); 1611 1.1 mrg } 1612 1.1 mrg bb2->count += bb1->count; 1613 1.1 mrg 1614 1.1 mrg /* Move over any user labels from bb1 after the bb2 labels. */ 1615 1.1 mrg gimple_stmt_iterator gsi1 = gsi_start_bb (bb1); 1616 1.1 mrg if (!gsi_end_p (gsi1) && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL) 1617 1.1 mrg { 1618 1.1 mrg gimple_stmt_iterator gsi2 = gsi_after_labels (bb2); 1619 1.1 mrg while (!gsi_end_p (gsi1) 1620 1.1 mrg && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL) 1621 1.1 mrg { 1622 1.1 mrg tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi1))); 1623 1.1 mrg gcc_assert (!DECL_NONLOCAL (label) && !FORCED_LABEL (label)); 1624 1.1 mrg if (DECL_ARTIFICIAL (label)) 1625 1.1 mrg gsi_next (&gsi1); 1626 1.1 mrg else 1627 1.1 mrg gsi_move_before (&gsi1, &gsi2); 1628 1.1 mrg } 1629 1.1 mrg } 1630 1.1 mrg 1631 1.1 mrg /* Clear range info from all stmts in BB2 -- this transformation 1632 1.1 mrg could make them out of date. */ 1633 1.1 mrg reset_flow_sensitive_info_in_bb (bb2); 1634 1.1 mrg 1635 1.1 mrg /* Do updates that use bb1, before deleting bb1. */ 1636 1.1 mrg release_last_vdef (bb1); 1637 1.1 mrg same_succ_flush_bb (bb1); 1638 1.1 mrg 1639 1.1 mrg delete_basic_block (bb1); 1640 1.1 mrg } 1641 1.1 mrg 1642 1.1 mrg /* Bbs for which update_debug_stmt need to be called. */ 1643 1.1 mrg 1644 1.1 mrg static bitmap update_bbs; 1645 1.1 mrg 1646 1.1 mrg /* For each cluster in all_clusters, merge all cluster->bbs. Returns 1647 1.1 mrg number of bbs removed. */ 1648 1.1 mrg 1649 1.1 mrg static int 1650 1.1 mrg apply_clusters (void) 1651 1.1 mrg { 1652 1.1 mrg basic_block bb1, bb2; 1653 1.1 mrg bb_cluster *c; 1654 1.1 mrg unsigned int i, j; 1655 1.1 mrg bitmap_iterator bj; 1656 1.1 mrg int nr_bbs_removed = 0; 1657 1.1 mrg 1658 1.1 mrg for (i = 0; i < all_clusters.length (); ++i) 1659 1.1 mrg { 1660 1.1 mrg c = all_clusters[i]; 1661 1.1 mrg if (c == NULL) 1662 1.1 mrg continue; 1663 1.1 mrg 1664 1.1 mrg bb2 = c->rep_bb; 1665 1.1 mrg bitmap_set_bit (update_bbs, bb2->index); 1666 1.1 mrg 1667 1.1 mrg bitmap_clear_bit (c->bbs, bb2->index); 1668 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (c->bbs, 0, j, bj) 1669 1.1 mrg { 1670 1.1 mrg bb1 = BASIC_BLOCK_FOR_FN (cfun, j); 1671 1.1 mrg bitmap_clear_bit (update_bbs, bb1->index); 1672 1.1 mrg 1673 1.1 mrg replace_block_by (bb1, bb2); 1674 1.1 mrg nr_bbs_removed++; 1675 1.1 mrg } 1676 1.1 mrg } 1677 1.1 mrg 1678 1.1 mrg return nr_bbs_removed; 1679 1.1 mrg } 1680 1.1 mrg 1681 1.1 mrg /* Resets debug statement STMT if it has uses that are not dominated by their 1682 1.1 mrg defs. */ 1683 1.1 mrg 1684 1.1 mrg static void 1685 1.1 mrg update_debug_stmt (gimple *stmt) 1686 1.1 mrg { 1687 1.1 mrg use_operand_p use_p; 1688 1.1 mrg ssa_op_iter oi; 1689 1.1 mrg basic_block bbuse; 1690 1.1 mrg 1691 1.1 mrg if (!gimple_debug_bind_p (stmt)) 1692 1.1 mrg return; 1693 1.1 mrg 1694 1.1 mrg bbuse = gimple_bb (stmt); 1695 1.1 mrg FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, oi, SSA_OP_USE) 1696 1.1 mrg { 1697 1.1 mrg tree name = USE_FROM_PTR (use_p); 1698 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (name); 1699 1.1 mrg basic_block bbdef = gimple_bb (def_stmt); 1700 1.1 mrg if (bbdef == NULL || bbuse == bbdef 1701 1.1 mrg || dominated_by_p (CDI_DOMINATORS, bbuse, bbdef)) 1702 1.1 mrg continue; 1703 1.1 mrg 1704 1.1 mrg gimple_debug_bind_reset_value (stmt); 1705 1.1 mrg update_stmt (stmt); 1706 1.1 mrg break; 1707 1.1 mrg } 1708 1.1 mrg } 1709 1.1 mrg 1710 1.1 mrg /* Resets all debug statements that have uses that are not 1711 1.1 mrg dominated by their defs. */ 1712 1.1 mrg 1713 1.1 mrg static void 1714 1.1 mrg update_debug_stmts (void) 1715 1.1 mrg { 1716 1.1 mrg basic_block bb; 1717 1.1 mrg bitmap_iterator bi; 1718 1.1 mrg unsigned int i; 1719 1.1 mrg 1720 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (update_bbs, 0, i, bi) 1721 1.1 mrg { 1722 1.1 mrg gimple *stmt; 1723 1.1 mrg gimple_stmt_iterator gsi; 1724 1.1 mrg 1725 1.1 mrg bb = BASIC_BLOCK_FOR_FN (cfun, i); 1726 1.1 mrg for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1727 1.1 mrg { 1728 1.1 mrg stmt = gsi_stmt (gsi); 1729 1.1 mrg if (!is_gimple_debug (stmt)) 1730 1.1 mrg continue; 1731 1.1 mrg update_debug_stmt (stmt); 1732 1.1 mrg } 1733 1.1 mrg } 1734 1.1 mrg } 1735 1.1 mrg 1736 1.1 mrg /* Runs tail merge optimization. */ 1737 1.1 mrg 1738 1.1 mrg unsigned int 1739 1.1 mrg tail_merge_optimize (bool need_crit_edge_split) 1740 1.1 mrg { 1741 1.1 mrg int nr_bbs_removed_total = 0; 1742 1.1 mrg int nr_bbs_removed; 1743 1.1 mrg bool loop_entered = false; 1744 1.1 mrg int iteration_nr = 0; 1745 1.1 mrg int max_iterations = param_max_tail_merge_iterations; 1746 1.1 mrg 1747 1.1 mrg if (!flag_tree_tail_merge 1748 1.1 mrg || max_iterations == 0) 1749 1.1 mrg return 0; 1750 1.1 mrg 1751 1.1 mrg timevar_push (TV_TREE_TAIL_MERGE); 1752 1.1 mrg 1753 1.1 mrg /* Re-split critical edges when PRE did a CFG cleanup. */ 1754 1.1 mrg if (need_crit_edge_split) 1755 1.1 mrg split_edges_for_insertion (); 1756 1.1 mrg 1757 1.1 mrg if (!dom_info_available_p (CDI_DOMINATORS)) 1758 1.1 mrg { 1759 1.1 mrg /* PRE can leave us with unreachable blocks, remove them now. */ 1760 1.1 mrg delete_unreachable_blocks (); 1761 1.1 mrg calculate_dominance_info (CDI_DOMINATORS); 1762 1.1 mrg } 1763 1.1 mrg init_worklist (); 1764 1.1 mrg 1765 1.1 mrg while (!worklist.is_empty ()) 1766 1.1 mrg { 1767 1.1 mrg if (!loop_entered) 1768 1.1 mrg { 1769 1.1 mrg loop_entered = true; 1770 1.1 mrg alloc_cluster_vectors (); 1771 1.1 mrg update_bbs = BITMAP_ALLOC (NULL); 1772 1.1 mrg } 1773 1.1 mrg else 1774 1.1 mrg reset_cluster_vectors (); 1775 1.1 mrg 1776 1.1 mrg iteration_nr++; 1777 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1778 1.1 mrg fprintf (dump_file, "worklist iteration #%d\n", iteration_nr); 1779 1.1 mrg 1780 1.1 mrg find_clusters (); 1781 1.1 mrg gcc_assert (worklist.is_empty ()); 1782 1.1 mrg if (all_clusters.is_empty ()) 1783 1.1 mrg break; 1784 1.1 mrg 1785 1.1 mrg nr_bbs_removed = apply_clusters (); 1786 1.1 mrg nr_bbs_removed_total += nr_bbs_removed; 1787 1.1 mrg if (nr_bbs_removed == 0) 1788 1.1 mrg break; 1789 1.1 mrg 1790 1.1 mrg free_dominance_info (CDI_DOMINATORS); 1791 1.1 mrg 1792 1.1 mrg if (iteration_nr == max_iterations) 1793 1.1 mrg break; 1794 1.1 mrg 1795 1.1 mrg calculate_dominance_info (CDI_DOMINATORS); 1796 1.1 mrg update_worklist (); 1797 1.1 mrg } 1798 1.1 mrg 1799 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1800 1.1 mrg fprintf (dump_file, "htab collision / search: %f\n", 1801 1.1 mrg same_succ_htab->collisions ()); 1802 1.1 mrg 1803 1.1 mrg if (nr_bbs_removed_total > 0) 1804 1.1 mrg { 1805 1.1 mrg if (MAY_HAVE_DEBUG_BIND_STMTS) 1806 1.1 mrg { 1807 1.1 mrg calculate_dominance_info (CDI_DOMINATORS); 1808 1.1 mrg update_debug_stmts (); 1809 1.1 mrg } 1810 1.1 mrg 1811 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1812 1.1 mrg { 1813 1.1 mrg fprintf (dump_file, "Before TODOs.\n"); 1814 1.1 mrg dump_function_to_file (current_function_decl, dump_file, dump_flags); 1815 1.1 mrg } 1816 1.1 mrg 1817 1.1 mrg mark_virtual_operands_for_renaming (cfun); 1818 1.1 mrg } 1819 1.1 mrg 1820 1.1 mrg delete_worklist (); 1821 1.1 mrg if (loop_entered) 1822 1.1 mrg { 1823 1.1 mrg delete_cluster_vectors (); 1824 1.1 mrg BITMAP_FREE (update_bbs); 1825 1.1 mrg } 1826 1.1 mrg 1827 1.1 mrg timevar_pop (TV_TREE_TAIL_MERGE); 1828 1.1 mrg 1829 1.1 mrg return 0; 1830 1.1 mrg } 1831