Commit 02b278a8 by Richard Sandiford Committed by Richard Sandiford

re PR middle-end/61919 (FAIL: gfortran.dg/fmt_g0_6.f08 -O2 execution test)

gcc/
	PR middle-end/61919
	* tree-outof-ssa.c (insert_partition_copy_on_edge)
	(insert_value_copy_on_edge, insert_rtx_to_part_on_edge)
	(insert_part_to_rtx_on_edge): Copy partition_to_pseudo rtxes before
	inserting them in the insn stream.

From-SVN: r213116
parent 55c0d5df
2014-07-28 Richard Sandiford <rdsandiford@googlemail.com>
PR middle-end/61919
* tree-outof-ssa.c (insert_partition_copy_on_edge)
(insert_value_copy_on_edge, insert_rtx_to_part_on_edge)
(insert_part_to_rtx_on_edge): Copy partition_to_pseudo rtxes before
inserting them in the insn stream.
2014-07-28 Marek Polacek <polacek@redhat.com> 2014-07-28 Marek Polacek <polacek@redhat.com>
PR middle-end/61913 PR middle-end/61913
......
...@@ -260,8 +260,8 @@ insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus) ...@@ -260,8 +260,8 @@ insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus)
set_curr_insn_location (locus); set_curr_insn_location (locus);
var = partition_to_var (SA.map, src); var = partition_to_var (SA.map, src);
seq = emit_partition_copy (SA.partition_to_pseudo[dest], seq = emit_partition_copy (copy_rtx (SA.partition_to_pseudo[dest]),
SA.partition_to_pseudo[src], copy_rtx (SA.partition_to_pseudo[src]),
TYPE_UNSIGNED (TREE_TYPE (var)), TYPE_UNSIGNED (TREE_TYPE (var)),
var); var);
...@@ -274,7 +274,7 @@ insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus) ...@@ -274,7 +274,7 @@ insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus)
static void static void
insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus) insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
{ {
rtx seq, x; rtx dest_rtx, seq, x;
enum machine_mode dest_mode, src_mode; enum machine_mode dest_mode, src_mode;
int unsignedp; int unsignedp;
tree var; tree var;
...@@ -289,7 +289,8 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus) ...@@ -289,7 +289,8 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }
gcc_assert (SA.partition_to_pseudo[dest]); dest_rtx = copy_rtx (SA.partition_to_pseudo[dest]);
gcc_assert (dest_rtx);
set_location_for_edge (e); set_location_for_edge (e);
/* If a locus is provided, override the default. */ /* If a locus is provided, override the default. */
...@@ -300,9 +301,9 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus) ...@@ -300,9 +301,9 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
var = SSA_NAME_VAR (partition_to_var (SA.map, dest)); var = SSA_NAME_VAR (partition_to_var (SA.map, dest));
src_mode = TYPE_MODE (TREE_TYPE (src)); src_mode = TYPE_MODE (TREE_TYPE (src));
dest_mode = GET_MODE (SA.partition_to_pseudo[dest]); dest_mode = GET_MODE (dest_rtx);
gcc_assert (src_mode == TYPE_MODE (TREE_TYPE (var))); gcc_assert (src_mode == TYPE_MODE (TREE_TYPE (var)));
gcc_assert (!REG_P (SA.partition_to_pseudo[dest]) gcc_assert (!REG_P (dest_rtx)
|| dest_mode == promote_decl_mode (var, &unsignedp)); || dest_mode == promote_decl_mode (var, &unsignedp));
if (src_mode != dest_mode) if (src_mode != dest_mode)
...@@ -312,15 +313,14 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus) ...@@ -312,15 +313,14 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
} }
else if (src_mode == BLKmode) else if (src_mode == BLKmode)
{ {
x = SA.partition_to_pseudo[dest]; x = dest_rtx;
store_expr (src, x, 0, false); store_expr (src, x, 0, false);
} }
else else
x = expand_expr (src, SA.partition_to_pseudo[dest], x = expand_expr (src, dest_rtx, dest_mode, EXPAND_NORMAL);
dest_mode, EXPAND_NORMAL);
if (x != SA.partition_to_pseudo[dest]) if (x != dest_rtx)
emit_move_insn (SA.partition_to_pseudo[dest], x); emit_move_insn (dest_rtx, x);
seq = get_insns (); seq = get_insns ();
end_sequence (); end_sequence ();
...@@ -356,7 +356,7 @@ insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp, ...@@ -356,7 +356,7 @@ insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp,
mems. Usually we give the source. As we result from SSA names mems. Usually we give the source. As we result from SSA names
the left and right size should be the same (and no WITH_SIZE_EXPR the left and right size should be the same (and no WITH_SIZE_EXPR
involved), so it doesn't matter. */ involved), so it doesn't matter. */
seq = emit_partition_copy (SA.partition_to_pseudo[dest], seq = emit_partition_copy (copy_rtx (SA.partition_to_pseudo[dest]),
src, unsignedsrcp, src, unsignedsrcp,
partition_to_var (SA.map, dest)); partition_to_var (SA.map, dest));
...@@ -390,7 +390,7 @@ insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus) ...@@ -390,7 +390,7 @@ insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus)
var = partition_to_var (SA.map, src); var = partition_to_var (SA.map, src);
seq = emit_partition_copy (dest, seq = emit_partition_copy (dest,
SA.partition_to_pseudo[src], copy_rtx (SA.partition_to_pseudo[src]),
TYPE_UNSIGNED (TREE_TYPE (var)), TYPE_UNSIGNED (TREE_TYPE (var)),
var); var);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment