This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][AArch64][GCC 5] Backport Work around for PR target/64971
- From: Kyrill Tkachov <kyrylo dot tkachov at foss dot arm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Richard Earnshaw <Richard dot Earnshaw at arm dot com>, Marcus Shawcroft <marcus dot shawcroft at arm dot com>, James Greenhalgh <james dot greenhalgh at arm dot com>, Renlin Li <renlin dot li at arm dot com>, Andrew Pinski <apinski at cavium dot com>
- Date: Fri, 26 Aug 2016 09:52:52 +0100
- Subject: [PATCH][AArch64][GCC 5] Backport Work around for PR target/64971
- Authentication-results: sourceware.org; auth=none
Hi all,
I'd like to backport this fix for an ILP32 ICE. This was a simple band-aid proposed by Andrew
that is self-contained and doesn't touch non-ILP32 or non-aarch64 code so it should be pretty safe
to backport. It has been in trunk and GCC 6 for quite some time without issues until Renlin's patch at r235282
fixed the midend issue [1].
Bootstrapped and tested on GCC 5 on aarch64-none-linux-gnu.
Is this patch ok for the branch?
Thanks,
Kyrill
[1] https://gcc.gnu.org/ml/gcc-patches/2016-08/msg00332.html
2016-08-26 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Backport from mainline
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.
PR target/64971
* gcc.c-torture/compile/pr37433 <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37433>-1.c: New testcase.
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 116fd89102c98c5e1816998ce56cbc4d87525e97..501ae4481451b1730233eb4dfaca2a66a5b1c2ae 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -687,6 +687,13 @@ (define_expand "sibcall"
&& (GET_CODE (XEXP (operands[0], 0)) != SYMBOL_REF))
XEXP (operands[0], 0) = force_reg (Pmode, XEXP (operands[0], 0));
+ /* This is a band-aid. An SImode symbol reference is sometimes generated
+ by expand_expr_addr_expr. 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;
@@ -717,6 +724,14 @@ (define_expand "sibcall_value"
&& (GET_CODE (XEXP (operands[1], 0)) != SYMBOL_REF))
XEXP (operands[1], 0) = force_reg (Pmode, XEXP (operands[1], 0));
+ /* This is a band-aid. An SImode symbol reference is sometimes generated
+ by expand_expr_addr_expr. 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/gcc.c-torture/compile/pr37433-1.c b/gcc/testsuite/gcc.c-torture/compile/pr37433-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c69e9692eb0229154676fc088c41741fa30f1871
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr37433-1.c
@@ -0,0 +1,13 @@
+void
+regex_subst (void)
+{
+ const void *subst = "";
+ (*(void (*)(int))subst) (0);
+}
+
+void
+foobar (void)
+{
+ int x;
+ (*(void (*)(void))&x) ();
+}