stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Martin Sebor <mse...@gmail.com>
Subject Re: Intel C++ bug reports?
Date Wed, 05 Sep 2012 01:25:24 GMT
On 09/04/2012 07:02 PM, Liviu Nicoara wrote:
> Hi guys,
>
> Does any of you know how to go about submitting an Intel compiler bug without a premier
support account?
>
> While configuring the library on my x86_64 machine, I ran into what appears to be a code
generation compiler bug which affects LIMITS.cpp test -- the test cycles ad infinitum because
of the incorrect test marked below:

I don't know if there's a way to submit it outside Premier but I
have an account and can submit bugs for us.

Looking at the test below, though, it depends on undefined behavior
(signed overflow) so there's no compiler bug. Making max volatile
fools icc just enough to produce the expected output (while still
relying on undefined behavior). It would be good to clean it up,
though. I think computing UINT_MAX instead and shifting it right
by the number of sign bits (i.e., 1) should work.

Martin

>
> $ uname -a; icpc -v; cat t.cpp; icpc t.cpp&&  ./a.out
> Linux behemoth 2.6.37.6 #3 SMP Sat Apr 9 22:49:32 CDT 2011 x86_64 AMD Opteron(tm) Processor
6134 AuthenticAMD GNU/Linux
> icpc version 12.1.5 (gcc version 4.5.2 compatibility)
> #include<stdio.h>
>
> volatile int zero  = 0;
> volatile int one   = zero + 1;
> volatile int two   = one + 1;
>
> template<  typename T>
> T test ()
> {
>      T max = T (one);
>
>      // Find largest in which multiplied by two results in a
>      // negative value
>
>      for (; T (max * two)>  max; max *= two) ;
>
>
>      //
>      // Perform a binary search variant for the maximum
>      //
>
>      T tmp = max / (two + two);
>
>      for (; tmp;) {
>          if (T (max + tmp)<  max) {         //<- fail
>              if (tmp>  T (two))
>                  tmp /= two;
>              else if (max<  T (max + one))
>                  tmp = one;
>              else
>                  break;
>          }
>          else
>              max += tmp;
>      }
>
>      return max;
> }
>
> int main ()
> {
>      printf ("INT_MAX : %x\n", test<  int>  ());
>      return 0;
> }
> ^C
> $
>
> which runs just fine with gcc:
>
> $ g++ t.cpp&&  ./a.out
> INT_MAX : 7fffffff
>
> Thanks!
>
> Liviu


Mime
View raw message