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

--- Comment #13 from Ivan Lazaric <ivan.lazaric.gcc at gmail dot com> ---
A couple additional examples:

```cpp
struct S {
  bool x;
  bool pred() { return x; }
};

struct T : S {};

void do_something();

// optimized into just `ret`
void foo_builtin(T& t) {
  if (t.pred()) __builtin_unreachable();
  if (t.pred()) do_something();
}

// fails to optimize
// optimizes if `S&` instead of `T&` parameter
// optimizes if `t.x` instead of `t.pred()`
void foo_attribute(T& t) {
  [[assume(!t.pred())]];
  if (t.pred()) do_something();
}
```

```cpp
using el = int;

struct S {
  el i;
  bool pred() { return i != 42; }
};

void do_something();

// optimizes to just `ret`
void foo_builtin(S& s) {
  if (s.pred()) __builtin_unreachable();
  if (s.pred()) do_something();
}

// fails to optimize
// optimizes if `int i;` in `S` instead of `el i;`
void foo_attribute(S& s) {
  [[assume(!s.pred())]];
  if (s.pred()) do_something();
}
```

Reply via email to