On 12/18/2011 05:21 AM, Eric Botcazou wrote:

OK everywhere without the cap and with the same test on ARG2:
If a testcase doesn't need fancy options, it must go in gcc.c-torture/compile.

OK.  I've checked in this version, which addresses both those issues.

-Sandra


2011-12-19  Sandra Loosemore  <san...@codesourcery.com>
            Tom de Vries <t...@codesourcery.com>

        PR rtl-opt/50380

        gcc/
        * cse.c (find_comparison_args): Detect fixed point and
        bail early.

        gcc/testsuite/
        * gcc.c-torture/compile/pr50380.c: New testcase.
Index: gcc/testsuite/gcc.c-torture/compile/pr50380.c
===================================================================
--- gcc/testsuite/gcc.c-torture/compile/pr50380.c	(revision 0)
+++ gcc/testsuite/gcc.c-torture/compile/pr50380.c	(revision 0)
@@ -0,0 +1,12 @@
+/* This test used to get stuck in an infinite loop in find_comparison_args
+   when compiling for MIPS at -O2.  */
+
+__attribute__ ((__noreturn__)) extern void fail (void);
+
+char x;
+
+void foo (const unsigned char y)
+{
+   ((void) (__builtin_expect((!! y == y), 1) ? 0 : (fail (), 0)));
+   x = ! y;
+}
Index: gcc/cse.c
===================================================================
--- gcc/cse.c	(revision 181994)
+++ gcc/cse.c	(working copy)
@@ -3055,6 +3055,12 @@ find_comparison_args (enum rtx_code code
 	  if (! exp_equiv_p (p->exp, p->exp, 1, false))
 	    continue;
 
+	  /* If it's the same comparison we're already looking at, skip it.  */
+	  if (COMPARISON_P (p->exp)
+	      && XEXP (p->exp, 0) == arg1
+	      && XEXP (p->exp, 1) == arg2)
+	    continue;
+
 	  if (GET_CODE (p->exp) == COMPARE
 	      /* Another possibility is that this machine has a compare insn
 		 that includes the comparison code.  In that case, ARG1 would

Reply via email to