rs6000.c (rs6000_function_ok_for_sibcall): Return false if the call takes a static...
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 21 Sep 2018 10:01:16 +0000 (10:01 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 21 Sep 2018 10:01:16 +0000 (10:01 +0000)
* config/rs6000/rs6000.c (rs6000_function_ok_for_sibcall): Return false
if the call takes a static chain.

From-SVN: r264463

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/nested-func-11.c [new file with mode: 0644]
gcc/testsuite/lib/target-supports.exp

index 97e75ec34b2808b9566fccc02854ce40e0c5eec8..d33af3eb89500cda7795c818af133af9ca583157 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * config/rs6000/rs6000.c (rs6000_function_ok_for_sibcall): Return false
+       if the call takes a static chain.
+
 2018-09-21  Martin Liska  <mliska@suse.cz>
 
        * auto-profile.c (autofdo_source_profile::read): Do not
index 340490c46e902f2ff7ede4c978419ee7ad228c9d..79dd2f648e8e8ae88d3c0f09faf2d240df0e7645 100644 (file)
@@ -24331,6 +24331,12 @@ rs6000_function_ok_for_sibcall (tree decl, tree exp)
 {
   tree fntype;
 
+  /* The sibcall epilogue may clobber the static chain register.
+     ??? We could work harder and avoid that, but it's probably
+     not worth the hassle in practice.  */
+  if (CALL_EXPR_STATIC_CHAIN (exp))
+    return false;
+
   if (decl)
     fntype = TREE_TYPE (decl);
   else
index c68e2c61871c33fe47ab404425ae7a0d3f54643f..b0664206895140271ed6f3c397b408e71d0cad55 100644 (file)
@@ -1,3 +1,10 @@
+2018-09-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.dg/nested-func-11.c: New test.
+
+       * lib/target-supports.exp (check_effective_target_tls_runtime): Make
+       more robust and remove target-specific handling.
+
 2018-09-21  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc.c-torture/execute/20180921-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/nested-func-11.c b/gcc/testsuite/gcc.dg/nested-func-11.c
new file mode 100644 (file)
index 0000000..01096b4
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-omit-frame-pointer" } */
+
+int __attribute__((noipa)) foo (int i)
+{
+  int a;
+
+  void __attribute__((noipa)) nested2 (int i)
+  {
+    a = i;
+  }
+
+  void  __attribute__((noipa)) nested1 (int i)
+  {
+    int b[32];
+
+    for (int j = 0; j < 32; j++)
+      b[j] = i + j;
+
+    nested2 (b[i]);
+  }
+
+  nested1 (i);
+
+  return a;
+}
+
+int main (void)
+{
+  if (foo (4) != 8)
+    __builtin_abort ();
+
+  return 0;
+}
index 94f61c58df9ba09fdbef26201a92754b4702786c..57bfe9ccd2f58a85e48c2158f7209c97e694df84 100644 (file)
@@ -879,13 +879,8 @@ proc check_effective_target_tls_emulated {} {
 # Return 1 if TLS executables can run correctly, 0 otherwise.
 
 proc check_effective_target_tls_runtime {} {
-    # The runtime does not have TLS support, but just
-    # running the test below is insufficient to show this.
-    if { [istarget msp430-*-*] || [istarget visium-*-*] } {
-       return 0
-    }
     return [check_runtime tls_runtime {
-       __thread int thr = 0;
+       __thread int thr __attribute__((tls_model("global-dynamic"))) = 0;
        int main (void) { return thr; }
     } [add_options_for_tls ""]]
 }