https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101256
--- Comment #4 from Martin Liška <marxin at gcc dot gnu.org> --- I managed reducing a test-case: $ cat driver.cpp #include <stdio.h> #include <cassert> template<class T> const T& max(const T& a, const T& b) { return (a < b) ? b : a; } signed char var_5 = -128; unsigned int var_11 = 2144479212U; unsigned long long int arr [22]; void __attribute__((noipa)) test(signed char var_5, unsigned var_11) { for (short i_61 = 0; i_61 < var_5 + 149; i_61 += 10000) arr[i_61] = max((signed char)0, var_5) ? max((signed char)1, var_5) : var_11; } int main() { for (size_t i_0 = 0; i_0 < 22; ++i_0) arr [i_0] = 11834725929543695741ULL; test(var_5, var_11); assert(arr [0] == 2144479212ULL || arr [0] == 11834725929543695741ULL); __builtin_printf ("OK\n"); } $ g++ driver.cpp -O2 && ./a.out a.out: driver.cpp:26: int main(): Assertion `arr [0] == 2144479212ULL || arr [0] == 11834725929543695741ULL' failed. Aborted (core dumped) $ g++ driver.cpp && ./a.out OK