Fix PR43300: ICE in outof-ssa

Richard Guenther richard.guenther@gmail.com
Mon Mar 15 14:51:00 GMT 2010


On Mon, Mar 15, 2010 at 3:44 PM, Michael Matz <matz@suse.de> wrote:
> Hi,
>
> If one constructs a testcase with vector types that actually aren't
> possible for the target (like 8 bytes in the original testcase, or 128
> bytes for all targets), for whatever mystic reasons one wants to do that,
> we currently ICE in outof-ssa if we also manage to have to emit copies on
> edges.  We need to deal with BLKmode entities, which this patch
> implements.
>
> This bootstrapped last week, but just to be sure regstrapping on current
> tree in progress (x86_64-linux, all+ada).  Okay if that passes?

Ok.

Thanks,
Richard.

>
> Ciao,
> Michael.
> --
>        PR middle-end/43300
>        * tree-outof-ssa.c (emit_partition_copy): New argument sizeexp,
>        use it to expand block copies.
>        (insert_partition_copy_on_edge, insert_rtx_to_part_on_edge,
>        insert_part_to_rtx_on_edge): Adjust callers of emit_partition_copy.
>        (insert_value_copy_on_edge): Use store_expr for BLKmode values.
>
> testsuite/
>        * gcc.dg/pr43300.c: New test.
>
> Index: tree-outof-ssa.c
> ===================================================================
> --- tree-outof-ssa.c    (revision 157339)
> +++ tree-outof-ssa.c    (working copy)
> @@ -140,10 +140,12 @@ set_location_for_edge (edge e)
>     }
>  }
>
> -/* Emit insns to copy SRC into DEST converting SRC if necessary.  */
> +/* Emit insns to copy SRC into DEST converting SRC if necessary.  As
> +   SRC/DEST might be BLKmode memory locations SIZEEXP is a tree from
> +   which we deduce the size to copy in that case.  */
>
>  static inline rtx
> -emit_partition_copy (rtx dest, rtx src, int unsignedsrcp)
> +emit_partition_copy (rtx dest, rtx src, int unsignedsrcp, tree sizeexp)
>  {
>   rtx seq;
>
> @@ -151,7 +153,13 @@ emit_partition_copy (rtx dest, rtx src,
>
>   if (GET_MODE (src) != VOIDmode && GET_MODE (src) != GET_MODE (dest))
>     src = convert_to_mode (GET_MODE (dest), src, unsignedsrcp);
> -  emit_move_insn (dest, src);
> +  if (GET_MODE (src) == BLKmode)
> +    {
> +      gcc_assert (GET_MODE (dest) == BLKmode);
> +      emit_block_move (dest, src, expr_size (sizeexp), BLOCK_OP_NORMAL);
> +    }
> +  else
> +    emit_move_insn (dest, src);
>
>   seq = get_insns ();
>   end_sequence ();
> @@ -164,6 +172,7 @@ emit_partition_copy (rtx dest, rtx src,
>  static void
>  insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus)
>  {
> +  tree var;
>   rtx seq;
>   if (dump_file && (dump_flags & TDF_DETAILS))
>     {
> @@ -183,10 +192,11 @@ insert_partition_copy_on_edge (edge e, i
>   if (locus)
>     set_curr_insn_source_location (locus);
>
> +  var = partition_to_var (SA.map, src);
>   seq = emit_partition_copy (SA.partition_to_pseudo[dest],
>                             SA.partition_to_pseudo[src],
> -                            TYPE_UNSIGNED (TREE_TYPE (
> -                              partition_to_var (SA.map, src))));
> +                            TYPE_UNSIGNED (TREE_TYPE (var)),
> +                            var);
>
>   insert_insn_on_edge (seq, e);
>  }
> @@ -232,6 +242,11 @@ insert_value_copy_on_edge (edge e, int d
>       x = expand_expr (src, NULL, src_mode, EXPAND_NORMAL);
>       x = convert_modes (dest_mode, src_mode, x, unsignedp);
>     }
> +  else if (src_mode == BLKmode)
> +    {
> +      x = SA.partition_to_pseudo[dest];
> +      store_expr (src, x, 0, false);
> +    }
>   else
>     x = expand_expr (src, SA.partition_to_pseudo[dest],
>                     dest_mode, EXPAND_NORMAL);
> @@ -269,9 +284,13 @@ insert_rtx_to_part_on_edge (edge e, int
>   if (locus)
>     set_curr_insn_source_location (locus);
>
> +  /* We give the destination as sizeexp in case src/dest are BLKmode
> +     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],
> -                            src,
> -                            unsignedsrcp);
> +                            src, unsignedsrcp,
> +                            partition_to_var (SA.map, dest));
>
>   insert_insn_on_edge (seq, e);
>  }
> @@ -282,6 +301,7 @@ insert_rtx_to_part_on_edge (edge e, int
>  static void
>  insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus)
>  {
> +  tree var;
>   rtx seq;
>   if (dump_file && (dump_flags & TDF_DETAILS))
>     {
> @@ -300,10 +320,11 @@ insert_part_to_rtx_on_edge (edge e, rtx
>   if (locus)
>     set_curr_insn_source_location (locus);
>
> +  var = partition_to_var (SA.map, src);
>   seq = emit_partition_copy (dest,
>                             SA.partition_to_pseudo[src],
> -                            TYPE_UNSIGNED (TREE_TYPE (
> -                              partition_to_var (SA.map, src))));
> +                            TYPE_UNSIGNED (TREE_TYPE (var)),
> +                            var);
>
>   insert_insn_on_edge (seq, e);
>  }
> Index: testsuite/gcc.dg/pr43300.c
> ===================================================================
> --- testsuite/gcc.dg/pr43300.c  (revision 0)
> +++ testsuite/gcc.dg/pr43300.c  (revision 0)
> @@ -0,0 +1,17 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Os" } */
> +typedef float V2SF __attribute__ ((vector_size (128)));
> +
> +V2SF
> +foo (int x, V2SF a)
> +{
> +  V2SF b;
> +  if (x & 42)
> +    b = a;
> +  else
> +    b = a + (V2SF) {1.0f/0.0f - 1.0f/0.0f, 1.0f/0.0f - 1.0f/0.0f};
> +  while (x--)
> +    a += b;
> +
> +  return a;
> +}
>



More information about the Gcc-patches mailing list