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 lower_omp_directive (gimple_stmt_iterator *gsi, struct lower_data *data) { gimple stmt; stmt = gsi_stmt (*gsi); lower_sequence (gimple_omp_body_ptr (stmt), data); gsi_insert_seq_after (gsi, gimple_omp_body (stmt), GSI_CONTINUE_LINKING); gimple_omp_set_body (stmt, NULL); gsi_next (gsi); }