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); +}