[llvm-dev] Reducing the number of ptrtoint/inttoptrs that are generated by LLVM

Sanjoy Das via llvm-dev llvm-dev at lists.llvm.org
Tue Jan 22 13:32:49 PST 2019


On Tue, Jan 22, 2019 at 11:07 AM Juneyoung Lee
<juneyoung.lee at sf.snu.ac.kr> wrote:
> Ralf pointed out that psub cannot be used for propagating pointer equality if pointer-cast integer is involved;
>
> a = p
> b = inttoptr(ptrtoint p)
> if ((psub inbounds a b) == 0) {
> use(b) // replacing b with a may be problematic, as it is essentially folding inttoptr(ptrtoint p) -> p, which is discussed at https://bugs.llvm.org/show_bug.cgi?id=34548
> }
>
> I'm sorry for the confusion. To propagate pointer equality, we certainly need a better solution. :\

I don't immediately see the problem.  Firstly because we branch on
(psub a b), a and b must have a common provenance.  If `a` is an
interior pointer to this common allocation then we're fine.  So the
only case where the psub will be == 0 and `a` will not be
dereferenceable is if a points to one past the end of some allocation.

The most obvious "full" example I can come up in this setting is:

// Assume the stack layout is x followed by y
int y[10];
int x[40];
int* a = &x[40]
int* b = inttoptr(ptrtoint a)
if ((psub inbounds a b) == 0) {
  *b = 9; // Sets y[0] = 9
}

But this code is problematic for other reasons (so I think it has to
be UB) -- if we allow assigning to y[0] like above then this breaks
alias analysis on alloca's right? `y` above is not escaped, so we
should be able to assume that nothing writes to it.

-- Sanjoy


More information about the llvm-dev mailing list