diff options
author | Florian Hahn <flo@fhahn.com> | 2022-06-17 21:06:25 +0200 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2022-06-17 21:06:26 +0200 |
commit | e9cced27390ba38eac1144aa1240281a1edadec0 (patch) | |
tree | 9297f8fa9dd0df7698ba8968f4ce33f4bfc94c3b /llvm/lib/Transforms/Utils/LoopUtils.cpp | |
parent | f126643862611c02ec94e86da9b6f7921bc7a490 (diff) | |
download | llvm-e9cced27390ba38eac1144aa1240281a1edadec0.zip llvm-e9cced27390ba38eac1144aa1240281a1edadec0.tar.gz llvm-e9cced27390ba38eac1144aa1240281a1edadec0.tar.bz2 |
Recommit "[LAA] Initial support for runtime checks with pointer selects."
This reverts commit 7aa8a678826dea86ff3e6c7df9d2a8a6ef868f5d.
This version includes fixes to address issues uncovered after
the commit landed and discussed at D11448.
Those include:
* Limit select-traversal to selects inside the loop.
* Freeze pointers resulting from looking through selects to avoid
branch-on-poison.
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUtils.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index 965b35a..1310abb 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -1525,6 +1525,11 @@ static PointerBounds expandBounds(const RuntimeCheckingPtrGroup *CG, LLVM_DEBUG(dbgs() << "LAA: Adding RT check for range:\n"); Start = Exp.expandCodeFor(CG->Low, PtrArithTy, Loc); End = Exp.expandCodeFor(CG->High, PtrArithTy, Loc); + if (CG->NeedsFreeze) { + IRBuilder<> Builder(Loc); + Start = Builder.CreateFreeze(Start, Start->getName() + ".fr"); + End = Builder.CreateFreeze(End, End->getName() + ".fr"); + } LLVM_DEBUG(dbgs() << "Start: " << *CG->Low << " End: " << *CG->High << "\n"); return {Start, End}; } @@ -1623,6 +1628,11 @@ Value *llvm::addDiffRuntimeChecks( ConstantInt::get(Ty, IC * C.AccessSize)); Value *Sink = Expander.expandCodeFor(C.SinkStart, Ty, Loc); Value *Src = Expander.expandCodeFor(C.SrcStart, Ty, Loc); + if (C.NeedsFreeze) { + IRBuilder<> Builder(Loc); + Sink = Builder.CreateFreeze(Sink, Sink->getName() + ".fr"); + Src = Builder.CreateFreeze(Src, Src->getName() + ".fr"); + } Value *Diff = ChkBuilder.CreateSub(Sink, Src); Value *IsConflict = ChkBuilder.CreateICmpULT(Diff, VFTimesUFTimesSize, "diff.check"); |