Blame SOURCES/gcc34-rh207277.patch

6fdc0f
2006-12-08  Jakub Jelinek  <jakub@redhat.com>
6fdc0f
6fdc0f
	* g++.dg/opt/ifcvt1.C: New test.
6fdc0f
6fdc0f
2005-11-09  Eric Botcazou  <ebotcazou@adacore.com>
6fdc0f
6fdc0f
	* ifcvt.c (noce_get_alt_condition): Use prev_nonnote_insn.
6fdc0f
	(noce_try_abs): Negate if the comparison is reversed.
6fdc0f
	Look only one instruction backwards for a REG_EQUAL note.
6fdc0f
6fdc0f
	* gcc.dg/ifcvt-fabs-1.c: New test.
6fdc0f
6fdc0f
--- gcc/ifcvt.c.orig	2005-11-21 11:43:21.000000000 -0200
6fdc0f
+++ gcc/ifcvt.c	2006-10-26 02:21:07.000000000 -0300
6fdc0f
@@ -1406,7 +1406,7 @@ noce_get_alt_condition (struct noce_if_i
6fdc0f
       rtx prev_insn;
6fdc0f
 
6fdc0f
       /* First, look to see if we put a constant in a register.  */
6fdc0f
-      prev_insn = PREV_INSN (if_info->cond_earliest);
6fdc0f
+      prev_insn = prev_nonnote_insn (if_info->cond_earliest);
6fdc0f
       if (prev_insn
6fdc0f
 	  && INSN_P (prev_insn)
6fdc0f
 	  && GET_CODE (PATTERN (prev_insn)) == SET)
6fdc0f
@@ -1642,25 +1642,30 @@ noce_try_abs (struct noce_if_info *if_in
6fdc0f
   if (rtx_equal_p (XEXP (cond, 0), b))
6fdc0f
     c = XEXP (cond, 1);
6fdc0f
   else if (rtx_equal_p (XEXP (cond, 1), b))
6fdc0f
-    c = XEXP (cond, 0);
6fdc0f
+    {
6fdc0f
+      c = XEXP (cond, 0);
6fdc0f
+      negate = !negate;
6fdc0f
+    }
6fdc0f
   else
6fdc0f
     return FALSE;
6fdc0f
 
6fdc0f
-  /* Verify that C is zero.  Search backward through the block for
6fdc0f
-     a REG_EQUAL note if necessary.  */
6fdc0f
+  /* Verify that C is zero.  Search one step backward for a
6fdc0f
+     REG_EQUAL note or a simple source if necessary.  */
6fdc0f
   if (REG_P (c))
6fdc0f
     {
6fdc0f
-      rtx insn, note = NULL;
6fdc0f
-      for (insn = earliest;
6fdc0f
-	   insn != BB_HEAD (if_info->test_bb);
6fdc0f
-	   insn = PREV_INSN (insn))
6fdc0f
-	if (INSN_P (insn)
6fdc0f
-	    && ((note = find_reg_note (insn, REG_EQUAL, c))
6fdc0f
-		|| (note = find_reg_note (insn, REG_EQUIV, c))))
6fdc0f
-	  break;
6fdc0f
-      if (! note)
6fdc0f
+      rtx set, insn = prev_nonnote_insn (earliest);
6fdc0f
+      if (insn
6fdc0f
+	  && (set = single_set (insn))
6fdc0f
+	  && rtx_equal_p (SET_DEST (set), c))
6fdc0f
+	{
6fdc0f
+	  rtx note = find_reg_equal_equiv_note (insn);
6fdc0f
+	  if (note)
6fdc0f
+	    c = XEXP (note, 0);
6fdc0f
+	  else
6fdc0f
+	    c = SET_SRC (set);
6fdc0f
+	}
6fdc0f
+      else
6fdc0f
 	return FALSE;
6fdc0f
-      c = XEXP (note, 0);
6fdc0f
     }
6fdc0f
   if (GET_CODE (c) == MEM
6fdc0f
       && GET_CODE (XEXP (c, 0)) == SYMBOL_REF
6fdc0f
--- gcc/testsuite/gcc.dg/ifcvt-fabs-1.c	1970-01-01 00:00:00.000000000 +0000
6fdc0f
+++ gcc/testsuite/gcc.dg/ifcvt-fabs-1.c	2006-10-26 02:20:24.000000000 -0300
6fdc0f
@@ -0,0 +1,21 @@
6fdc0f
+/* { dg-do run } */
6fdc0f
+/* { dg-options "-O" } */
6fdc0f
+/* { dg-options "-O -march=i686" { target i686-*-* } } */
6fdc0f
+
6fdc0f
+extern void abort(void);
6fdc0f
+
6fdc0f
+float foo(float f)
6fdc0f
+{
6fdc0f
+  if (f < 0.0f)
6fdc0f
+    f = -f;
6fdc0f
+
6fdc0f
+  return f;
6fdc0f
+}
6fdc0f
+
6fdc0f
+int main(void)
6fdc0f
+{
6fdc0f
+  if (foo (-1.0f) != 1.0f)
6fdc0f
+    abort ();
6fdc0f
+
6fdc0f
+  return 0;
6fdc0f
+}
6fdc0f
--- gcc/testsuite/g++.dg/opt/ifcvt1.C	2006-10-04 16:28:56.502613000 +0200
6fdc0f
+++ gcc/testsuite/g++.dg/opt/ifcvt1.C	2006-12-08 12:23:23.000000000 +0100
6fdc0f
@@ -0,0 +1,17 @@
6fdc0f
+// { dg-do compile }
6fdc0f
+// { dg-options "-O2 -fnon-call-exceptions" }
6fdc0f
+
6fdc0f
+struct S { ~S () throw () {} };
6fdc0f
+double bar ();
6fdc0f
+
6fdc0f
+int
6fdc0f
+foo ()
6fdc0f
+{
6fdc0f
+  S a;
6fdc0f
+  int i = 0;
6fdc0f
+  double c = bar ();
6fdc0f
+  c = c < 0 ? -c : c;
6fdc0f
+  if (c <= 1.e-8)
6fdc0f
+    i += 24;
6fdc0f
+  return i;
6fdc0f
+}