[InstSimplify] Don't fold gep p, -p to null
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 24 Dec 2020 16:04:40 +0000 (17:04 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 12 Jan 2021 19:24:23 +0000 (20:24 +0100)
commit7ecad2e4ced180b4fdebc6b7bf6d26d83b454318
treed79068f0be7624d10ca5f85edad7b7ea059d68e1
parent79f99ba65d96a35a79911daf1b67559dd52a684d
[InstSimplify] Don't fold gep p, -p to null

This is a partial fix for https://bugs.llvm.org/show_bug.cgi?id=44403.
Folding gep p, q-p to q is only legal if p and q have the same
provenance. This fold should probably be guarded by something like
getUnderlyingObject(p) == getUnderlyingObject(q).

This patch is a partial fix that removes the special handling for
gep p, 0-p, which will fold to a null pointer, which would certainly
not pass an underlying object check (unless p is also null, in which
case this would fold trivially anyway). Folding to a null pointer
is particularly problematic due to the special handling it receives
in many places, making end-to-end miscompiles more likely.

Differential Revision: https://reviews.llvm.org/D93820
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstSimplify/gep.ll