From: Sebastian Pop Date: Wed, 11 Aug 2010 20:26:15 +0000 (+0000) Subject: Fix 416.gamess miscompile: special case the rewrite of degenerate phi nodes. X-Git-Tag: releases/gcc-4.6.0~5079 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3e7b889e56098e80f652bd792542f897b86d862;p=thirdparty%2Fgcc.git Fix 416.gamess miscompile: special case the rewrite of degenerate phi nodes. 2010-06-24 Sebastian Pop * graphite-sese-to-poly.c (rewrite_degenerate_phi): New. (rewrite_reductions_out_of_ssa): Call it for degenerate_phi_result. From-SVN: r163131 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e313596af8ce..5dd2b2090c35 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-08-02 Sebastian Pop + + * graphite-sese-to-poly.c (rewrite_degenerate_phi): New. + (rewrite_reductions_out_of_ssa): Call it for degenerate_phi_result. + 2010-08-02 Sebastian Pop * graphite-sese-to-poly.c (rewrite_cross_bb_phi_deps): Call diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite index ee63b7c979db..a488c399f9e8 100644 --- a/gcc/ChangeLog.graphite +++ b/gcc/ChangeLog.graphite @@ -1,3 +1,8 @@ +2010-06-24 Sebastian Pop + + * graphite-sese-to-poly.c (rewrite_degenerate_phi): New. + (rewrite_reductions_out_of_ssa): Call it for degenerate_phi_result. + 2010-06-24 Sebastian Pop * graphite-sese-to-poly.c (rewrite_cross_bb_phi_deps): Call diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 8857946d1eba..62064c4e63bd 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -2272,6 +2272,37 @@ rewrite_phi_out_of_ssa (gimple_stmt_iterator *psi) gsi_insert_seq_before (&gsi, stmts, GSI_NEW_STMT); } +/* Rewrite the degenerate phi node at position PSI from the degenerate + form "x = phi (y, y, ..., y)" to "x = y". */ + +static void +rewrite_degenerate_phi (gimple_stmt_iterator *psi) +{ + tree rhs; + gimple stmt; + gimple_stmt_iterator gsi; + gimple phi = gsi_stmt (*psi); + tree res = gimple_phi_result (phi); + basic_block bb; + + if (!is_gimple_reg (res)) + { + gsi_next (psi); + return; + } + + bb = gimple_bb (phi); + rhs = degenerate_phi_result (phi); + gcc_assert (rhs); + + stmt = gimple_build_assign (res, rhs); + remove_phi_node (psi, false); + SSA_NAME_DEF_STMT (res) = stmt; + + gsi = gsi_after_labels (bb); + gsi_insert_before (&gsi, stmt, GSI_NEW_STMT); +} + /* Rewrite out of SSA all the reduction phi nodes of SCOP. */ void @@ -2285,8 +2316,15 @@ rewrite_reductions_out_of_ssa (scop_p scop) if (bb_in_sese_p (bb, region)) for (psi = gsi_start_phis (bb); !gsi_end_p (psi);) { - if (scalar_close_phi_node_p (gsi_stmt (psi))) + gimple phi = gsi_stmt (psi); + + if (gimple_phi_num_args (phi) > 1 + && degenerate_phi_result (phi)) + rewrite_degenerate_phi (&psi); + + else if (scalar_close_phi_node_p (phi)) rewrite_close_phi_out_of_ssa (&psi); + else if (reduction_phi_p (region, &psi)) rewrite_phi_out_of_ssa (&psi); }