------- Comment #5 from rguenth at gcc dot gnu dot org 2010-09-01 10:19 ------- I see before SLP:
<bb 2>: MEM[(struct A *)this_1(D)].a = 0; MEM[(struct A *)this_1(D)].b = 0; MEM[(struct A *)this_1(D)].c = 0; [LP 2] MEM[(struct A *)this_1(D) + 12B].a = 0; and after: <bb 2>: vect_cst_.1_16 = { 0, 0, 0, 0 }; vect_p.5_17 = &MEM[(struct A *)this_1(D)].a; M*vect_p.5_17{misalignment: 0} = vect_cst_.1_16; so EH info has not been properly transfered. Now that only MEM[(struct A *)this_1(D) + 12B].a can throw internally but not MEM[(struct A *)this_1(D)].c = 0; is a fact that the frontend establishes. The following mitigates the problem by simply removing the dead EH edges. Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c (revision 163721) +++ gcc/tree-vect-slp.c (working copy) @@ -2474,6 +2474,9 @@ vect_schedule_slp (loop_vec_info loop_vi } } + if (bb_vinfo) + gimple_purge_dead_eh_edges (BB_VINFO_BB (bb_vinfo)); + return is_store; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45470