Index: ChangeLog.cilkplus =================================================================== --- ChangeLog.cilkplus (revision 194483) +++ ChangeLog.cilkplus (working copy) @@ -1,3 +1,17 @@ +2012-12-13 Balaji V. Iyer + + * tree-vect-loop.c (vect_determine_vectorization_factor): Added a + check if assert is requested in simd pragma. + (vect_analyze_loop_form): Likewise. + (vect_analyze_loop_operations): Likewise. + (vect_analyze_loop): Likewise. + * tree-cfgcleanup.c (remove_forwarder_block): Copied the pragma + simd struct index from the removed bb to the destination basic block. + * cfgloop.c (flow_loops_find): Added flag_enable_cilk check. + * tree-cfg.c (gimple_merge_blocks): Copied the pragma simd struct + index from the source to destination. + (remove_bb): Likewise. + 2012-12-12 Balaji V. Iyer * c/c-objc-common.h (LANG_HOOKS_CILK_CHECK_CTRL_FLOW): New define. Index: tree-vect-loop.c =================================================================== --- tree-vect-loop.c (revision 194483) +++ tree-vect-loop.c (working copy) @@ -234,8 +234,8 @@ if (flag_enable_cilk && pragma_simd_assert_requested_p (loop->pragma_simd_index)) { - error ("Loop not vectorized. " - "Exiting as requested by Pragma SIMD"); + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); } return false; } @@ -412,8 +412,8 @@ if (flag_enable_cilk && pragma_simd_assert_requested_p (loop->pragma_simd_index)) { - error ("Loop not vectorized. " - "Exiting as requested by PRAGMA SIMD"); + fatal_error ("Loop not vectorized. " + "Exiting as requested by PRAGMA SIMD"); } return false; } @@ -429,8 +429,8 @@ if (flag_enable_cilk && pragma_simd_assert_requested_p (loop->pragma_simd_index)) { - error ("Loop not vectorized. " - "Exiting as requested by PRAGMA SIMD"); + fatal_error ("Loop not vectorized. " + "Exiting as requested by PRAGMA SIMD"); } return false; } @@ -470,8 +470,8 @@ if (flag_enable_cilk && pragma_simd_assert_requested_p (loop->pragma_simd_index)) { - error ("Loop not vectorized. " - "Exiting as requested by PRAGMA SIMD"); + fatal_error ("Loop not vectorized. " + "Exiting as requested by PRAGMA SIMD"); } return false; } @@ -518,8 +518,8 @@ if (flag_enable_cilk && pragma_simd_assert_requested_p (loop->pragma_simd_index)) { - error ("Loop not vectorized. " - "Exiting as requested by PRAGMA SIMD"); + fatal_error ("Loop not vectorized. " + "Exiting as requested by PRAGMA SIMD"); } return false; } @@ -541,8 +541,8 @@ if (flag_enable_cilk && pragma_simd_assert_requested_p (loop->pragma_simd_index)) { - error ("Loop not vectorized. " - "Exiting as requested by PRAGMA SIMD"); + fatal_error ("Loop not vectorized. " + "Exiting as requested by PRAGMA SIMD"); } return false; } @@ -607,8 +607,8 @@ if (flag_enable_cilk && pragma_simd_assert_requested_p (loop->pragma_simd_index)) { - error ("Loop not vectorized. " - "Exiting as requested by Pragma SIMD"); + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); } return false; } @@ -1188,18 +1188,26 @@ { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "not vectorized: control flow in loop."); + "not vectorized: control flow in loop."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return NULL; } if (empty_block_p (loop->header)) - { + { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: empty loop."); - return NULL; + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); + return NULL; + } } - } else { struct loop *innerloop = loop->inner; @@ -1227,6 +1235,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: multiple nested loops."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return NULL; } @@ -1237,6 +1249,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: Bad inner loop."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return NULL; } @@ -1246,6 +1262,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: inner-loop count not invariant."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); destroy_loop_vec_info (inner_loop_vinfo, true); return NULL; } @@ -1255,6 +1275,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: control flow in loop."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); destroy_loop_vec_info (inner_loop_vinfo, true); return NULL; } @@ -1271,6 +1295,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: unsupported outerloop form."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); destroy_loop_vec_info (inner_loop_vinfo, true); return NULL; } @@ -1286,11 +1314,21 @@ if (dump_enabled_p ()) { if (!single_exit (loop)) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "not vectorized: multiple exits."); + { + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "not vectorized: multiple exits."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); + } else if (EDGE_COUNT (loop->header->preds) != 2) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: too many incoming edges."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); } if (inner_loop_vinfo) destroy_loop_vec_info (inner_loop_vinfo, true); @@ -1307,6 +1345,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: unexpected loop form."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); if (inner_loop_vinfo) destroy_loop_vec_info (inner_loop_vinfo, true); return NULL; @@ -1327,6 +1369,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: abnormal loop exit edge."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); if (inner_loop_vinfo) destroy_loop_vec_info (inner_loop_vinfo, true); return NULL; @@ -1339,6 +1385,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: complicated exit condition."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); if (inner_loop_vinfo) destroy_loop_vec_info (inner_loop_vinfo, true); return NULL; @@ -1350,6 +1400,10 @@ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: number of iterations cannot be " "computed."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); if (inner_loop_vinfo) destroy_loop_vec_info (inner_loop_vinfo, true); return NULL; @@ -1379,6 +1433,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: number of iterations = 0."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); if (inner_loop_vinfo) destroy_loop_vec_info (inner_loop_vinfo, false); return NULL; @@ -1540,6 +1598,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: value used after loop."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return false; } @@ -1550,6 +1612,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: scalar dependence cycle."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return false; } @@ -1568,6 +1634,10 @@ "not vectorized: relevant phi not " "supported: "); dump_gimple_stmt (MSG_MISSED_OPTIMIZATION, TDF_SLIM, phi, 0); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); } return false; } @@ -1595,6 +1665,10 @@ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: redundant loop. no profit to " "vectorize."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return false; } @@ -1616,6 +1690,10 @@ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: iteration count smaller than " "vectorization factor."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return false; } @@ -1638,6 +1716,10 @@ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: vector version will never be " "profitable."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return false; } @@ -1665,6 +1747,10 @@ "not vectorized: iteration count smaller than user " "specified loop bound parameter or minimum profitable " "iterations (whichever is more conservative)."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return false; } @@ -1682,6 +1768,10 @@ "than specified loop bound parameter or minimum " "profitable iterations (whichever is more " "conservative)."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return false; } @@ -1696,6 +1786,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: can't create epilog loop 1."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return false; } if (!slpeel_can_duplicate_loop_p (loop, single_exit (loop))) @@ -1703,6 +1797,10 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "not vectorized: can't create epilog loop 2."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); return false; } } @@ -1735,7 +1833,7 @@ { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "bad data references."); + "bad data references."); return false; } @@ -1903,6 +2001,13 @@ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "bad loop form."); + if (flag_enable_cilk && pragma_simd_assert_requested_p + (loop->pragma_simd_index)) + { + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); + } + return NULL; } @@ -1918,8 +2023,13 @@ vector_sizes &= ~current_vector_size; if (vector_sizes == 0 || current_vector_size == 0) - return NULL; - + { + if (flag_enable_cilk + && pragma_simd_assert_requested_p (loop->pragma_simd_index)) + fatal_error ("Loop not vectorized. " + "Exiting as requested by Pragma SIMD"); + return NULL; + } /* Try the next biggest vector size. */ current_vector_size = 1 << floor_log2 (vector_sizes); if (dump_enabled_p ()) Index: tree-cfgcleanup.c =================================================================== --- tree-cfgcleanup.c (revision 194483) +++ tree-cfgcleanup.c (working copy) @@ -346,6 +346,11 @@ if (dest == bb) return false; + if (flag_enable_cilk && bb->pragma_simd_index != 0 + && (dest->pragma_simd_index == 0 + || dest->pragma_simd_index == INVALID_PRAGMA_SIMD_SLOT)) + dest->pragma_simd_index = bb->pragma_simd_index; + /* If the destination block consists of a nonlocal label or is a EH landing pad, do not merge it. */ label = first_stmt (dest); Index: cfgloop.c =================================================================== --- cfgloop.c (revision 194483) +++ cfgloop.c (working copy) @@ -423,8 +423,11 @@ bitmap_set_bit (headers, header->index); /* Here we are going to copy the pragma simd value from the latch to the header. */ - if ((header->pragma_simd_index == 0) - && (latch->pragma_simd_index != 0)) + if (flag_enable_cilk + && (header->pragma_simd_index == 0 + || header->pragma_simd_index == INVALID_PRAGMA_SIMD_SLOT) + && (latch->pragma_simd_index != 0 + || latch->pragma_simd_index != INVALID_PRAGMA_SIMD_SLOT)) header->pragma_simd_index = latch->pragma_simd_index; num_loops++; } @@ -466,7 +469,8 @@ loop->header = header; loop->num = num_loops; - loop->pragma_simd_index = header->pragma_simd_index; + if (flag_enable_cilk) + loop->pragma_simd_index = header->pragma_simd_index; num_loops++; Index: tree-cfg.c =================================================================== --- tree-cfg.c (revision 194483) +++ tree-cfg.c (working copy) @@ -1631,6 +1631,11 @@ if (dump_file) fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index); + if (flag_enable_cilk && b->pragma_simd_index != 0 + && (a->pragma_simd_index == 0 + || a->pragma_simd_index == INVALID_PRAGMA_SIMD_SLOT)) + a->pragma_simd_index = b->pragma_simd_index; + /* Remove all single-valued PHI nodes from block B of the form V_i = PHI by propagating V_j to all the uses of V_i. */ gsi = gsi_last_bb (a); @@ -1897,7 +1902,11 @@ remove_phi_nodes_and_edges_for_unreachable_block (bb); bb->il.gimple.seq = NULL; bb->il.gimple.phi_nodes = NULL; - bb->next_bb->pragma_simd_index = bb->pragma_simd_index; + if (flag_enable_cilk + && bb->next_bb->pragma_simd_index == 0 + && bb->pragma_simd_index != 0 + && bb->pragma_simd_index != INVALID_PRAGMA_SIMD_SLOT) + bb->next_bb->pragma_simd_index = bb->pragma_simd_index; }