diff options
author | Tyker <tyker1@outlook.com> | 2021-02-09 19:20:50 +0100 |
---|---|---|
committer | Tyker <tyker1@outlook.com> | 2021-02-13 13:03:11 +0100 |
commit | 642e9225c6e89f2be84d71c5c19da1b19c33314e (patch) | |
tree | 6187656404a43a5694a88f1fc7549337ba40fd43 /llvm/lib/Analysis/Loads.cpp | |
parent | 7ad0c573bd4a68dc81886037457d47daa3d6aa24 (diff) | |
download | llvm-642e9225c6e89f2be84d71c5c19da1b19c33314e.zip llvm-642e9225c6e89f2be84d71c5c19da1b19c33314e.tar.gz llvm-642e9225c6e89f2be84d71c5c19da1b19c33314e.tar.bz2 |
reland [InstCombine] convert assumes to operand bundles
Instcombine will convert the nonnull and alignment assumption that use the boolean condtion
to an assumption that uses the operand bundles when knowledge retention is enabled.
Differential Revision: https://reviews.llvm.org/D82703
Diffstat (limited to 'llvm/lib/Analysis/Loads.cpp')
-rw-r--r-- | llvm/lib/Analysis/Loads.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp index d8f954f..af7ef98 100644 --- a/llvm/lib/Analysis/Loads.cpp +++ b/llvm/lib/Analysis/Loads.cpp @@ -12,6 +12,7 @@ #include "llvm/Analysis/Loads.h" #include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Analysis/AssumeBundleQueries.h" #include "llvm/Analysis/CaptureTracking.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/MemoryBuiltins.h" @@ -80,6 +81,31 @@ static bool isDereferenceableAndAlignedPointer( return isAligned(V, Offset, Alignment, DL); } + if (CtxI) { + /// Look through assumes to see if both dereferencability and alignment can + /// be provent by an assume + RetainedKnowledge AlignRK; + RetainedKnowledge DerefRK; + if (getKnowledgeForValue( + V, {Attribute::Dereferenceable, Attribute::Alignment}, nullptr, + [&](RetainedKnowledge RK, Instruction *Assume, auto) { + if (!isValidAssumeForContext(Assume, CtxI)) + return false; + if (RK.AttrKind == Attribute::Alignment) + AlignRK = std::max(AlignRK, RK); + if (RK.AttrKind == Attribute::Dereferenceable) + DerefRK = std::max(DerefRK, RK); + if (AlignRK && DerefRK && AlignRK.ArgValue >= Alignment.value() && + DerefRK.ArgValue >= Size.getZExtValue()) + return true; // We have found what we needed so we stop looking + return false; // Other assumes may have better information. so + // keep looking + })) + return true; + } + /// TODO refactor this function to be able to search independently for + /// Dereferencability and Alignment requirements. + // For GEPs, determine if the indexing lands within the allocated object. if (const GEPOperator *GEP = dyn_cast<GEPOperator>(V)) { const Value *Base = GEP->getPointerOperand(); |