From 9910c53c49cd73e11ef039c011287b342fb8b6d2 Mon Sep 17 00:00:00 2001 From: Joey Ye Date: Fri, 28 Feb 2014 12:02:13 +0000 Subject: [PATCH] PR target/PR60169 2014-02-28 Joey Ye 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 --- gcc/ChangeLog | 6 + gcc/config/arm/arm.c | 5 + gcc/testsuite/ChangeLog | 5 + .../gcc.target/arm/thumb1-far-jump-3.c | 108 ++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 gcc/testsuite/gcc.target/arm/thumb1-far-jump-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 995957c4476..c0304cf7539 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-02-28 Joey Ye + + 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 PR middle-end/60147 diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index b49f43e3ea1..ce24bfed732 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 0259ba4fa0f..dac918c89ae 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-28 Joey Ye + + PR target/PR60169 + * gcc.target/arm/thumb1-far-jump-3.c: New case. + 2014-02-27 Paolo Carlini 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 00000000000..90559bacb2a --- /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]; + } + } + } +} -- 2.30.2