OSDN Git Service

fixed -ffinite-math-only A-A missing optimisation
authorchrbr <chrbr@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Aug 2007 14:38:16 +0000 (14:38 +0000)
committerchrbr <chrbr@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Aug 2007 14:38:16 +0000 (14:38 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127705 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fold-sub.c [new file with mode: 0644]

index f81021a..8845523 100644 (file)
@@ -1,3 +1,9 @@
+2007-02-16  Christian Bruel  <christian.bruel@st.com>  
+            Richard Guenther <rguenther@suse.de>
+       
+       * fold-const.c (fold_binary): Optimize A-A if -ffinite-math-only.
+       * simplify_rtx (simplify_binary_operation_1): Likewise.
+               
 2007-08-22  Rask Ingemann Lambertsen  <rask@sygehus.dk>
 
        PR rtl-optimization/32557
 2007-08-22  Rask Ingemann Lambertsen  <rask@sygehus.dk>
 
        PR rtl-optimization/32557
index 7718759..ed05f1f 100644 (file)
@@ -10149,10 +10149,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
         Also note that operand_equal_p is always false if an operand
         is volatile.  */
 
         Also note that operand_equal_p is always false if an operand
         is volatile.  */
 
-      if ((! FLOAT_TYPE_P (type)
-          || (flag_unsafe_math_optimizations
-              && !HONOR_NANS (TYPE_MODE (type))
-              && !HONOR_INFINITIES (TYPE_MODE (type))))
+      if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
          && operand_equal_p (arg0, arg1, 0))
        return fold_convert (type, integer_zero_node);
 
          && operand_equal_p (arg0, arg1, 0))
        return fold_convert (type, integer_zero_node);
 
index 1acb34c..d9cf023 100644 (file)
@@ -1769,14 +1769,10 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
     case MINUS:
       /* We can't assume x-x is 0 even with non-IEEE floating point,
         but since it is zero except in very strange circumstances, we
     case MINUS:
       /* We can't assume x-x is 0 even with non-IEEE floating point,
         but since it is zero except in very strange circumstances, we
-        will treat it as zero with -funsafe-math-optimizations and
-        -ffinite-math-only.  */
+        will treat it as zero with -ffinite-math-only.  */
       if (rtx_equal_p (trueop0, trueop1)
          && ! side_effects_p (op0)
       if (rtx_equal_p (trueop0, trueop1)
          && ! side_effects_p (op0)
-         && (! FLOAT_MODE_P (mode)
-             || (flag_unsafe_math_optimizations
-                 && !HONOR_NANS (mode)
-                 && !HONOR_INFINITIES (mode))))
+         && (!FLOAT_MODE_P (mode) || !HONOR_NANS (mode)))
        return CONST0_RTX (mode);
 
       /* Change subtraction from zero into negation.  (0 - x) is the
        return CONST0_RTX (mode);
 
       /* Change subtraction from zero into negation.  (0 - x) is the
index 02cc97c..6068fa9 100644 (file)
@@ -1,3 +1,7 @@
+2007-08-21  Christian Bruel  <christian.bruel@st.com>
+
+       * gcc.dg/fold-sub.c: New test.
+       
 2007-08-22  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.dg/20000724-1.c, gcc.dg/980312-1.c, gcc.dg/980313-1.c,
 2007-08-22  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.dg/20000724-1.c, gcc.dg/980312-1.c, gcc.dg/980313-1.c,
diff --git a/gcc/testsuite/gcc.dg/fold-sub.c b/gcc/testsuite/gcc.dg/fold-sub.c
new file mode 100644 (file)
index 0000000..28a8dd5
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-ffinite-math-only -fdump-tree-gimple" } */
+
+float f(float x)
+{
+  return x - x;
+}
+
+/* Substraction should be turned into 0.  */
+
+/* { dg-final { scan-tree-dump-not " - " "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */