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.

Thanks,
Bill

> 
> Thanks,
> Bill
> 
> On Tue, 2013-10-01 at 16:06 +0100, Yufeng Zhang wrote:
> > Hi Bill,
> > 
> > Thank you for the review and the offer to help.
> > 
> > On 10/01/13 15:36, Bill Schmidt wrote:
> > > On Tue, 2013-10-01 at 08:17 -0500, Bill Schmidt wrote:
> > >> On Tue, 2013-10-01 at 12:19 +0200, Richard Biener wrote:
> > >>> On Wed, Sep 25, 2013 at 1:37 PM, Yufeng Zhang<yufeng.zh...@arm.com>  
> > >>> wrote:
> > >>>> Hello,
> > >>>>
> > >>>> Please find the updated version of the patch in the attachment.  It has
> > >>>> addressed the previous comments and also included some changes in 
> > >>>> order to
> > >>>> pass the bootstrapping on x86_64.
> > >>>>
> > >>>> It's also passed the regtest on arm-none-eabi and aarch64-none-elf.
> > >>>>
> > >>>> It will also fix the test failure as reported here:
> > >>>> http://gcc.gnu.org/ml/gcc-patches/2013-09/msg01317.html
> > >>>>
> > >>>> OK for the trunk?
> > >>>
> > >>> +   where n is a 32-bit unsigned int and pointer are 64-bit long.  In 
> > >>> this
> > >>> +   case, the gimple for (n - 1) is:
> > >>> +
> > >>> +     _2 = n_1(D) + 4294967295; // 0xFFFFFFFF
> > >>> +
> > >>> +   and it is wrong to multiply the large constant by 4 in the 64-bit 
> > >>> space.  */
> > >>> +
> > >>> +static bool
> > >>> +safe_to_multiply_p (tree type, double_int cst)
> > >>> +{
> > >>> +  if (TYPE_UNSIGNED (type)
> > >>> +&&  ! double_int_fits_to_tree_p (signed_type_for (type), cst))
> > >>> +    return false;
> > >>> +
> > >>> +  return true;
> > >>> +}
> > >>>
> > >>> This looks wrong.  The only relevant check is as whether the
> > >>> multiplication overflows the original type as you miss the implicit
> > >>> truncation that happens.  Which is something you don't know
> > >>> unless you know the value.  It definitely isn't a property of a type
> > >>> and a constant but the property of two constants and a type.
> > >>> Or the predicate has a wrong name.
> > >>>
> > >>> The use of get_unwidened in this core routine looks like this is
> > >>> all happening in the wrong place and we should have picked up
> > >>> another candidate for this instead?  I'm sure Bill will know more here.
> > >>
> > >> I'm not happy with how this patch is progressing.  Without having looked
> > >> too deeply, this might be better handled earlier when determining which
> > >> casts are safe to use in building candidates.  What you have here seems
> > >> more like closing the barn door after the horse got out.  Maybe that's
> > >> the only solution, but it doesn't seem likely.
> > >>
> > >> Another problem is that your test case isn't testing anything except
> > >> that the compiler doesn't crash.  That isn't sufficient as a regression
> > >> test.
> > >>
> > >> I'll spend some time looking at this to see if I can find a better
> > >> approach.  It might be a day or two before I can get to it.  In addition
> > >> to the included test case, are there any other cases you've found that I
> > >> should be concerned with?
> > >
> > > To help me investigate this without having to build a cross compiler,
> > > could you please compile your test case (without the patch applied)
> > > using -fdump-tree-reassoc2 -fdump-tree-slsr-details and send me the
> > > generated dump files?
> > 
> > The issue is not specific to AArch64; please find the attached dumps 
> > generated from the x86-64 gcc by compiling gcc.dg/tree-ssa/slsr-39.c.
> > 
> > W.r.t your comment in the other email about adding a test to verify the 
> > expected gimple, I think the existing test gcc.dg/tree-ssa/slsr-39.c is 
> > sufficient.  The test currently fails on both AArch64 and x86-64, and 
> > presumably also fails on any other 64-bit target where pointer is 64-bit 
> > and int is 32-bit size.  The patch I proposed is to fix this issue and 
> > gcc.dg/tree-ssa/slsr-39.c itself shall be a good regression test (with 
> > specific verification on gimple ir).
> > 
> > The new test proposed in this patch is to regtest the issue my original 
> > patch has, which is a runtime failure due to incorrect optimization.
> > 
> > I'll address other comments in separate emails.
> > 
> > Thanks,
> > Yufeng

Reply via email to