Seen on Ubuntu Hardy using r142342. [EMAIL PROTECTED]:~/volatile/tmp73$ current-gcc -O2 -Wall small.c -o small [EMAIL PROTECTED]:~/volatile/tmp73$ ./small 0 [EMAIL PROTECTED]:~/volatile/tmp73$ current-gcc -O2 -ftrapv -Wall small.c -o small [EMAIL PROTECTED]:~/volatile/tmp73$ ./small 1 [EMAIL PROTECTED]:~/volatile/tmp73$ current-gcc -v Using built-in specs. Target: i686-pc-linux-gnu Configured with: ../configure --program-prefix=current- --enable-languages=c,c++ --prefix=/home/regehr : (reconfigured) ../configure --program-prefix=current- --enable-languages=c,c++ --prefix=/home/regehr : (reconfigured) ../configure --program-prefix=current- --enable-languages=c,c++ --prefix=/home/regehr : (reconfigured) ../configure --program-prefix=current- --prefix=/home/regehr --enable-languages=c,c++ --no-create --no-recursion Thread model: posix gcc version 4.4.0 20081202 (experimental) (GCC) [EMAIL PROTECTED]:~/volatile/tmp73$ cat small.c #include <stdio.h> #include <stdint.h>
static inline int16_t safe_mul_int16_t_s_s (int16_t si1, int16_t si2) { if (si1 > 0) { if (si2 > 0) { if (si1 > ((32767) / si2)) { return si1; } } else { if (si2 < ((-32767 - 1) / si1)) { return si1; } } } else { if (si2 > 0) { if (si1 < ((-32767 - 1) / si2)) { return si1; } } else { if ((si1 != 0) && (si2 < ((32767) / si1))) { return si1; } } } return si1 * si2; } static inline int8_t safe_sub_int8_t_s_s (int8_t si1, int8_t si2) { if (((si1 ^ si2) & (((si1 ^ ((si1 ^ si2) & (1 << (sizeof (int8_t) * 8 - 1)))) - si2) ^ si2)) < 0) { return si1; } return si1 - si2; } uint32_t g_38; int32_t func_53 (int32_t p_54, uint32_t p_55); int32_t func_53 (int32_t p_54, uint32_t p_55) { safe_mul_int16_t_s_s (1, 1); return 1; } int32_t func_97 (uint16_t p_99); int32_t func_97 (uint16_t p_99) { g_38 = p_99; return 1; } int32_t func_120 (int32_t p_124); int32_t func_120 (int32_t p_124) { if (safe_sub_int8_t_s_s (p_124, 1)) safe_mul_int16_t_s_s (1, func_97 (1)); return p_124; } int32_t func_14 (uint32_t p_16); int32_t func_14 (uint32_t p_16) { uint32_t l_438 = 0; func_97 (p_16 < (1 != func_120 (l_438))); return p_16; } int main (void) { func_14 (1); printf ("%d\n", g_38); return 0; } -- Summary: -ftrapv triggers integer miscompilation Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: regehr at cs dot utah dot edu GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38364