regehr@john-home ~/z/reduce/r112 $ gcc -O0 small.c ; ./a.out 0 regehr@john-home ~/z/reduce/r112 $ gcc -O1 small.c ; ./a.out 1 regehr@john-home ~/z/reduce/r112 $ cat small.c int printf(const char *, ...); int x0, x1 = 1; int x2() { x1 = 0; return 0; } int main() { ((0 || x0) & x2() >= 0) <= 1 && 1; printf("%d\n", x1); return 0; } regehr@john-home ~/z/reduce/r112 $ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/home/regehr/z/compiler-install/gcc-r202470-install/libexec/gcc/x86_64-unknown-linux-gnu/4.9.0/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: /home/regehr/z/compiler-source/gcc/configure --prefix=/home/regehr/z/compiler-install/gcc-r202470-install --enable-languages=c,c++ --disable-multilib Thread model: posix gcc version 4.9.0 20130910 (experimental) (GCC)
Confirmed, already in 4.6. Somewhere in fold_range_test we forget to check for side effects.
Started with r145254.
Created attachment 30795 [details] gcc49-pr58385.patch Untested fix.
Author: jakub Date: Wed Sep 11 11:35:51 2013 New Revision: 202494 URL: http://gcc.gnu.org/viewcvs?rev=202494&root=gcc&view=rev Log: PR tree-optimization/58385 * fold-const.c (build_range_check): If both low and high are NULL, use omit_one_operand_loc to preserve exp side-effects. * gcc.c-torture/execute/pr58385.c: New test. Added: trunk/gcc/testsuite/gcc.c-torture/execute/pr58385.c Modified: trunk/gcc/ChangeLog trunk/gcc/fold-const.c trunk/gcc/testsuite/ChangeLog
Author: jakub Date: Wed Sep 11 12:17:47 2013 New Revision: 202495 URL: http://gcc.gnu.org/viewcvs?rev=202495&root=gcc&view=rev Log: PR tree-optimization/58385 * fold-const.c (build_range_check): If both low and high are NULL, use omit_one_operand_loc to preserve exp side-effects. * gcc.c-torture/execute/pr58385.c: New test. Added: branches/gcc-4_8-branch/gcc/testsuite/gcc.c-torture/execute/pr58385.c Modified: branches/gcc-4_8-branch/gcc/ChangeLog branches/gcc-4_8-branch/gcc/fold-const.c branches/gcc-4_8-branch/gcc/testsuite/ChangeLog
Fixed for 4.8.2+ so far.
Fixed for 4.8.2.