static enum gimplify_status cp_gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) { tree for_stmt = *expr_p; tree cont_block; gimple stmt; gimple_seq seq = NULL; /* Protect ourselves from recursion. */ if (OMP_FOR_GIMPLIFYING_P (for_stmt)) return GS_UNHANDLED; OMP_FOR_GIMPLIFYING_P (for_stmt) = 1; /* Note that while technically the continue label is enabled too soon here, we should have already diagnosed invalid continues nested within statement expressions within the INIT, COND, or INCR expressions. */ cont_block = begin_bc_block (bc_continue); gimplify_and_add (for_stmt, &seq); stmt = gimple_seq_last_stmt (seq); if (gimple_code (stmt) == GIMPLE_OMP_FOR) gimple_omp_set_body (stmt, finish_bc_block (bc_continue, cont_block, gimple_omp_body (stmt))); else seq = finish_bc_block (bc_continue, cont_block, seq); gimple_seq_add_seq (pre_p, seq); OMP_FOR_GIMPLIFYING_P (for_stmt) = 0; return GS_ALL_DONE; }
static void adjust_return_value (basic_block bb, tree m, tree a) { tree retval; gimple ret_stmt = gimple_seq_last_stmt (bb_seq (bb)); gimple_stmt_iterator gsi = gsi_last_bb (bb); gcc_assert (gimple_code (ret_stmt) == GIMPLE_RETURN); retval = gimple_return_retval (ret_stmt); if (!retval || retval == error_mark_node) return; if (m) retval = adjust_return_value_with_ops (MULT_EXPR, "mul_tmp", m_acc, retval, gsi); if (a) retval = adjust_return_value_with_ops (PLUS_EXPR, "acc_tmp", a_acc, retval, gsi); gimple_return_set_retval (ret_stmt, retval); update_stmt (ret_stmt); }
bool gimple_seq_may_fallthru (gimple_seq seq) { return gimple_stmt_may_fallthru (gimple_seq_last_stmt (seq)); }