[nvptx] Fix branch-around-nothing
authorTom de Vries <tom@codesourcery.com>
Thu, 26 Apr 2018 13:26:38 +0000 (13:26 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Thu, 26 Apr 2018 13:26:38 +0000 (13:26 +0000)
2018-04-26  Tom de Vries  <tom@codesourcery.com>

PR target/84025
* config/nvptx/nvptx.c (needs_neutering_p): New function.
(nvptx_single): Use needs_neutering_p to skip over insns that do not
need neutering.

From-SVN: r259676

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

index 61d92f8fa8e8cb0d4e23edaf9de504dc0900fafd..d60f962502863366b77fcb493e02b5da55a4bc33 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-26  Tom de Vries  <tom@codesourcery.com>
+
+       PR target/84025
+       * config/nvptx/nvptx.c (needs_neutering_p): New function.
+       (nvptx_single): Use needs_neutering_p to skip over insns that do not
+       need neutering.
+
 2018-04-26  Richard Biener <rguenther@suse.de>
            Tom de Vries  <tom@codesourcery.com>
 
index ca3fea3002db2656f8a4fe49370127502282e48b..4fd1e2b5095158b362e10befb8714a4e044cfe5e 100644 (file)
@@ -3989,6 +3989,27 @@ bb_first_real_insn (basic_block bb)
 }
 #endif
 
+/* Return true if INSN needs neutering.  */
+
+static bool
+needs_neutering_p (rtx_insn *insn)
+{
+  if (!INSN_P (insn))
+    return false;
+
+  switch (recog_memoized (insn))
+    {
+    case CODE_FOR_nvptx_fork:
+    case CODE_FOR_nvptx_forked:
+    case CODE_FOR_nvptx_joining:
+    case CODE_FOR_nvptx_join:
+    case CODE_FOR_nvptx_barsync:
+      return false;
+    default:
+      return true;
+    }
+}
+
 /* Single neutering according to MASK.  FROM is the incoming block and
    TO is the outgoing block.  These may be the same block. Insert at
    start of FROM:
@@ -4014,9 +4035,7 @@ nvptx_single (unsigned mask, basic_block from, basic_block to)
   while (true)
     {
       /* Find first insn of from block.  */
-      while (head != BB_END (from)
-            && (!INSN_P (head)
-                || recog_memoized (head) == CODE_FOR_nvptx_barsync))
+      while (head != BB_END (from) && !needs_neutering_p (head))
        head = NEXT_INSN (head);
 
       if (from == to)
@@ -4057,22 +4076,9 @@ nvptx_single (unsigned mask, basic_block from, basic_block to)
   if (tail == head)
     {
       /* If this is empty, do nothing.  */
-      if (!head || !INSN_P (head))
+      if (!head || !needs_neutering_p (head))
        return;
 
-      /* If this is a dummy insn, do nothing.  */
-      switch (recog_memoized (head))
-       {
-       default:
-         break;
-       case CODE_FOR_nvptx_barsync:
-       case CODE_FOR_nvptx_fork:
-       case CODE_FOR_nvptx_forked:
-       case CODE_FOR_nvptx_joining:
-       case CODE_FOR_nvptx_join:
-         return;
-       }
-
       if (cond_branch)
        {
          /* If we're only doing vector single, there's no need to