Hi! As mentioned in the PR, combiner sometimes calls purge_all_dead_edges or purge_dead_edges that can invalidate the dominator info if it is computed. Other passes like CSE in that case free the dominance info, this patch does the same in the combiner.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-09-16 Jakub Jelinek <ja...@redhat.com> PR target/77526 * combine.c (rest_of_handle_combine): If any edges have been purged, free dominators if available. * gcc.target/i386/pr77526.c: New test. --- gcc/combine.c.jj 2016-08-12 17:33:46.000000000 +0200 +++ gcc/combine.c 2016-09-15 16:12:26.154982064 +0200 @@ -14393,6 +14393,8 @@ rest_of_handle_combine (void) instructions. */ if (rebuild_jump_labels_after_combine) { + if (dom_info_available_p (CDI_DOMINATORS)) + free_dominance_info (CDI_DOMINATORS); timevar_push (TV_JUMP); rebuild_jump_labels (get_insns ()); cleanup_cfg (0); --- gcc/testsuite/gcc.target/i386/pr77526.c.jj 2016-09-15 16:13:37.149105476 +0200 +++ gcc/testsuite/gcc.target/i386/pr77526.c 2016-09-15 16:13:13.000000000 +0200 @@ -0,0 +1,13 @@ +/* PR target/77526 */ +/* { dg-do compile { target int128 } } */ +/* { dg-options "-Os -fno-forward-propagate -fno-gcse -fno-rerun-cse-after-loop -mstringop-strategy=byte_loop -Wno-psabi" } */ + +typedef char U __attribute__((vector_size(64))); +typedef __int128 V __attribute__((vector_size(64))); + +V +foo (int a, int b, __int128 c, U u) +{ + u = (u >> (u & 7)) | (u << -(u & 7)); + return a + b + c + (V)u; +} Jakub