On Thu, Jul 23, 2015 at 02:39:05PM +0200, Jakub Jelinek wrote:
> On Thu, Jul 23, 2015 at 02:20:51PM +0200, Marek Polacek wrote:
> > > So isn't the bug instead that the UBSAN_BOUNDS generating code doesn't
> > > unshare?  Of course, these two functions use op0 and/or op1 sometimes
> > > multiple times too and thus they might want to unshare too, but I'd have
> > > expected in a different spot.
> > 
> > I don't think so: I think I need to unshare op0 and op1 because the shift
> > instrumentation always duplicates them for the __ubsan_* call.
> > Doing the unsharing in bounds instrumentation is too late (and none of my
> > attempts worked).
> > 
> > I can move the unsharing a little bit below, just before creating the
> > BUILT_IN_UBSAN_HANDLE_SHIFT_OUT_OF_BOUNDS call, but otherwise I have no
> > better ideas.
> > 
> > So for now I don't have a better patch, sorry.
> 
> Actually looking at the callers, your patch is indeed right.  They pass
> this op0/op1 to these functions and then use the values as well elsewhere
> (in the actual operation).
> 
> Whether it is also needed more times in the body of the functions
> (if you use op0 and/or op1 in the functions more than once in the generated
> expressions) remains to be seen.  Of course during gimplification we unshare
> everything shared in the function body, but that might be too late.
> E.g. in ubsan_instrument_division at
>       tt = fold_build2 (EQ_EXPR, boolean_type_node, op1,
>                         build_int_cst (type, -1));
>       x = fold_build2 (EQ_EXPR, boolean_type_node, op0,
>                        TYPE_MIN_VALUE (type));
> you already know op1 has been used once in t, while op0 has not been used
> yet, so unshare_expr (op1) might be desirable.  And you know that unless
> if (integer_zerop (t)) op0 will be used afterwards, so you might as well
> unshare_expr (op0) too.  Then you use
>   t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t);
> unconditionally.  And finally there is:
>       tt = build_call_expr_loc (loc, tt, 3, data, ubsan_encode_value (op0),
>                                 ubsan_encode_value (op1));
> which you might want to unshare_expr first (both).
> 
> So, please go ahead with your patch and as follow-up, see if further
> unshare_exprs don't need to be added.

Thanks.  Ok, I will; and I hope that the follow up will fix the remaining
issue Maxim is seeing on ARM.

        Marek

Reply via email to