[Bug c/90867] New: Multiplication or typecast of integer and double always zero when...

sven.schmidt@gmx-topmail.de gcc-bugzilla@gcc.gnu.org
Thu Jun 13 08:59:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90867

            Bug ID: 90867
           Summary: Multiplication or typecast of integer and double
                    always zero when...
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sven.schmidt@gmx-topmail.de
  Target Milestone: ---

Created attachment 46485
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46485&action=edit
Compiler output text

A multiplication of integer with double or a typecast of integer to double is
always zero when compiling with -march=native and the function is defined
"GENERIC" with "__attribute__ ((target ("arch=x86-64")))" or any other arch.

The bug occurs an all gcc 64-bit (x86-64) for Linux since gcc-6 I've tested.
Not affected is gcc 32-bit (i386) or other systems like gcc for mingw.

-----
#include <stdint.h>
#include <stdio.h>

/*
 * no opcode optimization allowed
 */
#if __i386__
# define GENERIC        __attribute__ ((target ("arch=i386")))
#else
# define GENERIC        __attribute__ ((target ("arch=x86-64")))
#endif

uint64_t freq = 3600000000UL;   /* 3.6 GHz = 3600.0 MHz */

GENERIC int main (void)
{
  printf("freq = %f Hz\n", (double)freq);
  printf("freq = %f kHz\n", 1e-3 * freq);
  printf("freq = %f MHz\n", 1e-6 * freq);
  printf("freq = %f GHz\n", 1e-9 * freq);

  return 0;
}
-----

Compile with: gcc -v -save-temps -Wall -Wextra -march=native test.c -o test

Result when running is:
-----
freq = 0.000000 Hz
freq = 0.000000 kHz
freq = 0.000000 MHz
freq = 0.000000 GHz
-----

Compiling same code with -m32... 

  gcc -m32 -v -save-temps -Wall -Wextra -march=native test.c -o test

...gives expected results:

-----
freq = 3600000000.000000 Hz
freq = 3600000.000000 kHz
freq = 3600.000000 MHz
freq = 3.600000 GHz
-----

gcc --version: gcc (Debian 8.3.0-6) 8.3.0

gcc compiles assembler code for the old FPU and there is a bug in machine code.
When compiling same code without architecture restrictions assembler code is
build for SSE unit without bug. 

Compiler output file is appended.

Best regards
Sven


More information about the Gcc-bugs mailing list