diff options
author | Tom de Vries <tom@codesourcery.com> | 2017-07-17 07:49:22 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2017-07-17 07:49:22 +0000 |
commit | ed9091b270721c399112c74eb15b7fc27ef127db (patch) | |
tree | 7019227b7ddb7c922f854ef0e4a444bb2f945a00 | |
parent | 42ec024baa1bc9de83c8fcefe543f58a6939068d (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/nvptx/nvptx.c | 22 |
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); |