fold_plusminus_mult_expr does not fold int f6 (int a, int b) { return b * -2 + a * 6; } this blocks the fix for PR23295 because a fix for it makes the test for PR23294 fail.
I have a patch.
Subject: Bug 29548 Author: rguenth Date: Mon Oct 23 07:19:34 2006 New Revision: 117969 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=117969 Log: 2006-10-24 Richard Guenther <rguenther@suse.de> PR middle-end/27132 PR middle-end/23295 * builtins.c (fold_binary): Remove checks for flag_wrapv and flag_trapv where negate_expr_p covers these cases. * gcc.dg/pr27132.c: New testcase. * gcc.dg/pr23295.c: Likewise. * gcc.dg/tree-ssa/pr23294.c: Adjust patterns. * g++.dg/tree-ssa/pr19807.C: Likewise. 2006-10-23 Richard Guenther <rguenther@suse.de> PR middle-end/29548 * fold-const.c (fold_plusminus_mult_expr): Check exact power of two on the absolute value. (fold_binary): Fold x * -C to -x * C if x is easily negatable and negating -C does not overflow. Added: trunk/gcc/testsuite/gcc.dg/pr23295.c trunk/gcc/testsuite/gcc.dg/pr27132.c Modified: trunk/gcc/ChangeLog trunk/gcc/fold-const.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/g++.dg/tree-ssa/pr19807.C trunk/gcc/testsuite/gcc.dg/tree-ssa/pr23294.c
Fixed.