diff options
author | Joey Ye <joey.ye@arm.com> | 2014-02-28 12:02:13 +0000 |
---|---|---|
committer | Joey Ye <jye2@gcc.gnu.org> | 2014-02-28 12:02:13 +0000 |
commit | 9910c53c49cd73e11ef039c011287b342fb8b6d2 (patch) | |
tree | f15fb69455b00b99ab88ff45c3f5e078e1a18b44 /gcc | |
parent | 070f030948bcf458cb39b39e91708fb2a2b72855 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/thumb1-far-jump-3.c | 108 |
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]; + } + } + } +} |