//Could ir be looked as a last stmt in basic block? bool IRBB::is_bb_down_boundary(IR * ir) { ASSERT(ir->isStmtInBB() || ir->is_lab(), ("illegal stmt in bb")); switch (IR_code(ir)) { case IR_CALL: case IR_ICALL: //indirective call return ((CCall*)ir)->isMustBBbound(); case IR_GOTO: case IR_IGOTO: return true; case IR_SWITCH: ASSERT(SWITCH_body(ir) == NULL, ("Peel switch-body to enable switch in bb-list construction")); return true; case IR_TRUEBR: case IR_FALSEBR: return true; case IR_RETURN: case IR_REGION: return true; default: break; } return false; }
bool IR_CFS_OPT::CfsOpt( IN OUT IR ** ir_list, SimpCtx const& sc) { bool change = false; for (IR * ir = *ir_list; ir != NULL;) { if (transformToDoWhile(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (ir->is_if() && transformIf1(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (ir->is_if() && transformIf2(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (ir->is_if() && transformIf3(ir_list, ir)) { change = true; ir = *ir_list; continue; } switch (ir->get_code()) { case IR_IF: if (hoistIf(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (CfsOpt(&IF_truebody(ir), sc)) { change = true; ir = *ir_list; continue; } if (CfsOpt(&IF_falsebody(ir), sc)) { change = true; ir = *ir_list; continue; } break; case IR_DO_WHILE: case IR_WHILE_DO: case IR_DO_LOOP: if (hoistLoop(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (CfsOpt(&LOOP_body(ir), sc)) { change = true; ir = *ir_list; continue; } break; case IR_SWITCH: if (CfsOpt(&SWITCH_body(ir), sc)) { change = true; ir = *ir_list; continue; } break; default:; } //end switch ir = ir->get_next(); } return change; }
bool IR_CFS_OPT::perform_cfs_optimization(IN OUT IR ** ir_list, IN SIMP_CTX const& sc) { bool change = false; for (IR * ir = *ir_list; ir != NULL;) { if (trans_to_do_while_loop(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (IR_type(ir) == IR_IF && trans_if1(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (IR_type(ir) == IR_IF && trans_if2(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (IR_type(ir) == IR_IF && trans_if3(ir_list, ir)) { change = true; ir = *ir_list; continue; } switch (IR_type(ir)) { case IR_IF: if (hoist_if(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (perform_cfs_optimization(&IF_truebody(ir), sc)) { change = true; ir = *ir_list; continue; } if (perform_cfs_optimization(&IF_falsebody(ir), sc)) { change = true; ir = *ir_list; continue; } break; case IR_DO_WHILE: case IR_WHILE_DO: case IR_DO_LOOP: if (hoist_loop(ir_list, ir)) { change = true; ir = *ir_list; continue; } if (perform_cfs_optimization(&LOOP_body(ir), sc)) { change = true; ir = *ir_list; continue; } break; case IR_SWITCH: if (perform_cfs_optimization(&SWITCH_body(ir), sc)) { change = true; ir = *ir_list; continue; } break; default:; } //end switch ir = IR_next(ir); } return change; }