Hi, This patch improves cse_cfg_altered computation by taking into account cleanup_cfg returned values. This resolves another case of invalidated dominance info.
Bootstrapped and regtested on x86_64-unknown-linux-gnu. OK for turnk? Thanks, Ilya -- gcc/ 2016-05-13 Ilya Enkovich <ilya.enkov...@intel.com> * cse.c (rest_of_handle_cse): Use cleanup_cfg returned value cse_cfg_altered computation. (rest_of_handle_cse2): Likewise. (rest_of_handle_cse_after_global_opts): Likewise. gcc/testsuite/ 2016-05-13 Ilya Enkovich <ilya.enkov...@intel.com> * gcc.dg/pr71084.c: New test. diff --git a/gcc/cse.c b/gcc/cse.c index 04e1a85..322e352 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -7562,11 +7562,11 @@ rest_of_handle_cse (void) { timevar_push (TV_JUMP); rebuild_jump_labels (get_insns ()); - cleanup_cfg (CLEANUP_CFG_CHANGED); + cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED); timevar_pop (TV_JUMP); } else if (tem == 1 || optimize > 1) - cleanup_cfg (0); + cse_cfg_altered |= cleanup_cfg (0); if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS)) free_dominance_info (CDI_DOMINATORS); @@ -7634,11 +7634,11 @@ rest_of_handle_cse2 (void) { timevar_push (TV_JUMP); rebuild_jump_labels (get_insns ()); - cleanup_cfg (CLEANUP_CFG_CHANGED); + cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED); timevar_pop (TV_JUMP); } else if (tem == 1) - cleanup_cfg (0); + cse_cfg_altered |= cleanup_cfg (0); if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS)) free_dominance_info (CDI_DOMINATORS); @@ -7711,11 +7711,11 @@ rest_of_handle_cse_after_global_opts (void) { timevar_push (TV_JUMP); rebuild_jump_labels (get_insns ()); - cleanup_cfg (CLEANUP_CFG_CHANGED); + cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED); timevar_pop (TV_JUMP); } else if (tem == 1) - cleanup_cfg (0); + cse_cfg_altered |= cleanup_cfg (0); if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS)) free_dominance_info (CDI_DOMINATORS); diff --git a/gcc/testsuite/gcc.dg/pr71084.c b/gcc/testsuite/gcc.dg/pr71084.c new file mode 100644 index 0000000..46fdf9f --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr71084.c @@ -0,0 +1,38 @@ +/* PR tree-optimization/71084 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void babl_format (void); +void gimp_drawable_get_format (void); +int _setjmp (void); + +enum { + GIMP_RGB_IMAGE, + GIMP_RGBA_IMAGE, + GIMP_GRAY_IMAGE, + GIMP_GRAYA_IMAGE, + GIMP_INDEXED_IMAGE +} run_i; + +int run_height; + +void fn1 () +{ + int type, width; + if (_setjmp ()) + switch (type) + { + case GIMP_RGB_IMAGE: + babl_format (); + case GIMP_RGBA_IMAGE: + case GIMP_GRAY_IMAGE: + babl_format (); + case GIMP_GRAYA_IMAGE: + case GIMP_INDEXED_IMAGE: + gimp_drawable_get_format(); + } + for (; run_height;) + for (; run_i < (long)fn1; ++run_i) + for (; width;) + ; +}