re PR middle-end/38751 (odd performance regression with -Os)
authorRichard Guenther <rguenther@suse.de>
Wed, 7 Jan 2009 10:53:30 +0000 (10:53 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 7 Jan 2009 10:53:30 +0000 (10:53 +0000)
2009-01-07  Richard Guenther  <rguenther@suse.de>

PR middle-end/38751
* fold-const.c (extract_muldiv): Remove obsolete comment.
(fold_plusminus_mult_expr): Undo MINUS_EXPR
to PLUS_EXPR canonicalization for the canonicalization.

From-SVN: r143152

gcc/ChangeLog
gcc/fold-const.c

index a8a606a496c8465d029c671ed370c1ee5b3e5ad1..8180411661a35b39d2350f39078f814945425e80 100644 (file)
@@ -1,3 +1,10 @@
+2009-01-07  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/38751
+       * fold-const.c (extract_muldiv): Remove obsolete comment.
+       (fold_plusminus_mult_expr): Undo MINUS_EXPR
+       to PLUS_EXPR canonicalization for the canonicalization.
+
 2009-01-07  Gerald Pfeifer  <gerald@pfeifer.com>
 
        * doc/install.texi (alpha*-dec-osf*): Remove note on 32-bit
index be542b773b2043fc4b56ce081de8025ba3936f9b..9b4106bd9e09893ec048537f9577d5b6cfa5ab94 100644 (file)
@@ -6008,10 +6008,6 @@ optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
    expression would not overflow or that overflow is undefined for the type
    in the language in question.
 
-   We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
-   the machine has a multiply-accumulate insn or that this is part of an
-   addressing calculation.
-
    If we return a non-null expression, it is an equivalent form of the
    original computation, but need not be in the original type.
 
@@ -7439,7 +7435,17 @@ fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
   else if (TREE_CODE (arg1) == INTEGER_CST)
     {
       arg10 = build_one_cst (type);
-      arg11 = arg1;
+      /* As we canonicalize A - 2 to A + -2 get rid of that sign for
+        the purpose of this canonicalization.  */
+      if (TREE_INT_CST_HIGH (arg1) == -1
+         && negate_expr_p (arg1)
+         && code == PLUS_EXPR)
+       {
+         arg11 = negate_expr (arg1);
+         code = MINUS_EXPR;
+       }
+      else
+       arg11 = arg1;
     }
   else
     {