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

            Bug ID: 84407
           Summary: incorrect constant propagation with -frounding-math
           Product: gcc
           Version: 7.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mikulas at artax dot karlin.mff.cuni.cz
  Target Milestone: ---

With -frounding-math, gcc should not do optimizations if the result is affected
by the rounding mode. But it still does some of them - it propagates constants
across integer-to-float conversions, despite the fact that these conversions
are affected by the rounding mode.

When this program is compiled with -O2 -frounding-math (on x86-64 linux), you
get:
7fffffffffffffff -> 8000000000000000
7fffffffffffffff -> 8000000000000000
7fffffffffffffff -> 8000000000000000
7fffffffffffffff -> 8000000000000000

With -O0 -frounding-math, you get:
7fffffffffffffff -> 8000000000000000
7fffffffffffffff -> 7ffffffffffffc00
7fffffffffffffff -> 8000000000000000
7fffffffffffffff -> 7ffffffffffffc00


#include <stdio.h>
#include <inttypes.h>
#include <fenv.h>

void print_val(uint64_t x)
{
        printf("%016"PRIx64"", x);
}

static void cnv_print(uint64_t x)
{
        double f = x;
        uint64_t y = f;
        print_val(x);
        printf(" -> ");
        print_val(y);
        printf("\n");
}

int main(void)
{
        fesetround(FE_TONEAREST);
        cnv_print(0x7fffffffffffffff);
        fesetround(FE_DOWNWARD);
        cnv_print(0x7fffffffffffffff);
        fesetround(FE_UPWARD);
        cnv_print(0x7fffffffffffffff);
        fesetround(FE_TOWARDZERO);
        cnv_print(0x7fffffffffffffff);
        return 0;
}

Reply via email to