This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch ARM] Fix PR 49069.
- From: Sameera Deshpande <sameera dot deshpande at arm dot com>
- To: "nickc at redhat dot com" <nickc at redhat dot com>, "paul at codesourcery dot com" <paul at codesourcery dot com>, Ramana Radhakrishnan <Ramana dot Radhakrishnan at arm dot com>, Richard Earnshaw <Richard dot Earnshaw at arm dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 24 Jan 2012 16:10:19 +0000
- Subject: [Patch ARM] Fix PR 49069.
Hi,
Please find attached the patch fixing bug 49069.
This patch is tested with check-gcc on trunk and 4.6 without regression.
OK for trunk?
Is it fine to backport to 4.6 branch?
ChangeLog:
2012-01-24 Sameera Deshpande <sameera.deshpande@arm.com>
PR target/49069
gcc/config/arm/arm.md (cstoredi4): Handle the case when both
operands are const_int.
gcc/testsuite/ChangeLog:
2012-01-24 Sameera Deshpande <sameera.deshpande@arm.com>
PR target/49069
gcc.target/arm/pr49069.c: New compile-only test.
- Thanks and regards,
Sameera D.
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 751997f..e3dc98f 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -7911,8 +7911,9 @@
enum rtx_code code = GET_CODE (operands[1]);
/* We should not have two constants. */
- gcc_assert (GET_MODE (operands[2]) == DImode
- || GET_MODE (operands[3]) == DImode);
+ if (!(GET_MODE (operands[2]) == DImode || GET_MODE (operands[3]) == DImode)
+ && !(reload_in_progress || reload_completed))
+ operands[3] = force_reg (DImode, operands[3]);
/* Flip unimplemented DImode comparisons to a form that
arm_gen_compare_reg can handle. */
diff --git a/gcc/testsuite/gcc.target/arm/pr49069.c b/gcc/testsuite/gcc.target/arm/pr49069.c
new file mode 100644
index 0000000..3cc903e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr49069.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -mfloat-abi=softfp -mfpu=vfpv3-d16" } */
+
+__extension__ typedef unsigned long long int uint64_t;
+
+static int
+func2 (int a, int b)
+{
+ return a == 0 ? a : a / b;
+}
+
+int array1[1];
+const uint64_t array2[1] = { 1 };
+
+void
+foo (void)
+{
+ for (array1[0] = 0; array1[0] == 1; array1[0]++)
+ {
+ }
+ if (bar (array2[0] == func2 (array1[0], 0)) == 0)
+ {
+ }
+}