http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49472
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ebotcazou at gcc dot | |gnu.org --- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-06-21 07:51:34 UTC --- --- gcc/simplify-rtx.c.jj 2011-06-08 08:53:15.000000000 +0200 +++ gcc/simplify-rtx.c 2011-06-21 09:46:27.000000000 +0200 @@ -686,13 +686,13 @@ simplify_unary_operation_1 (enum rtx_cod return simplify_gen_binary (MINUS, mode, temp, XEXP (op, 1)); } - /* (neg (mult A B)) becomes (mult (neg A) B). + /* (neg (mult A B)) becomes (mult A (neg B)). This works even for floating-point values. */ if (GET_CODE (op) == MULT && !HONOR_SIGN_DEPENDENT_ROUNDING (mode)) { - temp = simplify_gen_unary (NEG, mode, XEXP (op, 0), mode); - return simplify_gen_binary (MULT, mode, temp, XEXP (op, 1)); + temp = simplify_gen_unary (NEG, mode, XEXP (op, 1), mode); + return simplify_gen_binary (MULT, mode, XEXP (op, 0), temp); } /* NEG commutes with ASHIFT since it is multiplication. Only do stops the moving of the operands around, with this it keeps being called with the same operands again and again, but still an endless recursion. Eric, any preferences where to prevent this from happening?