[PATCH] Fix PR ipa/65318

Richard Biener richard.guenther@gmail.com
Thu Mar 5 18:27:00 GMT 2015


On March 5, 2015 7:08:16 PM CET, Jan Hubicka <hubicka@ucw.cz> wrote:
>Hi,
>this patch sovles the incorrect folding. The very same unification
>(ignoring
>signedness by checking that memory representation is the same) is done
>by
>constant pool.
>
>Some of the other uses of ctor_for_folding therefore already uses
>VIEW_CONVERT_EXPR, I suppose as a partial fix for past bugs. This
>particular
>case is handled by get_symbol_constant_value that does not VCE. Maybe
>we usually don't drop scalar constant to constant pool that often, so
>this
>did not show up.
>
>Attached is non-ICF testcase. It is bit questionable if we consider
>this to be
>valid, but it is better to be safe than sorry.  Mixing signed/unsigned
>may be
>more common with LTO.
>
>Bootstrap/regtest running in x86_64-linux, seems sane?
>
>Honza
>
>static short a __attribute__ ((alias ("c")));
>short b = -1;
>static unsigned short c = 0;
>
>int
>main ()
>{
>  if (a <= b)
>    return 1;
>  return 0;
>}
>
>
>	* gimple-fold.c (get_symbol_constant_value): Convert to symbol type.
>
>Index: gimple-fold.c
>===================================================================
>--- gimple-fold.c	(revision 221170)
>+++ gimple-fold.c	(working copy)
>@@ -263,7 +263,16 @@ get_symbol_constant_value (tree sym)
> 	{
> 	  val = canonicalize_constructor_val (unshare_expr (val), sym);
> 	  if (val && is_gimple_min_invariant (val))
>-	    return val;
>+	    {
>+              if (!useless_type_conversion_p (TREE_TYPE (sym),
>TREE_TYPE (val)))
>+		{
>+		  if (operand_equal_p (TYPE_SIZE (TREE_TYPE (sym)),
>+				       TYPE_SIZE (TREE_TYPE (val)), 0))
>+		    return NULL_TREE;

And no, I don't think this is sane.  Callers need to handle mismatches IIRC.

>+		  val = fold_unary (VIEW_CONVERT_EXPR, TREE_TYPE (sym), val);
>+		}
>+	      return val;
>+	    }
> 	  else
> 	    return NULL_TREE;
> 	}




More information about the Gcc-patches mailing list