[PATCH] D68342: [Analysis] Don't assume that overflow can't happen in EmitGEPOffset
Roman Lebedev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 2 10:55:53 PDT 2019
lebedev.ri added a comment.
In D68342#1691704 <https://reviews.llvm.org/D68342#1691704>, @miyuki wrote:
> In D68342#1691617 <https://reviews.llvm.org/D68342#1691617>, @lebedev.ri wrote:
>
> > I'm not fully convinced this is correct, as per
> > https://llvm.org/docs/LangRef.html#getelementptr-instruction
> >
> > If the inbounds keyword is present, the result value of the getelementptr is a poison value
> > if the base pointer is not an in bounds address of an allocated object, or if any of the
> > addresses that would be formed by successive addition of the offsets implied by the indices
> > to the base address with infinitely precise signed arithmetic are not an in bounds address
> > of that allocated object. <...>
> >
>
>
> I also thought that "in bounds address of an allocated object" has something to do with the type used in the GEP instruction, but that's not how Clang interprets it.
> E.g. for the following code
>
> int read(int *buf) {
> buf -= 2;
> return *buf;
> }
>
>
> It generates the following:
>
> define dso_local i32 @_Z4readPi(i32* nocapture readonly %buf) local_unnamed_addr #0 {
> entry:
> %add.ptr = getelementptr inbounds i32, i32* %buf, i64 -2
> %0 = load i32, i32* %add.ptr, align 4, !tbaa !2
> ret i32 %0
> }
I do not understand this point, could you elaborate please?
>> At worst `NUW` should be relaxed to `NSW`.
>
> What about the case I mentioned, i.e. an object which is larger than half of its address space?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D68342/new/
https://reviews.llvm.org/D68342
More information about the llvm-commits
mailing list