diff options
author | Eli Friedman <efriedma@quicinc.com> | 2020-05-16 17:55:18 -0700 |
---|---|---|
committer | Eli Friedman <efriedma@quicinc.com> | 2020-05-20 16:37:20 -0700 |
commit | f26bdb539e8acef23e2a0370408521a6458001ee (patch) | |
tree | 858d012071872321fd2f4417bd10e90b6c414a33 /llvm/lib/Analysis/Loads.cpp | |
parent | 770ba4f0516e9af7279767ae90e283c3755c0c97 (diff) | |
download | llvm-f26bdb539e8acef23e2a0370408521a6458001ee.zip llvm-f26bdb539e8acef23e2a0370408521a6458001ee.tar.gz llvm-f26bdb539e8acef23e2a0370408521a6458001ee.tar.bz2 |
Make Value::getPointerAlignment() return an Align, not a MaybeAlign.
If we don't know anything about the alignment of a pointer, Align(1) is
still correct: all pointers are at least 1-byte aligned.
Included in this patch is a bugfix for an issue discovered during this
cleanup: pointers with "dereferenceable" attributes/metadata were
assumed to be aligned according to the type of the pointer. This
wasn't intentional, as far as I can tell, so Loads.cpp was fixed to
stop making this assumption. Frontends may need to be updated. I
updated clang's handling of C++ references, and added a release note for
this.
Differential Revision: https://reviews.llvm.org/D80072
Diffstat (limited to 'llvm/lib/Analysis/Loads.cpp')
-rw-r--r-- | llvm/lib/Analysis/Loads.cpp | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp index e72ea9b..470a453 100644 --- a/llvm/lib/Analysis/Loads.cpp +++ b/llvm/lib/Analysis/Loads.cpp @@ -27,24 +27,12 @@ using namespace llvm; -static MaybeAlign getBaseAlign(const Value *Base, const DataLayout &DL) { - if (const MaybeAlign PA = Base->getPointerAlignment(DL)) - return *PA; - Type *const Ty = Base->getType()->getPointerElementType(); - if (!Ty->isSized()) - return None; - return Align(DL.getABITypeAlignment(Ty)); -} - static bool isAligned(const Value *Base, const APInt &Offset, Align Alignment, const DataLayout &DL) { - if (MaybeAlign BA = getBaseAlign(Base, DL)) { - const APInt APBaseAlign(Offset.getBitWidth(), BA->value()); - const APInt APAlign(Offset.getBitWidth(), Alignment.value()); - assert(APAlign.isPowerOf2() && "must be a power of 2!"); - return APBaseAlign.uge(APAlign) && !(Offset & (APAlign - 1)); - } - return false; + Align BA = Base->getPointerAlignment(DL); + const APInt APAlign(Offset.getBitWidth(), Alignment.value()); + assert(APAlign.isPowerOf2() && "must be a power of 2!"); + return BA >= Alignment && !(Offset & (APAlign - 1)); } /// Test if V is always a pointer to allocated and suitably aligned memory for |