This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [tree-ssa] tree-ssa-dom.c: Fix PR 14303.


Hi Jeff,

> real_compare (GE_EXPR, TREE_REAL_CST (op1), dconst0)

You meant LE_EXPR, I think.

>  > One thing I am worried about is that no part of tree-ssa-dom.c has an
>  > expression transformation as bold as my patch.
> I'm not exactly sure what you mean by that.  

I meant that most (some?) parts of tree-ssa-dom.c create a dummy tree
node call fold, whereas my patch explicitly transforms an expression
on site.

>  > Should I build a dummy tree node and have fold() fold it?
> That should not be necessary.

OK.

Tested on h8300-elf.  OK to apply?

Kazu Hirata

2004-03-11  Kazu Hirata  <kazu@cs.umass.edu>

	PR optimization/14303
	* tree-ssa-dom.c (simplify_cond_and_lookup_avail_expr): Fold
	abs (x) < (positive real value) into false.

2004-03-11  Kazu Hirata  <kazu@cs.umass.edu>

	PR optimization/14303
	* gcc.c-torture/execute/20020720-1.x: Remove.

Index: tree-ssa-dom.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/tree-ssa-dom.c,v
retrieving revision 1.1.2.146
diff -u -r1.1.2.146 tree-ssa-dom.c
--- tree-ssa-dom.c	8 Mar 2004 02:07:31 -0000	1.1.2.146
+++ tree-ssa-dom.c	11 Mar 2004 03:39:32 -0000
@@ -1959,6 +1959,19 @@
 		}
 	    }
 
+	  /* abs (x) < CST is always false if CST is less than or
+	     equal to 0.0.  */
+	  if (TREE_CODE (cond) == LT_EXPR
+	      && TREE_CODE (op1) == REAL_CST
+	      && real_compare (LE_EXPR, &TREE_REAL_CST (op1), &dconst0))
+	    {
+	      tree def = SSA_NAME_DEF_STMT (op0);
+
+	      if (TREE_CODE (def) == MODIFY_EXPR
+		  && TREE_CODE (TREE_OPERAND (def, 1)) == ABS_EXPR)
+		return boolean_false_node;
+	    }
+
 	  /* Consult the value range records for this variable (if they exist)
 	     to see if we can eliminate or simplify this conditional. 
 
Index: 20020720-1.x
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/gcc.c-torture/execute/20020720-1.x,v
retrieving revision 1.1.2.9
diff -u -r1.1.2.9 20020720-1.x
--- 20020720-1.x	2 Mar 2004 18:43:20 -0000	1.1.2.9
+++ 20020720-1.x	11 Mar 2004 19:24:52 -0000
@@ -1,38 +0,0 @@
-# The following targets fail 20020720-1.c for several reasons:
-# (1) They implement floating point instructions via software, or
-# (2) The "abs(x) < 0.0" comparison is split up in too many intermediate
-#     insns for combine to handle -- it can handle max three insns
-#     simultaneously.  For example, for RISCy machines it is common that 1
-#     insn performs abs, 1 insn loads 0.0, 1 insn sets CCmode flags based
-#     upon the FP comparison, and a 4th insn makes a conditional branch
-#     based upon the appropriate bits in the flags.  On the other hand, if
-#     for example the comparison insn takes 0.0 as an operand, the
-#     combiner is able to see all intermediate instructions simultaneously
-#     and can make the optimization.
-
-# Don't XFAIL at -O0, that should never fail.
-if { [istarget "sparc*-*-*"] } {
-    set torture_eval_before_compile {
-        global compiler_conditional_xfail_data
-        set compiler_conditional_xfail_data {
-            "PR opt/10348" \
-            { "*-*-*" } \
-            { "-fpic" "-fPIC" } \
-            { "-O0" }
-        }
-    }
-    return 0
-}
-
-set torture_eval_before_compile {
-    global compiler_conditional_xfail_data
-    set compiler_conditional_xfail_data {
-        "This test fails to optimize completely on certain platforms." \
-        { "xtensa-*-*" "sh-*-*" "arm*-*-*" "strongarm*-*-*" "xscale*-*-*" \
-	  "h8300*-*-*" "cris-*-*" "frv-*-*" } \
-        { "*" } \
-        { "-O0" }
-    }
-}
-
-return 0


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]