aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <apinski@cavium.com>2016-04-20 13:29:32 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2016-04-20 13:29:32 +0000
commit9e3e4fab8456108a000c66ac084d08f878a42cee (patch)
treebcffd85f01c88ab8e46e83142e010333c11963dd /gcc
parentce6d77a40ab78c755f6ec89664d3d2dec0efbf16 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/config/aarch64/aarch64.md15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr37433-1.c11
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) ();
+}