Fix PR target/49186

Kaz Kojima kkojima@rr.iij4u.or.jp
Tue May 31 08:04:00 GMT 2011


Hi,

sh.c:expand_cbranchdi4 forgot to produce the code for comparing
high 32-bit parts when the second operand is a constant of which
high 32-bit part is zero.  The attached patch is to fix it and
adds a new test for this PR.
Tested sh4-unknown-linux-gnu and i686-pc-linux-gnu with no new
regressions.  Applied on trunk.

I'll backport this to the release branches because the issue
is a regression on all release branches from 4.2.

Regards,
	kaz
--
2011-05-30  Kaz Kojima  <kkojima@gcc.gnu.org>

	PR target/49186
	* config/sh/sh.c (expand_cbranchdi4): Set msw_skip when the high
	part of the second operand is 0.

[testsuite]

	PR target/49186
	* gcc.c-torture/execute/pr49186.c: New.

diff -uprN ORIG/trunk/gcc/config/sh/sh.c trunk/gcc/config/sh/sh.c
--- ORIG/trunk/gcc/config/sh/sh.c	2011-05-27 14:51:19.000000000 +0900
+++ trunk/gcc/config/sh/sh.c	2011-05-27 19:28:06.000000000 +0900
@@ -2143,7 +2143,10 @@ expand_cbranchdi4 (rtx *operands, enum r
 	  else if (op2h != CONST0_RTX (SImode))
 	    msw_taken = LTU;
 	  else
-	    break;
+	    {
+	      msw_skip = swap_condition (LTU);
+	      break;
+	    }
 	  msw_skip = swap_condition (msw_taken);
 	}
       break;
diff -uprN ORIG/trunk/gcc/testsuite/gcc.c-torture/execute/pr49186.c trunk/gcc/testsuite/gcc.c-torture/execute/pr49186.c
--- ORIG/trunk/gcc/testsuite/gcc.c-torture/execute/pr49186.c	1970-01-01 09:00:00.000000000 +0900
+++ trunk/gcc/testsuite/gcc.c-torture/execute/pr49186.c	2011-05-29 22:32:08.000000000 +0900
@@ -0,0 +1,15 @@
+/* PR target/49186 */
+extern void abort (void);
+
+int
+main ()
+{
+  int x;
+  unsigned long long uv = 0x1000000001ULL;
+
+  x = (uv < 0x80) ? 1 : ((uv < 0x800) ? 2 : 3);
+  if (x != 3)
+    abort ();
+
+  return 0;
+}



More information about the Gcc-patches mailing list