aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2017-07-17 07:49:22 +0000
committerTom de Vries <vries@gcc.gnu.org>2017-07-17 07:49:22 +0000
commited9091b270721c399112c74eb15b7fc27ef127db (patch)
tree7019227b7ddb7c922f854ef0e4a444bb2f945a00
parent42ec024baa1bc9de83c8fcefe543f58a6939068d (diff)
downloadgcc-ed9091b270721c399112c74eb15b7fc27ef127db.zip
gcc-ed9091b270721c399112c74eb15b7fc27ef127db.tar.gz
gcc-ed9091b270721c399112c74eb15b7fc27ef127db.tar.bz2
Insert diverging jump alap in nvptx_single
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/nvptx/nvptx.c22
2 files changed, 25 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 672b212..67b7ff1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index c8847a5..78ce121 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -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);