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).