From: Richard Sandiford Date: Mon, 28 Jul 2014 08:41:34 +0000 (+0000) Subject: re PR middle-end/61919 (FAIL: gfortran.dg/fmt_g0_6.f08 -O2 execution test) X-Git-Tag: releases/gcc-5.1.0~6048 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=02b278a886da80a9432453993f5310cd760ca956;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ad6f4be3f12..56d3b250a031 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2014-07-28 Richard Sandiford + + 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 PR middle-end/61913 diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c index d5a635bc6233..88aff5ca554d 100644 --- a/gcc/tree-outof-ssa.c +++ b/gcc/tree-outof-ssa.c @@ -260,8 +260,8 @@ insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus) set_curr_insn_location (locus); var = partition_to_var (SA.map, src); - seq = emit_partition_copy (SA.partition_to_pseudo[dest], - SA.partition_to_pseudo[src], + seq = emit_partition_copy (copy_rtx (SA.partition_to_pseudo[dest]), + copy_rtx (SA.partition_to_pseudo[src]), TYPE_UNSIGNED (TREE_TYPE (var)), var); @@ -274,7 +274,7 @@ insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus) static void 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; int unsignedp; tree var; @@ -289,7 +289,8 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus) 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); /* 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) var = SSA_NAME_VAR (partition_to_var (SA.map, dest)); 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 (!REG_P (SA.partition_to_pseudo[dest]) + gcc_assert (!REG_P (dest_rtx) || dest_mode == promote_decl_mode (var, &unsignedp)); if (src_mode != dest_mode) @@ -312,15 +313,14 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus) } else if (src_mode == BLKmode) { - x = SA.partition_to_pseudo[dest]; + x = dest_rtx; store_expr (src, x, 0, false); } else - x = expand_expr (src, SA.partition_to_pseudo[dest], - dest_mode, EXPAND_NORMAL); + x = expand_expr (src, dest_rtx, dest_mode, EXPAND_NORMAL); - if (x != SA.partition_to_pseudo[dest]) - emit_move_insn (SA.partition_to_pseudo[dest], x); + if (x != dest_rtx) + emit_move_insn (dest_rtx, x); seq = get_insns (); end_sequence (); @@ -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 the left and right size should be the same (and no WITH_SIZE_EXPR 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, 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) var = partition_to_var (SA.map, src); seq = emit_partition_copy (dest, - SA.partition_to_pseudo[src], + copy_rtx (SA.partition_to_pseudo[src]), TYPE_UNSIGNED (TREE_TYPE (var)), var);