aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoey Ye <joey.ye@arm.com>2014-02-28 12:02:13 +0000
committerJoey Ye <jye2@gcc.gnu.org>2014-02-28 12:02:13 +0000
commit9910c53c49cd73e11ef039c011287b342fb8b6d2 (patch)
treef15fb69455b00b99ab88ff45c3f5e078e1a18b44 /gcc
parent070f030948bcf458cb39b39e91708fb2a2b72855 (diff)
downloadgcc-9910c53c49cd73e11ef039c011287b342fb8b6d2.zip
gcc-9910c53c49cd73e11ef039c011287b342fb8b6d2.tar.gz
gcc-9910c53c49cd73e11ef039c011287b342fb8b6d2.tar.bz2
PR target/PR60169
2014-02-28 Joey Ye <joey.ye@arm.com> PR target/PR60169 * config/arm/arm.c (thumb_far_jump_used_p): Don't change if reload in progress or completed. testsuite: * gcc.target/arm/thumb1-far-jump-3.c: New case. From-SVN: r208217
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/arm.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/arm/thumb1-far-jump-3.c108
4 files changed, 124 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 995957c..c0304cf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-02-28 Joey Ye <joey.ye@arm.com>
+
+ PR target/PR60169
+ * config/arm/arm.c (thumb_far_jump_used_p): Don't change
+ if reload in progress or completed.
+
2014-02-28 Tobias Burnus <burnus@net-b.de>
PR middle-end/60147
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index b49f43e..ce24bfe 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -26255,6 +26255,11 @@ thumb_far_jump_used_p (void)
return 0;
}
+ /* We should not change far_jump_used during or after reload, as there is
+ no chance to change stack frame layout. */
+ if (reload_in_progress || reload_completed)
+ return 0;
+
/* Check to see if the function contains a branch
insn with the far jump attribute set. */
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0259ba4..dac918c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-02-28 Joey Ye <joey.ye@arm.com>
+
+ PR target/PR60169
+ * gcc.target/arm/thumb1-far-jump-3.c: New case.
+
2014-02-27 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60253
diff --git a/gcc/testsuite/gcc.target/arm/thumb1-far-jump-3.c b/gcc/testsuite/gcc.target/arm/thumb1-far-jump-3.c
new file mode 100644
index 0000000..90559ba
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/thumb1-far-jump-3.c
@@ -0,0 +1,108 @@
+/* Catch reload ICE on target thumb1 with far jump optimization.
+ * It is also a valid case for non-thumb1 target. */
+
+/* Add -mno-lra option as it is only reproducable with reload. It will
+ be removed after reload is completely removed. */
+/* { dg-options "-mno-lra -fomit-frame-pointer" } */
+/* { dg-do compile } */
+
+#define C 2
+#define A 4
+#define RGB (C | A)
+#define GRAY (A)
+
+typedef unsigned long uint_32;
+typedef unsigned char byte;
+typedef byte * bytep;
+
+typedef struct ss
+{
+ uint_32 w;
+ uint_32 r;
+ byte c;
+ byte b;
+ byte p;
+} info;
+
+typedef info * infop;
+
+void
+foo(infop info, bytep row)
+{
+ uint_32 iw = info->w;
+ if (info->c == RGB)
+ {
+ if (info->b == 8)
+ {
+ bytep sp = row + info->r;
+ bytep dp = sp;
+ byte save;
+ uint_32 i;
+
+ for (i = 0; i < iw; i++)
+ {
+ save = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = save;
+ }
+ }
+
+ else
+ {
+ bytep sp = row + info->r;
+ bytep dp = sp;
+ byte save[2];
+ uint_32 i;
+
+ for (i = 0; i < iw; i++)
+ {
+ save[0] = *(--sp);
+ save[1] = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = save[0];
+ *(--dp) = save[1];
+ }
+ }
+ }
+ else if (info->c == GRAY)
+ {
+ if (info->b == 8)
+ {
+ bytep sp = row + info->r;
+ bytep dp = sp;
+ byte save;
+ uint_32 i;
+
+ for (i = 0; i < iw; i++)
+ {
+ save = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = save;
+ }
+ }
+ else
+ {
+ bytep sp = row + info->r;
+ bytep dp = sp;
+ byte save[2];
+ uint_32 i;
+
+ for (i = 0; i < iw; i++)
+ {
+ save[0] = *(--sp);
+ save[1] = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = save[0];
+ *(--dp) = save[1];
+ }
+ }
+ }
+}