diff options
author | Arthur Eubanks <aeubanks@google.com> | 2022-02-12 17:37:20 -0800 |
---|---|---|
committer | Arthur Eubanks <aeubanks@google.com> | 2022-02-13 10:35:38 -0800 |
commit | a9029a33ffe5cd458b51b18f7faf5d1c844f4bb4 (patch) | |
tree | 551d1331ed0a8a15fab9a6494b440f41d24963ec /llvm/lib | |
parent | d5f7ae7bfe3f3cb5dbc6ec4e8f3c88de41d72cd7 (diff) |
[OpaquePtr][ValueTracking] Check GEP source element type in isPointerOffset()
Fixes a MemCpyOpt miscompile with opaque pointers.
This function can be further cleaned up, but let's just fix the miscompile first.
Reviewed By: #opaque-pointers, nikic
Differential Revision: https://reviews.llvm.org/D119652
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 236db5ef26f8..2fd4565de0e7 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -7136,7 +7136,8 @@ Optional<int64_t> llvm::isPointerOffset(const Value *Ptr1, const Value *Ptr2, // potentially variable) indices. After that they handle some constant // offset, which determines their offset from each other. At this point, we // handle no other case. - if (!GEP1 || !GEP2 || GEP1->getOperand(0) != GEP2->getOperand(0)) + if (!GEP1 || !GEP2 || GEP1->getOperand(0) != GEP2->getOperand(0) || + GEP1->getSourceElementType() != GEP2->getSourceElementType()) return None; // Skip any common indices and track the GEP types. |