> Hi, > This is the main patch improving control flow graph for vectorized loop. It > generally rewrites loop peeling stuff in vectorizer. As described in patch, > for a typical loop to be vectorized like: > > preheader: > LOOP: > header_bb: > loop_body > if (exit_loop_cond) goto exit_bb > else goto header_bb > exit_bb: > > This patch peels prolog and epilog from the loop, adds guards skipping PROLOG > and EPILOG for various conditions. As a result, the changed CFG would look > like: > > guard_bb_1: > if (prefer_scalar_loop) goto merge_bb_1 > else goto guard_bb_2 > > guard_bb_2: > if (skip_prolog) goto merge_bb_2 > else goto prolog_preheader > > prolog_preheader: > PROLOG: > prolog_header_bb: > prolog_body > if (exit_prolog_cond) goto prolog_exit_bb > else goto prolog_header_bb > prolog_exit_bb: > > merge_bb_2: > > vector_preheader: > VECTOR LOOP: > vector_header_bb: > vector_body > if (exit_vector_cond) goto vector_exit_bb > else goto vector_header_bb > vector_exit_bb: > > guard_bb_3: > if (skip_epilog) goto merge_bb_3 > else goto epilog_preheader > > merge_bb_1: > > epilog_preheader: > EPILOG: > epilog_header_bb: > epilog_body > if (exit_epilog_cond) goto merge_bb_3 > else goto epilog_header_bb > > merge_bb_3: > > Bin, this patch seems to miss profile updating, so we get mismatches even for quite simple loops https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79347 I am bit lost in how the code is organized - it does insert multiple guards to the preheader edge?
Honza