]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[AArch64][GCC 5] Backport Work around for PR target/64971
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Fri, 26 Aug 2016 09:37:20 +0000 (09:37 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Fri, 26 Aug 2016 09:37:20 +0000 (09:37 +0000)
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.

* gcc.c-torture/compile/pr37433-1.c: New testcase.

From-SVN: r239770

gcc/ChangeLog
gcc/config/aarch64/aarch64.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr37433-1.c [new file with mode: 0644]

index f525d87ab41df1dbecd283636af125efbf4c09bf..71887e1015b1f2f874dacec19c9b24b16308fa42 100644 (file)
@@ -1,3 +1,14 @@
+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.
+
 2016-08-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        Backport from mainline (minus test for POWER9 support)
index 116fd89102c98c5e1816998ce56cbc4d87525e97..501ae4481451b1730233eb4dfaca2a66a5b1c2ae 100644 (file)
        && (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;
 
        && (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;
 
index 3e455222321915b4b238b4fcac6ccc07e791db16..279891c607b1a0e73aeadbafcaf3b2af578767b6 100644 (file)
@@ -1,3 +1,12 @@
+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
+       * gcc.c-torture/compile/pr37433-1.c: New testcase.
+
 2016-08-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        Backport from mainline
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 (file)
index 0000000..c69e969
--- /dev/null
@@ -0,0 +1,13 @@
+void
+regex_subst (void)
+{
+  const void *subst = "";
+  (*(void (*)(int))subst) (0);
+}
+
+void
+foobar (void)
+{
+  int x;
+  (*(void (*)(void))&x) ();
+}