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

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/showbug.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