On Tue, 2013-10-01 at 20:21 -0500, Bill Schmidt wrote:
> On Tue, 2013-10-01 at 23:57 +0100, Yufeng Zhang wrote:
> > On 10/01/13 20:55, Bill Schmidt wrote:
> > >
> > >
> > > On Tue, 2013-10-01 at 11:56 -0500, Bill Schmidt wrote:
> > >> OK, thanks.  The problem that you've encountered is that you are
> > >> attempting to do something illegal. ;)  (Bin's original patch is
> > >> actually to blame for that, as well as me for not catching it then.)
> > >>
> > >> As your new test shows, it is unsafe to do the transformation in
> > >> backtrace_base_for_ref when widening from an unsigned type, because the
> > >> unsigned type has wrap semantics by default.  (The actual test must be
> > >> done on TYPE_OVERFLOW_WRAPS since this wrap semantics can be added or
> > >> removed by compile option -- see the comments with legal_cast_p and
> > >> legal_cast_p_1 later in the module.)
> > >>
> > >> You cannot in general prove that the transformation is allowable for a
> > >> specific constant, because you don't know that what you're adding it to
> > >> won't cause an overflow that's handled incorrectly.
> > >>
> > >> I believe the correct fix for the unsigned-overflow case is to fail
> > >> backtrace_base_for_ref if legal_cast_p (in_type, out_type) returns
> > >> false, where in_type is the type of the new *PBASE, and out_type is the
> > >> widening type that you're looking through.  So you can't just
> > >> STRIP_NOPS, you have to check the cast for legitimacy for this
> > >> transformation.
> > >>
> > >> This does not explain why backtrace_base_for_ref does not find all the
> > >> opportunities on slsr-39.c.  I don't immediately see what's preventing
> > >> that.  Note that the transformation is legal in that case because you
> > >> are widening from a signed int to an unsigned int, which won't cause
> > >> problems.  You guys need to dig deeper into why those opportunities are
> > >> missed when sizetype is larger than int.  Let me know if you need help
> > >> figuring it out.
> > >
> > > Sorry, I had to leave before and wanted to get this response back to you
> > > in case I didn't get back soon.  I've looked at this some more, and your
> > > general approach should work ok once you get the legal_cast_p check in
> > > place where you do the get_unwidened call now.  Once you know you have a
> > > legal widening, you don't have to worry about the safe_to_multiply_p
> > > stuff.  I.e., you don't need the last two chunks in the patch to
> > > backtrace_base_for_ref, and you don't need the unwidened_p variable.  It
> > > should all fall out properly by just restricting your unwidening to
> > > legal casts.
> > 
> > Many thanks for looking into the issue so promptly.  I've updated the 
> > patch; I have to use legal_cast_p_1 instead as the gimple node is no 
> > longer available by then.
> > 
> > Does the new patch look sane?
> 
> Yes, much better.  I'm happy with this approach.  However, please
> restore the correct whitespace before the { at -786,7 +795,7.
> 
> Thanks for fixing this up!
> 
> Bill

(Just a reminder that I can't approve your patch; you need a maintainer
for that.  But it looks good to me.)

Sometime when I get a moment I'm probably going to change this to handle
the casting when the candidates are added to the table.  I think we
should look through the casts and distribute the multiply at that time.
But for now what you have here is good.

Thanks,
Bill

> 
> > 
> > The regtest on aarch64 and bootstrapping on x86-64 are still running.
> > 
> > Thanks,
> > Yufeng
> > 
> > 
> > gcc/
> > 
> >     * gimple-ssa-strength-reduction.c (legal_cast_p_1): Forward
> >     declaration.
> >     (backtrace_base_for_ref): Call get_unwidened with 'base_in' if
> >     'base_in' represent a conversion and legal_cast_p_1 holds; set
> >     'base_in' with the returned value from get_unwidened.
> > 
> > gcc/testsuite/
> > 
> >     * gcc.dg/tree-ssa/slsr-40.c: New test.
> 

Reply via email to