Insert diverging jump alap in nvptx_single
authorTom de Vries <tom@codesourcery.com>
Mon, 17 Jul 2017 07:49:22 +0000 (07:49 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Mon, 17 Jul 2017 07:49:22 +0000 (07:49 +0000)
2017-07-17  Tom de Vries  <tom@codesourcery.com>

PR target/81069
* config/nvptx/nvptx.c (nvptx_single): Insert diverging branch as late
as possible.

From-SVN: r250256

gcc/ChangeLog
gcc/config/nvptx/nvptx.c

index 672b21224c7b78a57dcb3d0f50f93f8858159940..67b7ff12d95f8208708ef6e8e72645f4a5256328 100644 (file)
@@ -1,3 +1,9 @@
+2017-07-17  Tom de Vries  <tom@codesourcery.com>
+
+       PR target/81069
+       * config/nvptx/nvptx.c (nvptx_single): Insert diverging branch as late
+       as possible.
+
 2017-07-17  Sebastian Huber  <sebastian.huber@embedded-brains.de>
 
        *  gcc/config/sparc/rtemself.h (TARGET_OS_CPP_BUILTINS): Add
index c8847a5dbba66a6256c8e0f923c26b4b3b809635..78ce12134977d88c084f19fcde4d52fdd87aafa8 100644 (file)
@@ -3886,9 +3886,25 @@ nvptx_single (unsigned mask, basic_block from, basic_block to)
   rtx_insn *tail = BB_END (to);
   unsigned skip_mask = mask;
 
-  /* Find first insn of from block */
-  while (head != BB_END (from) && !INSN_P (head))
-    head = NEXT_INSN (head);
+  while (true)
+    {
+      /* Find first insn of from block.  */
+      while (head != BB_END (from) && !INSN_P (head))
+       head = NEXT_INSN (head);
+
+      if (from == to)
+       break;
+
+      if (!(JUMP_P (head) && single_succ_p (from)))
+       break;
+
+      basic_block jump_target = single_succ (from);
+      if (!single_pred_p (jump_target))
+       break;
+
+      from = jump_target;
+      head = BB_HEAD (from);
+    }
 
   /* Find last insn of to block */
   rtx_insn *limit = from == to ? head : BB_HEAD (to);