Hi,

On Thu, Oct 08, 2015 at 12:08:15AM +0200, Jan Hubicka wrote:
> > > This patch broke Solaris bootstrap in stage 1 with g++ 4.9:
> > > 
> > > /vol/gcc/src/hg/trunk/solaris/gcc/ipa-cp.c: In member function 'bool 
> > > ipcp_alignment_lattice::meet_with_1(unsigned int, unsigned int)':
> > > /vol/gcc/src/hg/trunk/solaris/gcc/ipa-cp.c:855:56: error: call of 
> > > overloaded 'abs(unsigned int)' is ambiguous
> > >        int diff = abs (misalign - (new_misalign % align));
> > 
> > Calling abs on an unsigned type does not sound right anyway (that
> > almost sounds like a good candidate for a warning).  I suppose the
> 
> Yep, I guess that may be a good idea ;)
> 
> > correct fix is to cast both subtraction operands to signed int, would
> > such a change be pre-approved?
> 
>   if (misalign != (new_misalign % align))
>     {
>       int diff = abs (misalign - (new_misalign % align));
>       align = MIN (align, (unsigned) diff & -diff);
>       if (align)
>         misalign = misalign % align;
>       else
>         set_to_bottom ();
>       changed = true;
>     }
> 
> So the logic here is that you compute differnce of missaligns and want to set 
> align to be at least that.  Why
>       align = MIN (align, (unsigned) diff & -diff);
> I suppose ALIGN should be always greater than that, because diff is at most 
> ALIGN.
> So I suppose you want 
>   align = (unsigned) diff & -diff
> 
> The changes are pre-approved.
> 


Thanks, I have committed the following after bootstrapping and testing
on x86_64-linux.

Martin


2015-10-08  Martin Jambor  <mjam...@suse.cz>

        * ipa-cp.c (meet_with_1): Make the argument of abs signed.  Remove
        unnecessary MIN.

diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 0d9fdee..d9d81f1 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -852,8 +852,8 @@ ipcp_alignment_lattice::meet_with_1 (unsigned new_align, 
unsigned new_misalign)
     }
   if (misalign != (new_misalign % align))
     {
-      int diff = abs (misalign - (new_misalign % align));
-      align = MIN (align, (unsigned) diff & -diff);
+      int diff = abs ((int) misalign - (int) (new_misalign % align));
+      align = (unsigned) diff & -diff;
       if (align)
        misalign = misalign % align;
       else

Reply via email to