aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp
diff options
context:
space:
mode:
authorMomchil Velikov <momchil.velikov@arm.com>2021-04-09 13:54:39 +0100
committerMomchil Velikov <momchil.velikov@arm.com>2021-04-09 14:09:23 +0100
commitacf3279a037ff9c8591f551e92b8e7a8c27b61a4 (patch)
tree3c02296dd0ec80e376d5688b6f7cf4d49d9b0ecd /llvm/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp
parenta4ced03d3425f8808b09e3586659fdb5b9c4605d (diff)
downloadllvm-acf3279a037ff9c8591f551e92b8e7a8c27b61a4.zip
llvm-acf3279a037ff9c8591f551e92b8e7a8c27b61a4.tar.gz
llvm-acf3279a037ff9c8591f551e92b8e7a8c27b61a4.tar.bz2
For non-null pointer checks, do not descend through out-of-bounds GEPs
In LazyValueInfoImpl::isNonNullAtEndOfBlock we populate a set of pointers, known to be non-null at the end of a block (e.g. because we did a load through them). We then infer that any pointer, based on an element of this set is non-null as well ("based" here meaning a non-null pointer is the underlying object). This is incorrect, even if the base pointer was non-null, the value of a GEP, that lacks the inbounds` attribute, may be null. This issue appeared as miscompilation of the following test case: int puts(const char *); typedef struct iter { int *val; } iter_t; static long distance(iter_t first, iter_t last) { long r = 0; for (; first.val != last.val; first.val++) ++r; return r; } int main() { int arr[2] = {0}; iter_t i, j; i.val = arr; j.val = arr + 1; if (distance(i, j) >= 2) puts("failed"); else puts("passed"); } This fixes PR49662. Differential Revision: https://reviews.llvm.org/D99642
Diffstat (limited to 'llvm/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp')
0 files changed, 0 insertions, 0 deletions