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