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

            Bug ID: 73714
           Summary: [Regression 7] Incorrect unsigned long long arithmetic
                    optimization
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: babokin at gmail dot com
  Target Milestone: ---

Test case:
#include <iostream>

int var_s2 = 0;

int main () {
    unsigned long long a = 1ULL << (57 - var_s2);
    // result is truncated 0x3800000000000000ULL, it so should be 0. 
    int result = (int) (7679674331924488348ULL * a);

    std::cout<<result<<"\n";

    return 0;
}

O0 and O2 produce different results, while test case doesn't have undefined
behavior.

> g++ -O0 pr.cpp; ./a.out
0
> g++ -O2 pr.cpp; ./a.out
939524096

> g++ --version
g++ (Revision=239334/svn-rev:239337/) 7.0.0 20160810 (experimental)
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gcc 6.1.1 is fine ( (Revision=239178/svn-rev:239179/) 6.1.1 20160805)

Reply via email to