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