On Wed, Oct 14, 2015 at 1:23 PM, Kyrill Tkachov <kyrylo.tkac...@arm.com> wrote: > Hi all, > > This patch fixes the referenced PR by rewriting the > vfp3_const_double_for_bits function in arm.c > The function is supposed to accept positive CONST_DOUBLE rtxes whose value > is an exact power of 2 > and whose log2 is between 1 and 32. That is values like 2.0, 4.0, 8.9, 16.0 > etc... > > The current implementation seems to have been written under the assumption > that exact_real_truncate returns > false if the input value is not an exact integer, whereas in fact > exact_real_truncate returns false if the > truncation operation was not exact, which are different things. This would > lead the function to accept any > CONST_DOUBLE that can truncate to a power of 2, such as 4.9, 16.2 etc. > > In any case, I've rewritten this function and used the real_isinteger > predicate to check if the real value > is an exact integer. > > The testcase demonstrates the kind of wrong code that this patch addresses. > > This bug appears on GCC 5 and 4.9 as well, but due to the recent > introduction of CONST_DOUBLE_REAL_VALUE > this patch doesn't apply on those branches. I will soon post the > backportable variant. > > Bootstrapped and tested on arm-none-linux-gnueabihf. > > Ok for trunk?
Thanks, this is OK for trunk and all release branches. Ramana > > Thanks, > Kyrill > > 2015-10-12 Kyrylo Tkachov <kyrylo.tkac...@arm.com> > > PR target/67929 > * config/arm/arm.c (vfp3_const_double_for_bits): Rewrite. > * config/arm/constraints.md (Dp): Update callsite. > * config/arm/predicates.md (const_double_vcvt_power_of_two): Likewise. > > 2015-10-12 Kyrylo Tkachov <kyrylo.tkac...@arm.com> > > PR target/67929 > * gcc.target/arm/pr67929_1.c: New test.