[tree-optimization] Don't clear ctrl-altering flag for IFN_UNIQUE
authorTom de Vries <tdevries@suse.de>
Thu, 10 Sep 2020 10:44:20 +0000 (12:44 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 10 Sep 2020 10:59:29 +0000 (12:59 +0200)
commitf96b6328fa7162111e4440c5901ef313ed3e6c9a
tree6b4bcfee3f83263d4e9744b3fc6ad5ed0d2b7f40
parent3d0af0c997fe42a7f0963d970a9c495b81041206
[tree-optimization] Don't clear ctrl-altering flag for IFN_UNIQUE

There's an invariant for IFN_UNIQUE, listed here in
gimple_call_initialize_ctrl_altering:
...
      /* IFN_UNIQUE should be the last insn, to make checking for it
         as cheap as possible.  */
      || (gimple_call_internal_p (stmt)
          && gimple_call_internal_unique_p (stmt)))
    gimple_call_set_ctrl_altering (stmt, true);
...

Recent commit fab77644842 "tree-optimization/96931 - clear ctrl-altering flag
more aggressively" breaks this invariant, causing an ICE triggered during
libgomp testing for x86_64 with nvptx accelerator:
...
during RTL pass: mach
asyncwait-1.f90: In function ‘MAIN__._omp_fn.0’:
asyncwait-1.f90:19: internal compiler error: in nvptx_find_par, at \
  config/nvptx/nvptx.c:3293
...

Fix this by listing IFN_UNIQUE as exception in
cleanup_call_ctrl_altering_flag.

Build for x86_64 with nvptx accelerator, tested libgomp.

gcc/ChangeLog:

PR tree-optimization/97000
* tree-cfgcleanup.c (cleanup_call_ctrl_altering_flag): Don't clear
flag for IFN_UNIQUE.
gcc/tree-cfgcleanup.c