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 <[email protected]>
* 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