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

            Bug ID: 72835
           Summary: [Regression 7] Incorrect arithmetic optimization
                    involving bitfield arguments
           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: ---

Created attachment 39074
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=39074&action=edit
reproducer

-O0 and -O2 produce different results, while the test doesn't contain undefined
behavior.

> g++ -O0 bit_field_math.cpp ; ./a.out
4098873984
> g++ -O2 bit_field_math.cpp ; ./a.out
0
> g++ --version
gcc (Revision=238966/svn-rev:238969/) 7.0.0 20160801 (experimental)

GCC version 6 works correctly.

The test case is attached.

One thing that might look suspicious in the test is negation of unsigned int.
But it's well defined in the standard (same bit pattern as if it's signed, but
the result is treated as unsigned).

Reply via email to