//------------------------------remove_dead------------------------------------ // Recursively kill a dead Node. void Block::remove_dead( Node *dead ) { // Smash all inputs to 'dead', isolating him completely for( uint i = 0; i < dead->req(); i++ ) { Node *in = dead->in(i); if( in ) { // Points to something? dead->set_req(i,NULL); // Kill the edge if( in->outcnt() == 0 ) {// Made input go dead? remove_dead(in); // Recursively remove } } } }
/* Does all known instruction optimizations */ void cuc_optimize (cuc_func * func) { int modified = 0; int first = 1; log ("Optimizing.\n"); do { modified = 0; clean_deps (func); if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_CLEAN_DEPS"); if (optimize_cmovs (func)) { if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_CMOVS"); modified = 1; } if (cuc_debug) cuc_check (func); if (optimize_tree (func)) { if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_TREE1"); modified = 1; } if (remove_nops (func)) { if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS"); modified = 1; } if (cuc_debug) cuc_check (func); if (remove_dead (func)) { if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD"); modified = 1; } if (cuc_debug) cuc_check (func); if (cse (func)) { log ("Common subexpression elimination.\n"); if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_CSE"); modified = 1; } if (first) { insert_conditional_facts (func); if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_COND_FACT"); if (cuc_debug) cuc_check (func); first = 0; } if (optimize_bb (func)) { if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_OPT_BB"); modified = 1; } if (cuc_debug) cuc_check (func); if (remove_nops (func)) { if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS"); modified = 1; } if (remove_dead_bb (func)) { if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD_BB"); modified = 1; } if (remove_trivial_regs (func)) { if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_TRIVIAL"); modified = 1; } if (remove_nops (func)) { if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS"); modified = 1; } add_memory_dep (func, func->memory_order); if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_MEMORY_DEP"); add_data_dep (func); if (cuc_debug >= 8) print_cuc_bb (func, "AFTER_DATA_DEP"); if (schedule_memory (func, func->memory_order)) { if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_SCHEDULE_MEM"); modified = 1; } } while (modified); set_io (func); #if 0 detect_max_values (func); if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_MAX_VALUES"); #endif }