diff options
author | Andrew Pinski <apinski@cavium.com> | 2016-04-20 13:29:32 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2016-04-20 13:29:32 +0000 |
commit | 9e3e4fab8456108a000c66ac084d08f878a42cee (patch) | |
tree | bcffd85f01c88ab8e46e83142e010333c11963dd /gcc | |
parent | ce6d77a40ab78c755f6ec89664d3d2dec0efbf16 (diff) | |
download | gcc-9e3e4fab8456108a000c66ac084d08f878a42cee.zip gcc-9e3e4fab8456108a000c66ac084d08f878a42cee.tar.gz gcc-9e3e4fab8456108a000c66ac084d08f878a42cee.tar.bz2 |
[AArch64] Work around PR target/64971
2016-04-20 Andrew Pinski <apinski@cavium.com>
Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/64971
* config/aarch64/aarch64.md (sibcall): Force call
address to be DImode for ILP32.
(sibcall_value): Likewise.
* gcc.c-torture/compile/pr37433-1.c: New testcase.
Co-Authored-By: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
From-SVN: r235281
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.md | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr37433-1.c | 11 |
4 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bac8ceb..a36a177 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-04-20 Andrew Pinski <apinski@cavium.com> + Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + PR target/64971 + * config/aarch64/aarch64.md (sibcall): Force call + address to be DImode for ILP32. + (sibcall_value): Likewise. + 2016-04-20 H.J. Lu <hongjiu.lu@intel.com> * doc/invoke.texi: Replace -skip-rax-setup with -mskip-rax-setup. diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 68676c9..f423284 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -855,6 +855,13 @@ || aarch64_is_noplt_call_p (callee))) XEXP (operands[0], 0) = force_reg (Pmode, callee); + /* FIXME: This is a band-aid. Need to analyze why expand_expr_addr_expr + is generating an SImode symbol reference. See PR 64971. */ + if (TARGET_ILP32 + && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF + && GET_MODE (XEXP (operands[0], 0)) == SImode) + XEXP (operands[0], 0) = convert_memory_address (Pmode, + XEXP (operands[0], 0)); if (operands[2] == NULL_RTX) operands[2] = const0_rtx; @@ -886,6 +893,14 @@ || aarch64_is_noplt_call_p (callee))) XEXP (operands[1], 0) = force_reg (Pmode, callee); + /* FIXME: This is a band-aid. Need to analyze why expand_expr_addr_expr + is generating an SImode symbol reference. See PR 64971. */ + if (TARGET_ILP32 + && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF + && GET_MODE (XEXP (operands[1], 0)) == SImode) + XEXP (operands[1], 0) = convert_memory_address (Pmode, + XEXP (operands[1], 0)); + if (operands[3] == NULL_RTX) operands[3] = const0_rtx; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 20d4df4..543837f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-20 Andrew Pinski <apinski@cavium.com> + + PR target/64971 + * gcc.c-torture/compile/pr37433-1.c: New testcase. + 2016-04-20 Arnaud Charlet <charlet@adacore.com> * gnat.dg/self1.adb: Remove now incorrect test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37433-1.c b/gcc/testsuite/gcc.c-torture/compile/pr37433-1.c new file mode 100644 index 0000000..322c167 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37433-1.c @@ -0,0 +1,11 @@ +void regex_subst(void) +{ + const void *subst = ""; + (*(void (*)(int))subst) (0); +} + +void foobar (void) +{ + int x; + (*(void (*)(void))&x) (); +} |