On Tue, Jul 19, 2016 at 1:07 PM, Bernd Schmidt <bschm...@redhat.com> wrote: > On 07/19/2016 12:35 PM, Richard Biener wrote: > >> I think that start/end_recording_case_labels also merged adjacent labels >> via group_case_labels_stmt. Not sure why you need to stop recording >> case labels during the transform. Is this because you are building a new >> switch stmt? > > > It's because the cached mapping gets invalidated. Look in tree-cfg, it has a > edge_to_cases map which I think cannot be maintained if you modify the > structure. I certainly got lots of internal errors until I added that pair > of calls.
Yeah, I see that. OTOH cfgcleanup relies on this cache to be efficient and you (repeatedly) clear it. Clearing parts of it should be sufficient and if you used redirect_edge_and_branch instead of redirect_edge_pred it would have maintained the cache as far as I can see, or you can make sure to maintain it yourself or just clear the info associated with the edges you redirect from one switch to another. Btw, + gimple_stmt_iterator gsi1, gsi2; + gsi1 = gsi_last_nondebug_bb (pred_bb); + if (gsi_end_p (gsi1)) + return false; + gimple *pred_end = gsi_stmt (gsi1); + if (gimple_code (pred_end) != GIMPLE_SWITCH) this is just gimple *pred_end = last_stmt (pred_bb); if (! pred_end || gimple_code (pred_end) != GIMPLE_SWITCH) ... Richard. Richard. > > Bernd >