------- Comment #6 from irar at il dot ibm dot com 2010-09-01 11:54 -------
(In reply to comment #5)
> 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.
How should it be done? Is it ok to assume that if one of the old stmts can
throw, then we can set TREE_THIS_NOTRAP for the new access to 0? (and then we
can call maybe_duplicate_eh_stmt (new_stmt, old_stmt)).
Or maybe it's better to avoid vectorization?...
Thanks,
Ira
> 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;
> }
>
>
--
irar at il dot ibm dot com changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|4.6.0 |---
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45470