[llvm-dev] Behaviour of APInt

Tim Northover via llvm-dev llvm-dev at lists.llvm.org
Thu Jan 31 05:25:32 PST 2019


On Thu, 31 Jan 2019 at 12:56, Sam Parker via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
> The APInt documentation states that it 'is a functional replacement for common
> case unsigned integer type', but I'm not seeing this because the internal logic
> is that the value is always treated as negative if the most significant bit is
> set.

I take that as saying it's a 2s-complement type rather than overflow
being UB, but the statement may still be misleading.

> I know there are operators for when the sign matters, but from my example,
> either my understanding or the functionality is broken.

It's definitely quirky that it's always printed as a signed integer.
My guess would be it stems from a very early decision about the
friendliest ways to print IR's iN types, which was probably its first
use-case (i.e. most people would prefer to see i64 -1 over i64
18446744073709551616). But I haven't done the archaeology to confirm
it.

> If an abstract
> structure exists, why does the MSB still represent the sign? Especially
> when it's supposed to be an unsigned type!

I think it's be more correct to say it's an arbitrary precision type
that could be either sign (again, much like LLVM's iN). There's a
separate APSInt for a type that genuinely is either signed or unsigned
in all cases.

Cheers.

Tim.


More information about the llvm-dev mailing list