S/390: Remove branch splitting loop
authorIlya Leoshkevich <iii@linux.ibm.com>
Wed, 15 Aug 2018 12:24:54 +0000 (12:24 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Wed, 15 Aug 2018 12:24:54 +0000 (12:24 +0000)
Since there is no branch splitting anymore, the loop is no longer
necessary: pool chunkification can be done in one step.

gcc/ChangeLog:

2018-08-15  Ilya Leoshkevich  <iii@linux.ibm.com>

* config/s390/s390.c (s390_reorg): Remove loop.

From-SVN: r263557

gcc/ChangeLog
gcc/config/s390/s390.c

index 38716931274d0cf308cecdae7144cf915a3d2dfc..5728118c982ebc4f60394bf743cfa223d518a6a2 100644 (file)
@@ -1,3 +1,7 @@
+2018-08-15  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       * config/s390/s390.c (s390_reorg): Remove loop.
+
 2018-08-15  Iain Sandoe  <iain@sandoe.co.uk>
 
        * config/darwin.c
index cc6f3489998b33da0c0253b1084835cf59c3bf6e..5c2a8cb2c6cb8986641daff570ed65f8c84759c6 100644 (file)
@@ -14023,7 +14023,7 @@ s390_adjust_loops ()
 static void
 s390_reorg (void)
 {
-  bool pool_overflow = false;
+  struct constant_pool *pool;
   rtx_insn *insn;
   int hw_before, hw_after;
 
@@ -14035,62 +14035,26 @@ s390_reorg (void)
   split_all_insns_noflow ();
 
   /* Install the main literal pool and the associated base
-     register load insns.
-
-     In addition, there are two problematic situations we need
-     to correct:
-
-     - the literal pool might be > 4096 bytes in size, so that
-       some of its elements cannot be directly accessed
-
-     - a branch target might be > 64K away from the branch, so that
-       it is not possible to use a PC-relative instruction.
+     register load insns.  The literal pool might be > 4096 bytes in
+     size, so that some of its elements cannot be directly accessed.
 
-     To fix those, we split the single literal pool into multiple
+     To fix this, we split the single literal pool into multiple
      pool chunks, reloading the pool base register at various
      points throughout the function to ensure it always points to
-     the pool chunk the following code expects, and / or replace
-     PC-relative branches by absolute branches.
-
-     However, the two problems are interdependent: splitting the
-     literal pool can move a branch further away from its target,
-     causing the 64K limit to overflow, and on the other hand,
-     replacing a PC-relative branch by an absolute branch means
-     we need to put the branch target address into the literal
-     pool, possibly causing it to overflow.
-
-     So, we loop trying to fix up both problems until we manage
-     to satisfy both conditions at the same time.  Note that the
-     loop is guaranteed to terminate as every pass of the loop
-     strictly decreases the total number of PC-relative branches
-     in the function.  (This is not completely true as there
-     might be branch-over-pool insns introduced by chunkify_start.
-     Those never need to be split however.)  */
-
-  for (;;)
-    {
-      struct constant_pool *pool = NULL;
-
-      /* Collect the literal pool.  */
-      if (!pool_overflow)
-       {
-         pool = s390_mainpool_start ();
-         if (!pool)
-           pool_overflow = true;
-       }
-
-      /* If literal pool overflowed, start to chunkify it.  */
-      if (pool_overflow)
-       pool = s390_chunkify_start ();
+     the pool chunk the following code expects.  */
 
-      /* If we made it up to here, both conditions are satisfied.
-        Finish up literal pool related changes.  */
-      if (pool_overflow)
-       s390_chunkify_finish (pool);
-      else
-       s390_mainpool_finish (pool);
-
-      break;
+  /* Collect the literal pool.  */
+  pool = s390_mainpool_start ();
+  if (pool)
+    {
+      /* Finish up literal pool related changes.  */
+      s390_mainpool_finish (pool);
+    }
+  else
+    {
+      /* If literal pool overflowed, chunkify it.  */
+      pool = s390_chunkify_start ();
+      s390_chunkify_finish (pool);
     }
 
   /* Generate out-of-pool execute target insns.  */