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

            Bug ID: 80093
           Summary: missed optimization opportunity with
                    std::uniform_int_distribution
           Product: gcc
           Version: 7.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: trashyankes at wp dot pl
  Target Milestone: ---

We have two functions:

```
#include <random>

int foo (std::mt19937* x)
{
  for (auto i = 0; i < 1'000'000'000; ++i)
  {
    std::uniform_int_distribution<int> y(0, 99);
    volatile auto r = y(*x);
  }
}

int bar (std::mt19937* x)
{
  std::uniform_int_distribution<int> y(0, 99);
  for (auto i = 0; i < 1'000'000'000; ++i)
  {
    volatile auto r = y(*x);
  }
}
```

https://godbolt.org/g/kiFC2a

Result is that `foo` is 10 time smaller than `bar`, as
`std::uniform_int_distribution` have only two fields that do not leak
references to some external code (at least I do not find that looking at src
code) and do not modify its values, this should behave same.


This behave like that from 4.8.1, before
`std::uniform_int_distribution::operator()` was not inlined and both functions
look same.

Reply via email to