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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hubicka at gcc dot gnu.org,
                   |                            |jakub at gcc dot gnu.org

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Testcase without headers:

struct T {
  int val;
  explicit constexpr operator int() const { return val; }
  constexpr T(long v):val(v){}
  void operator*=(T m) {
    if(__builtin_constant_p(m.val)){
      __builtin_printf ("normal\n");
      return;
    }else if(__builtin_constant_p(val)){
      __builtin_printf ("recursive\n");
      return;
    }else{
      __builtin_printf ("return\n");
      return;
    }
  }
};


int main(){
  T constexpr step=610334368;
  T value=1;
  for(int _=0; _<100; ++_){
    __builtin_printf ("%d %d\n", (int) value, (int) step);
    value*=step;
    __builtin_printf ("%d %d\n", (int) value, (int) step);
  }
}

Bet yet another IPA/inlining bug, like e.g. PR98834, the __builtin_unreachable
call is added during inlining:
Introduced new external node (void __builtin_unreachable()/11).

Reply via email to