On Wed, Jul 13, 2011 at 1:28 AM, Richard Guenther <rguent...@suse.de> wrote:
> On Tue, 12 Jul 2011, Ulrich Weigand wrote:
>
>> Richard Guenther wrote:
>>
>> > 2011-07-11  Richard Guenther  <rguent...@suse.de>
>> >
>> >     * tree-vrp.c (simplify_conversion_using_ranges): Manually
>> >     translate the source value-range through the conversion chain.
>>
>> This causes a build failure in cachemgr.c on spu-elf.  A slightly
>> modified simplified test case also fails on i386-linux:
>>
>> void *
>> test (unsigned long long x, unsigned long long y)
>> {
>>   return (void *) (unsigned int) (x / y);
>> }
>>
>> compiled with -O2 results in:
>>
>> test.i: In function 'test':
>> test.i:3:1: error: invalid types in nop conversion
>> void *
>> long long unsigned int
>> D.1962_5 = (void *) D.1963_3;
>>
>> test.i:3:1: internal compiler error: verify_gimple failed
>>
>> Any thoughts?
>
> Fix in testing.
>
> Richard.
>
> 2011-07-13  Richard Guenther  <rguent...@suse.de>
>
>        * tree-vrp.c (simplify_conversion_using_ranges): Make sure
>        the final type is integral.
>
>        * gcc.dg/torture/20110713-1.c: New testcase.
>
> Index: gcc/tree-vrp.c
> ===================================================================
> --- gcc/tree-vrp.c      (revision 176224)
> +++ gcc/tree-vrp.c      (working copy)
> @@ -7353,6 +7353,8 @@ simplify_conversion_using_ranges (gimple
>   double_int innermin, innermax, middlemin, middlemax;
>
>   finaltype = TREE_TYPE (gimple_assign_lhs (stmt));
> +  if (!INTEGRAL_TYPE_P (finaltype))
> +    return false;
>   middleop = gimple_assign_rhs1 (stmt);
>   def_stmt = SSA_NAME_DEF_STMT (middleop);
>   if (!is_gimple_assign (def_stmt)
> Index: gcc/testsuite/gcc.dg/torture/20110713-1.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/torture/20110713-1.c   (revision 0)
> +++ gcc/testsuite/gcc.dg/torture/20110713-1.c   (revision 0)
> @@ -0,0 +1,8 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target ilp32 } */
> +
> +void *
> +test (unsigned long long x, unsigned long long y)
> +{
> +    return (void *) (unsigned int) (x / y);
> +}
>

This also fixed:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49731


-- 
H.J.

Reply via email to