Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
28528 Discussions

Incorrect loop iteration behavior in ifx compared to ifort

overanalytcl
New User
458 Views

Hello!

I am currently learning Fortran for Project Euler (ignore the quality of the code you'll about to see) and as such I have chosen Intel Fortran. I attached the code, as well as the CMakeLists.txt I used.

 

When I use ifort and gfortran, I get the right answer: 142913828922
But when I use ifx, the answer is... 0. It is displaying the `sum` variable, which was initialized with 2, so it's even more of a mystery.

 

I am considering this a bug in the compiler, and my theory is that the compiler optimized way too much of the loop, and I don't know why ifx in particular doesn't work, while ifort and gfortran do. I haven't (to my knowledge) enabled any optimizations and the same exact code works on other compilers.

 

System and compiler:

$ uname -a
Linux delphi 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
$ ifx -V
Intel(R) Fortran Compiler for applications running on Intel(R) 64, Version 2024.1.0 Build 20240308
Copyright (C) 1985-2024 Intel Corporation. All rights reserved
$ which ifx
/opt/intel/oneapi/compiler/2024.1/bin/ifx

If you need other info, let me know.

 

Regards,

Stefan.

0 Kudos
1 Solution
Xiaoping_D_Intel
Employee
256 Views

The program is missing a "mod" call:

is_prime = .not. btest(prime((x-1)/64 + 1), x / 2)

=>

is_prime = .not. btest(prime((x-1)/64 + 1), mod(x / 2,32))


The btest call must have a bit-index that is less than the integer bit-size. Otherwise the value is undefined. After adding the "mod" call the program can work correctly with ifx.


View solution in original post

0 Kudos
3 Replies
andrew_4619
Honored Contributor III
413 Views

I just ran that in IFX on windows and it gives 142913828922 with /Od and /O1 but with /O2 it gives zero. Optimiser bug.  

 

Xiaoping_D_Intel
Employee
380 Views

A bug report has been opened. We will fix it in the future product.


0 Kudos
Xiaoping_D_Intel
Employee
257 Views

The program is missing a "mod" call:

is_prime = .not. btest(prime((x-1)/64 + 1), x / 2)

=>

is_prime = .not. btest(prime((x-1)/64 + 1), mod(x / 2,32))


The btest call must have a bit-index that is less than the integer bit-size. Otherwise the value is undefined. After adding the "mod" call the program can work correctly with ifx.


0 Kudos
Reply