[Bug c++/99101] New: optimization bug with -ffinite-loops

251078896 at qq dot com gcc-bugzilla@gcc.gnu.org
Mon Feb 15 08:55:19 GMT 2021


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

            Bug ID: 99101
           Summary: optimization bug with -ffinite-loops
           Product: gcc
           Version: og10 (devel/omp/gcc-10)
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: 251078896 at qq dot com
  Target Milestone: ---

we have a reduced code to show this bug:

#include <iostream>

class CompactMD {
 public:
  void operator()() {
    while (true) {
      auto num_job = jobs_;
      for (auto i = 0; i < jobs_; i++) SendNextMd();
      jobs_ -= num_job;
    }
  }
  void SendNextMd() {
    if (at_eof_) return;
    if (read_finish_) {
      at_eof_ = true;
      std::cout << 1 << std::endl;
    }
  }

  bool read_finish_ = true;
  int jobs_{1};
  bool at_eof_{false};
};

int main() {
  CompactMD comp_md_;
  comp_md_();
  return 0;
}

The expected output is only one line of "1", after that the program should be
in a "while true" loop forever.
With O2 optimization level, the output are infinite lines of "1"s.

We can reproduce this in RedHat's devtoolset-10, and Ubuntu 20.10's bundled
gcc10. After some tests, I find this bug is related to -ffinite-loops

This bug cannot be reproduced with gcc9 or lower version.

btw, I cannot further simplify this code for now, any change to it the bug is
likely to be gone.


More information about the Gcc-bugs mailing list