http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55481
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> 2012-11-27 11:02:39 UTC --- More reduced testcase, fails when compiled at -O2 with the C++ frontend, passes compiled with the C frontend ... typedef signed char int8_t; extern void abort (void); #define SIZE 13 double init_value = 1.0; int8_t data8[SIZE]; static inline int8_t __attribute__((always_inline)) do_shift(int8_t input) { return ((int8_t)(23) | (int8_t)(10)); } int main(int argc, char** argv) { int8_t *first = data8; int8_t *last = data8+SIZE; while (first != last) *first++ = (int8_t)(init_value); first = data8; int i; for(i = 0; i < 1000; ++i) { int8_t result = 0; int n; for (n = 0; n < SIZE; ++n) result += do_shift( first[n] ); int8_t temp = (int8_t)SIZE * do_shift((int8_t)init_value); if (result != temp) abort (); } return 0; }