diff options
author | Richard Biener <rguenther@suse.de> | 2017-10-17 13:17:30 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-10-17 13:17:30 +0000 |
commit | 7ea3a3c75964dfef45eaa771fc914ec15a6aada9 (patch) | |
tree | 9cfe98c1013f2ad06a2f89e70d58aba168cde7f9 /gcc/graphite-isl-ast-to-gimple.c | |
parent | 933ab0e61c668a41bcd8f5ab7a8963481e7eb5ec (diff) | |
download | gcc-7ea3a3c75964dfef45eaa771fc914ec15a6aada9.zip gcc-7ea3a3c75964dfef45eaa771fc914ec15a6aada9.tar.gz gcc-7ea3a3c75964dfef45eaa771fc914ec15a6aada9.tar.bz2 |
re PR tree-optimization/82563 ([graphite] ICE in check_loop_closed_ssa_def, at tree-ssa-loop-manip.c:709)
2017-10-17 Richard Biener <rguenther@suse.de>
PR tree-optimization/82563
* graphite-isl-ast-to-gimple.c (generate_entry_out_of_ssa_copies):
New function.
(graphite_regenerate_ast_isl): Call it.
* graphite-scop-detection.c (build_scops): Remove entry edge split.
* gcc.dg/graphite/pr82563.c: New testcase.
From-SVN: r253809
Diffstat (limited to 'gcc/graphite-isl-ast-to-gimple.c')
-rw-r--r-- | gcc/graphite-isl-ast-to-gimple.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c index 2a583ab..959d31d 100644 --- a/gcc/graphite-isl-ast-to-gimple.c +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -1501,6 +1501,35 @@ copy_internal_parameters (sese_info_p region, sese_info_p to_region) } } +/* Generate out-of-SSA copies for the entry edge FALSE_ENTRY/TRUE_ENTRY + in REGION. */ + +static void +generate_entry_out_of_ssa_copies (edge false_entry, + edge true_entry, + sese_info_p region) +{ + gimple_stmt_iterator gsi_tgt = gsi_start_bb (true_entry->dest); + for (gphi_iterator psi = gsi_start_phis (false_entry->dest); + !gsi_end_p (psi); gsi_next (&psi)) + { + gphi *phi = psi.phi (); + tree res = gimple_phi_result (phi); + if (virtual_operand_p (res)) + continue; + /* When there's no out-of-SSA var registered do not bother + to create one. */ + vec <tree> *renames = region->rename_map->get (res); + if (! renames || renames->is_empty ()) + continue; + tree new_phi_def = (*renames)[0]; + gassign *ass = gimple_build_assign (new_phi_def, + PHI_ARG_DEF_FROM_EDGE (phi, + false_entry)); + gsi_insert_after (&gsi_tgt, ass, GSI_NEW_STMT); + } +} + /* GIMPLE Loop Generator: generates loops in GIMPLE form for the given SCOP. Return true if code generation succeeded. */ @@ -1548,6 +1577,9 @@ graphite_regenerate_ast_isl (scop_p scop) t.translate_isl_ast (context_loop, root_node, e, ip); if (! t.codegen_error_p ()) { + generate_entry_out_of_ssa_copies (if_region->false_region->region.entry, + if_region->true_region->region.entry, + region); sese_insert_phis_for_liveouts (region, if_region->region->region.exit->src, if_region->false_region->region.exit, |