From: Uros Bizjak Date: Fri, 19 Sep 2008 10:04:46 +0000 (+0200) Subject: re PR rtl-optimization/37544 (Conversion double -> unsigned long long -> unsigned... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=660b295ca90f4eb0915281635bdd1c3111459ffe;p=thirdparty%2Fgcc.git re PR rtl-optimization/37544 (Conversion double -> unsigned long long -> unsigned -> double gives wrong results) PR rtl-optimization/37544 * regrename.c (maybe_mode_change): Exit early when copy_mode is narrower than orig_mode and narrower than new_mode. testsuite/ChangeLog: PR rtl-optimization/37544 * gcc.dg/pr37544.c: New test. From-SVN: r140487 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7faf2a9ae212..3bf0db753337 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2008-09-19 Uros Bizjak + + Backport from mainline: + 2008-09-18 Uros Bizjak + + PR rtl-optimization/37544 + * regrename.c (maybe_mode_change): Exit early when copy_mode + is narrower than orig_mode and narrower than new_mode. + 2008-08-29 Uros Bizjak Backport from mainline: diff --git a/gcc/regrename.c b/gcc/regrename.c index f7b5a68da8cf..da8ca1ec1baf 100644 --- a/gcc/regrename.c +++ b/gcc/regrename.c @@ -1335,6 +1335,10 @@ maybe_mode_change (enum machine_mode orig_mode, enum machine_mode copy_mode, enum machine_mode new_mode, unsigned int regno, unsigned int copy_regno ATTRIBUTE_UNUSED) { + if (GET_MODE_SIZE (copy_mode) < GET_MODE_SIZE (orig_mode) + && GET_MODE_SIZE (copy_mode) < GET_MODE_SIZE (new_mode)) + return NULL_RTX; + if (orig_mode == new_mode) return gen_rtx_raw_REG (new_mode, regno); else if (mode_change_ok (orig_mode, new_mode, regno)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9581a72d6edb..cc306b59e0f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-09-19 Uros Bizjak + + Backport from mainline: + 2008-09-18 Uros Bizjak + + PR rtl-optimization/37544 + * gcc.dg/pr37544.c: New test. + 2008-08-29 Uros Bizjak Backport from mainline: diff --git a/gcc/testsuite/gcc.dg/pr37544.c b/gcc/testsuite/gcc.dg/pr37544.c new file mode 100644 index 000000000000..9dba8c4858dd --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr37544.c @@ -0,0 +1,38 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-options "-O2 -msse2 -mtune=nocona -mfpmath=387" { target { i?86-*-* x86_64-*-* } } } */ + +#ifdef __i386__ +#include "i386-cpuid.h" +#endif + +extern void abort (void); + +int main(void) +{ + double arr[1000]; + double a, b; + + int i; + +#ifdef __i386__ + unsigned long cpu_facilities; + + cpu_facilities = i386_cpuid_edx (); + + /* Run SSE2 test only if host has SSE2 support. */ + if (!(cpu_facilities & bit_SSE2)) + return 0; +#endif + + for (i = 0; i < 1000; i++) + arr[i] = 4294967296.0 + (double)i; + + a = arr[0]; + b = (unsigned int)((unsigned long long int)a % 4294967296ULL); + + if (b >= 4294967296.0) + abort (); + + return 0; +}