#
c9504954 |
| 31-Oct-2019 |
Mikael Holmen <mikael.holmen@ericsson.com> |
[MustExecute] Silence clang warning about unused captured 'this'
New code introduced in fe799c97fa caused clang to complain with
../lib/Analysis/MustExecute.cpp:360:34: error: lambda capture 'this'
[MustExecute] Silence clang warning about unused captured 'this'
New code introduced in fe799c97fa caused clang to complain with
../lib/Analysis/MustExecute.cpp:360:34: error: lambda capture 'this' is not used [-Werror,-Wunused-lambda-capture] GetterTy<LoopInfo> LIGetter = [this](const Function &F) { ^~~~ ../lib/Analysis/MustExecute.cpp:365:44: error: lambda capture 'this' is not used [-Werror,-Wunused-lambda-capture] GetterTy<PostDominatorTree> PDTGetter = [this](const Function &F) { ^~~~ 2 errors generated.
show more ...
|
#
fe799c97 |
| 13-Oct-2019 |
Johannes Doerfert <johannes@jdoerfert.de> |
[MustExecute] Forward iterate over conditional branches
Summary: If a conditional branch is encountered we can try to find a join block where the execution is known to continue. This means finding a
[MustExecute] Forward iterate over conditional branches
Summary: If a conditional branch is encountered we can try to find a join block where the execution is known to continue. This means finding a suitable block, e.g., the immediate post dominator of the conditional branch, and proofing control will always reach that block.
This patch implements different techniques that work with and without provided analysis.
Reviewers: uenoku, sstefan1, hfinkel
Subscribers: hiraditya, bollu, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D68933
show more ...
|
Revision tags: llvmorg-9.0.0, llvmorg-9.0.0-rc6, llvmorg-9.0.0-rc5, llvmorg-9.0.0-rc4, llvmorg-9.0.0-rc3 |
|
#
a5b10b46 |
| 23-Aug-2019 |
Johannes Doerfert <jdoerfert@anl.gov> |
[MustExec] Add a generic "must-be-executed-context" explorer
Given an instruction I, the MustBeExecutedContextExplorer allows to easily traverse instructions that are guaranteed to be executed whene
[MustExec] Add a generic "must-be-executed-context" explorer
Given an instruction I, the MustBeExecutedContextExplorer allows to easily traverse instructions that are guaranteed to be executed whenever I is. For now, these instruction have to be statically "after" I, in the same or different basic blocks.
This patch also adds a pass which prints the must-be-executed-context for each instruction in a module. It is used to test the MustBeExecutedContextExplorer, for now on the examples given in the class comment of the MustBeExecutedIterator.
Differential Revision: https://reviews.llvm.org/D65186
llvm-svn: 369765
show more ...
|
Revision tags: llvmorg-9.0.0-rc2, llvmorg-9.0.0-rc1, llvmorg-10-init, llvmorg-8.0.1, llvmorg-8.0.1-rc4, llvmorg-8.0.1-rc3, llvmorg-8.0.1-rc2 |
|
#
3860aad6 |
| 27-May-2019 |
Xing Xue <xingxue@outlook.com> |
[MustExecute] Improve MustExecute to correctly handle loop nest
Summary: for.outer: br for.inner for.inner: LI <loop invariant load instruction> for.inner.latch: br for.inner, for.outer.latch
[MustExecute] Improve MustExecute to correctly handle loop nest
Summary: for.outer: br for.inner for.inner: LI <loop invariant load instruction> for.inner.latch: br for.inner, for.outer.latch for.outer.latch: br for.outer, for.outer.exit
LI is a loop invariant load instruction that post dominate for.outer, so LI should be able to move out of the loop nest. However, there is a bug in allLoopPathsLeadToBlock().
Current algorithm of allLoopPathsLeadToBlock()
1. get all the transitive predecessors of the basic block LI belongs to (for.inner) ==> for.outer, for.inner.latch 2. if any successors of any of the predecessors are not for.inner or for.inner's predecessors, then return false 3. return true
Although for.inner.latch is for.inner's predecessor, but for.inner dominates for.inner.latch, which means if for.inner.latch is ever executed, for.inner should be as well. It should not return false for cases like this.
Author: Whitney (committed by xingxue)
Reviewers: kbarton, jdoerfert, Meinersbur, hfinkel, fhahn
Reviewed By: jdoerfert
Subscribers: hiraditya, jsji, llvm-commits, etiotto, bmahjour
Tags: #LLVM
Differential Revision: https://reviews.llvm.org/D62418
llvm-svn: 361762
show more ...
|
Revision tags: llvmorg-8.0.1-rc1, llvmorg-8.0.0, llvmorg-8.0.0-rc5, llvmorg-8.0.0-rc4, llvmorg-8.0.0-rc3, llvmorg-7.1.0, llvmorg-7.1.0-rc1, llvmorg-8.0.0-rc2, llvmorg-8.0.0-rc1 |
|
#
2946cd70 |
| 19-Jan-2019 |
Chandler Carruth <chandlerc@gmail.com> |
Update the file headers across all of the LLVM projects in the monorepo to reflect the new license.
We understand that people may be surprised that we're moving the header entirely to discuss the ne
Update the file headers across all of the LLVM projects in the monorepo to reflect the new license.
We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach.
Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository.
llvm-svn: 351636
show more ...
|
#
4615a505 |
| 09-Jan-2019 |
Max Kazantsev <max.kazantsev@azul.com> |
[IPT] Drop cache less eagerly in GVN and LoopSafetyInfo
Current strategy of dropping `InstructionPrecedenceTracking` cache is to invalidate the entire basic block whenever we change its contents. In
[IPT] Drop cache less eagerly in GVN and LoopSafetyInfo
Current strategy of dropping `InstructionPrecedenceTracking` cache is to invalidate the entire basic block whenever we change its contents. In fact, `InstructionPrecedenceTracking` has 2 internal strictures: `OrderedInstructions` that is needed to be invalidated whenever the contents changes, and the map with first special instructions in block. This second map does not need an update if we add/remove a non-special instuction because it cannot affect the contents of this map.
This patch changes API of `InstructionPrecedenceTracking` so that it now accounts for reasons under which we invalidate blocks. This should lead to much less recalculations of the map and should save us some compile time because in practice we don't typically add/remove special instructions.
Differential Revision: https://reviews.llvm.org/D54462 Reviewed By: efriedma
llvm-svn: 350694
show more ...
|
Revision tags: llvmorg-7.0.1, llvmorg-7.0.1-rc3 |
|
#
7d49a3a8 |
| 12-Nov-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[LICM] Hoist guards from non-header blocks
This patch relaxes overconservative checks on whether or not we could write memory before we execute an instruction. This allows us to hoist guards out of
[LICM] Hoist guards from non-header blocks
This patch relaxes overconservative checks on whether or not we could write memory before we execute an instruction. This allows us to hoist guards out of loops even if they are not in the header block.
Differential Revision: https://reviews.llvm.org/D50891 Reviewed By: fedor.sergeev
llvm-svn: 346643
show more ...
|
#
4855b74f |
| 06-Nov-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Turn collectTransitivePredecessors into a static function
llvm-svn: 346217
|
Revision tags: llvmorg-7.0.1-rc2, llvmorg-7.0.1-rc1 |
|
#
bb84407f |
| 01-Nov-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Specialize public API of ICFLoopSafetyInfo for insertions and removals
llvm-svn: 345822
|
#
5f9acd27 |
| 16-Oct-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Introduce ICFLoopSafetyInfo
This is an alternative implementation of LoopSafetyInfo that uses the implicit control flow tracking to give precise answers on queries "whether or not this block c
[NFC] Introduce ICFLoopSafetyInfo
This is an alternative implementation of LoopSafetyInfo that uses the implicit control flow tracking to give precise answers on queries "whether or not this block contains throwing instructions". This rules out false-positive answers on LoopSafetyInfo's queries.
This patch only introduces the new implementation. It is not currently used in any pass. The enabling patches will go separately, through review.
The plan is to completely replace all uses of LoopSafetyInfo with ICFLoopSafetyInfo in the future, but to avoid introducing functional problems, we will do it pass by pass.
llvm-svn: 344601
show more ...
|
#
87de55ad |
| 16-Oct-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Remove obsolete method headerMayThrow
llvm-svn: 344596
|
#
9c90ec2f |
| 16-Oct-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Make LoopSafetyInfo abstract to allow alternative implementations
llvm-svn: 344592
|
#
8d56be70 |
| 16-Oct-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Encapsulate work with BlockColors in LoopSafetyInfo
llvm-svn: 344590
|
#
6a4f5e2a |
| 16-Oct-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Move block throw check inside allLoopPathsLeadToBlock
llvm-svn: 344588
|
#
c8466f93 |
| 16-Oct-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Turn isGuaranteedToExecute into a method
llvm-svn: 344587
|
Revision tags: llvmorg-7.0.0, llvmorg-7.0.0-rc3, llvmorg-7.0.0-rc2 |
|
#
bfbd4d1f |
| 21-Aug-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Factor out predecessors collection into a separate method
It may be reused in a different piece of logic.
Differential Revision: https://reviews.llvm.org/D50890 Reviewed By: reames
llvm-svn:
[NFC] Factor out predecessors collection into a separate method
It may be reused in a different piece of logic.
Differential Revision: https://reviews.llvm.org/D50890 Reviewed By: reames
llvm-svn: 340250
show more ...
|
#
7b78d392 |
| 17-Aug-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[MustExecute] Fix algorithmic bug in isGuaranteedToExecute. PR38514
The description of `isGuaranteedToExecute` does not correspond to its implementation. According to description, it should return `
[MustExecute] Fix algorithmic bug in isGuaranteedToExecute. PR38514
The description of `isGuaranteedToExecute` does not correspond to its implementation. According to description, it should return `true` if an instruction is executed under the assumption that its loop is *entered*. However there is a sophisticated alrogithm inside that tries to prove that the instruction is executed if the loop is *exited*, which is not the same thing for infinite loops. There is an attempt to protect from dealing with infinite loops by prohibiting loops without exit blocks, however an infinite loop can have exit blocks.
As result of that, MustExecute can falsely consider some blocks that are never entered as mustexec, and LICM can hoist dangerous instructions out of them basing on this fact. This may introduce UB to programs which did not contain it initially.
This patch removes the problematic algorithm and replaced it with a one which tries to prove what is required in description.
Differential Revision: https://reviews.llvm.org/D50558 Reviewed By: reames
llvm-svn: 339984
show more ...
|
#
a7415874 |
| 16-Aug-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Add missing const modifier
llvm-svn: 339844
|
#
530b8d1c |
| 15-Aug-2018 |
Max Kazantsev <max.kazantsev@azul.com> |
[NFC] Refactoring of LoopSafetyInfo, step 1
Turn structure into class, encapsulate methods, add clarifying comments.
Differential Revision: https://reviews.llvm.org/D50693 Reviewed By: reames
llvm
[NFC] Refactoring of LoopSafetyInfo, step 1
Turn structure into class, encapsulate methods, add clarifying comments.
Differential Revision: https://reviews.llvm.org/D50693 Reviewed By: reames
llvm-svn: 339752
show more ...
|
Revision tags: llvmorg-7.0.0-rc1 |
|
#
f78650a8 |
| 30-Jul-2018 |
Fangrui Song <maskray@google.com> |
Remove trailing space
sed -Ei 's/[[:space:]]+$//' include/**/*.{def,h,td} lib/**/*.{cpp,h}
llvm-svn: 338293
|
#
a57d7139 |
| 19-Jul-2018 |
Shoaib Meenai <smeenai@fb.com> |
[Analysis] Fix typo in assert. NFC
Test commit to see if my mailing list woes have been resolved.
llvm-svn: 337485
|
Revision tags: llvmorg-6.0.1, llvmorg-6.0.1-rc3, llvmorg-6.0.1-rc2 |
|
#
05b6a533 |
| 25-May-2018 |
David Stenberg <david.stenberg@ericsson.com> |
[MustExecute] Fix a debug invariant issue in isGuaranteedToExecute()
Summary: Look past debug intrinsics when querying whether an instruction is the first instruction in the header block. The commit
[MustExecute] Fix a debug invariant issue in isGuaranteedToExecute()
Summary: Look past debug intrinsics when querying whether an instruction is the first instruction in the header block. The commit includes a reproducer for a case where LICM would not hoist an instruction, due to the presence of the intrinsic.
A caveat with this commit is that the check will not work properly if the instruction at hand is a debug intrinsic. I assume that no one depends on isGuaranteedToExecute() to return true for debug intrinsics for these cases (and that this might be an indication of another debug invariant issue), so I thought that it was not worth adding that extra bit of complexity.
Reviewers: reames, anna
Reviewed By: anna
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D47197
llvm-svn: 333274
show more ...
|
#
5095883f |
| 18-May-2018 |
Serguei Katkov <serguei.katkov@azul.com> |
[LICM] Extend the MustExecute scope
CanProveNotTakenFirstIteration utility does not handle the case when condition of the branch is a constant. Add its handling.
Reviewers: reames, anna, mkazantsev
[LICM] Extend the MustExecute scope
CanProveNotTakenFirstIteration utility does not handle the case when condition of the branch is a constant. Add its handling.
Reviewers: reames, anna, mkazantsev Reviewed By: reames Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D46996
llvm-svn: 332695
show more ...
|
#
b4be38fc |
| 17-May-2018 |
Heejin Ahn <aheejin@gmail.com> |
[WebAssembly] Add Wasm personality and isScopedEHPersonality()
Summary: - Add wasm personality function - Re-categorize the existing `isFuncletEHPersonality()` function into two different functions:
[WebAssembly] Add Wasm personality and isScopedEHPersonality()
Summary: - Add wasm personality function - Re-categorize the existing `isFuncletEHPersonality()` function into two different functions: `isFuncletEHPersonality()` and `isScopedEHPersonality(). This becomes necessary as wasm EH uses scoped EH instructions (catchswitch, catchpad/ret, and cleanuppad/ret) but not outlined funclets. - Changed some callsites of `isFuncletEHPersonality()` to `isScopedEHPersonality()` if they are related to scoped EH IR-level stuff.
Reviewers: majnemer, dschuff, rnk
Subscribers: jfb, sbc100, jgravelle-google, eraman, JDevlieghere, sunfish, llvm-commits
Differential Revision: https://reviews.llvm.org/D45559
llvm-svn: 332667
show more ...
|
#
5f8f34e4 |
| 01-May-2018 |
Adrian Prantl <aprantl@apple.com> |
Remove \brief commands from doxygen comments.
We've been running doxygen with the autobrief option for a couple of years now. This makes the \brief markers into our comments redundant. Since they ar
Remove \brief commands from doxygen comments.
We've been running doxygen with the autobrief option for a couple of years now. This makes the \brief markers into our comments redundant. Since they are a visual distraction and we don't want to encourage more \brief markers in new code either, this patch removes them all.
Patch produced by
for i in $(git grep -l '\\brief'); do perl -pi -e 's/\\brief //g' $i & done
Differential Revision: https://reviews.llvm.org/D46290
llvm-svn: 331272
show more ...
|