From 482539eec08acc15446258f177b349fdc2ed2e9c Mon Sep 17 00:00:00 2001 From: ktkachov Date: Wed, 20 Apr 2016 13:29:32 +0000 Subject: [PATCH] [AArch64] Work around PR target/64971 2016-04-20 Andrew Pinski Kyrylo Tkachov 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@235281 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/config/aarch64/aarch64.md | 15 +++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr37433-1.c | 11 +++++++++++ 4 files changed, 39 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr37433-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bac8ceb65a5..a36a1770cd9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-04-20 Andrew Pinski + Kyrylo Tkachov + + 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 * 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 68676c9bd55..f423284ea01 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 20d4df4f7c2..543837ff579 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-20 Andrew Pinski + + PR target/64971 + * gcc.c-torture/compile/pr37433-1.c: New testcase. + 2016-04-20 Arnaud Charlet * 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 00000000000..322c167d682 --- /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) (); +} -- 2.11.4.GIT