#
c845c724 |
| 12-Jan-2021 |
Roman Lebedev <lebedev.ri@gmail.com> |
[Utils][SimplifyCFG] Port SplitBlock() to DomTreeUpdater
This is not nice, but it's the best transient solution possible, and is better than just duplicating the whole function.
The problem is, thi
[Utils][SimplifyCFG] Port SplitBlock() to DomTreeUpdater
This is not nice, but it's the best transient solution possible, and is better than just duplicating the whole function.
The problem is, this function is widely used, and it is not at all obvious that all the users could be painlessly switched to operate on DomTreeUpdater, and somehow i don't feel like porting all those users first.
This function is one of last three that not operate on DomTreeUpdater.
show more ...
|
#
b81f75fa |
| 12-Jan-2021 |
Roman Lebedev <lebedev.ri@gmail.com> |
[Utils] splitBlockBefore() always operates on DomTreeUpdater, so take it, not DomTree
Even though not all it's users operate on DomTreeUpdater, it itself internally operates on DomTreeUpdater, so it
[Utils] splitBlockBefore() always operates on DomTreeUpdater, so take it, not DomTree
Even though not all it's users operate on DomTreeUpdater, it itself internally operates on DomTreeUpdater, so it must mean everything is fine with that, so just do that globally.
show more ...
|
#
8e8d214c |
| 10-Jan-2021 |
Roman Lebedev <lebedev.ri@gmail.com> |
[NFCI][SimplifyCFG] Prefer to add Insert edges before Delete edges into DomTreeUpdater, if reasonable
This has a measurable impact on the number of DomTree recalculations. While this doesn't handle
[NFCI][SimplifyCFG] Prefer to add Insert edges before Delete edges into DomTreeUpdater, if reasonable
This has a measurable impact on the number of DomTree recalculations. While this doesn't handle all the cases, it deals with the most obvious ones.
show more ...
|
#
be0a31d1 |
| 07-Jan-2021 |
Roman Lebedev <lebedev.ri@gmail.com> |
[SimplifyCFG] DeleteDeadBlocks(): switch to non-permissive DomTree updates
No actual changes needed, DetatchDeadBlocks() was already doing the right thing.
|
#
66189212 |
| 07-Jan-2021 |
Roman Lebedev <lebedev.ri@gmail.com> |
[SimplifyCFG] MergeBlockIntoPredecessor(): switch to non-permissive DomTree updates
... which requires not deleting edges that were just deleted already, by not processing the same successor mor
[SimplifyCFG] MergeBlockIntoPredecessor(): switch to non-permissive DomTree updates
... which requires not deleting edges that were just deleted already, by not processing the same successor more than once.
show more ...
|
#
048f184e |
| 07-Jan-2021 |
Sidharth Baveja <sidharth.baveja@ibm.com> |
[SplitEdge] Add new parameter to SplitEdge to name the newly created basic block
Summary: Currently SplitEdge does not support passing in parameter which allows you to name the newly created BasicBl
[SplitEdge] Add new parameter to SplitEdge to name the newly created basic block
Summary: Currently SplitEdge does not support passing in parameter which allows you to name the newly created BasicBlock.
This patch updates the function such that the name of the block can be passed in, if users of this utility decide to do so.
Reviewed By: Whitney, bmahjour, asbirlea, jamieschmeiser
Differential Revision: https://reviews.llvm.org/D94176
show more ...
|
#
de6d43f1 |
| 04-Jan-2021 |
Whitney Tsang <whitneyt@ca.ibm.com> |
Revert "[LoopNest] Allow empty basic blocks without loops"
This reverts commit 9a17bff4f715a9f3ec89f4eacae8fdea1b74fe79.
|
#
9a17bff4 |
| 04-Jan-2021 |
Whitney Tsang <whitneyt@ca.ibm.com> |
[LoopNest] Allow empty basic blocks without loops
Allow loop nests with empty basic blocks without loops in different levels as perfect.
Reviewers: Meinersbur
Differential Revision: https://review
[LoopNest] Allow empty basic blocks without loops
Allow loop nests with empty basic blocks without loops in different levels as perfect.
Reviewers: Meinersbur
Differential Revision: https://reviews.llvm.org/D93665
show more ...
|
#
d76c1d22 |
| 28-Dec-2020 |
Yevgeny Rouban <yrouban@azul.com> |
[RS4GC] Lazily set changed flag when folding single entry phis
The function FoldSingleEntryPHINodes() is changed to return if it has changed IR or not. This return value is used by RS4GC to set the
[RS4GC] Lazily set changed flag when folding single entry phis
The function FoldSingleEntryPHINodes() is changed to return if it has changed IR or not. This return value is used by RS4GC to set the MadeChange flag respectively.
Reviewed By: reames Differential Revision: https://reviews.llvm.org/D93810
show more ...
|
#
2a814cd9 |
| 18-Dec-2020 |
Whitney Tsang <whitneyt@ca.ibm.com> |
Ensure SplitEdge to return the new block between the two given blocks
This PR implements the function splitBasicBlockBefore to address an issue that occurred during SplitEdge(BB, Succ, ...), inside
Ensure SplitEdge to return the new block between the two given blocks
This PR implements the function splitBasicBlockBefore to address an issue that occurred during SplitEdge(BB, Succ, ...), inside splitBlockBefore. The issue occurs in SplitEdge when the Succ has a single predecessor and the edge between the BB and Succ is not critical. This produces the result ‘BB->Succ->New’. The new function splitBasicBlockBefore was added to splitBlockBefore to handle the issue and now produces the correct result ‘BB->New->Succ’.
Below is an example of splitting the block bb1 at its first instruction.
/// Original IR bb0: br bb1 bb1: %0 = mul i32 1, 2 br bb2 bb2: /// IR after splitEdge(bb0, bb1) using splitBasicBlock bb0: br bb1 bb1: br bb1.split bb1.split: %0 = mul i32 1, 2 br bb2 bb2: /// IR after splitEdge(bb0, bb1) using splitBasicBlockBefore bb0: br bb1.split bb1.split br bb1 bb1: %0 = mul i32 1, 2 br bb2 bb2:
Differential Revision: https://reviews.llvm.org/D92200
show more ...
|
#
511cfe94 |
| 17-Dec-2020 |
Bangtian Liu <bangtian@cs.toronto.edu> |
Revert "Ensure SplitEdge to return the new block between the two given blocks"
This reverts commit d20e0c3444ad9ada550d9d6d1d56fd72948ae444.
|
#
d20e0c34 |
| 17-Dec-2020 |
Bangtian Liu <bangtian@cs.toronto.edu> |
Ensure SplitEdge to return the new block between the two given blocks
This PR implements the function splitBasicBlockBefore to address an issue that occurred during SplitEdge(BB, Succ, ...), inside
Ensure SplitEdge to return the new block between the two given blocks
This PR implements the function splitBasicBlockBefore to address an issue that occurred during SplitEdge(BB, Succ, ...), inside splitBlockBefore. The issue occurs in SplitEdge when the Succ has a single predecessor and the edge between the BB and Succ is not critical. This produces the result ‘BB->Succ->New’. The new function splitBasicBlockBefore was added to splitBlockBefore to handle the issue and now produces the correct result ‘BB->New->Succ’.
Below is an example of splitting the block bb1 at its first instruction.
/// Original IR bb0: br bb1 bb1: %0 = mul i32 1, 2 br bb2 bb2: /// IR after splitEdge(bb0, bb1) using splitBasicBlock bb0: br bb1 bb1: br bb1.split bb1.split: %0 = mul i32 1, 2 br bb2 bb2: /// IR after splitEdge(bb0, bb1) using splitBasicBlockBefore bb0: br bb1.split bb1.split br bb1 bb1: %0 = mul i32 1, 2 br bb2 bb2:
Differential Revision: https://reviews.llvm.org/D92200
show more ...
|
#
c1075720 |
| 16-Dec-2020 |
Bangtian Liu <bangtian@cs.toronto.edu> |
Revert "Ensure SplitEdge to return the new block between the two given blocks"
This reverts commit cf638d793c489632bbcf0ee0fbf9d0f8c76e1f48.
|
#
cf638d79 |
| 15-Dec-2020 |
Bangtian Liu <bangtian@cs.toronto.edu> |
Ensure SplitEdge to return the new block between the two given blocks
This PR implements the function splitBasicBlockBefore to address an issue that occurred during SplitEdge(BB, Succ, ...), inside
Ensure SplitEdge to return the new block between the two given blocks
This PR implements the function splitBasicBlockBefore to address an issue that occurred during SplitEdge(BB, Succ, ...), inside splitBlockBefore. The issue occurs in SplitEdge when the Succ has a single predecessor and the edge between the BB and Succ is not critical. This produces the result ‘BB->Succ->New’. The new function splitBasicBlockBefore was added to splitBlockBefore to handle the issue and now produces the correct result ‘BB->New->Succ’.
Below is an example of splitting the block bb1 at its first instruction.
/// Original IR bb0: br bb1 bb1: %0 = mul i32 1, 2 br bb2 bb2: /// IR after splitEdge(bb0, bb1) using splitBasicBlock bb0: br bb1 bb1: br bb1.split bb1.split: %0 = mul i32 1, 2 br bb2 bb2: /// IR after splitEdge(bb0, bb1) using splitBasicBlockBefore bb0: br bb1.split bb1.split br bb1 bb1: %0 = mul i32 1, 2 br bb2 bb2:
Differential Revision: https://reviews.llvm.org/D92200
show more ...
|
#
43c0e4f6 |
| 19-Nov-2020 |
Kazu Hirata <kazu@google.com> |
[Transforms] Use llvm::is_contained (NFC)
|
#
5a3ef55a |
| 06-Oct-2020 |
Vedant Kumar <vsk@apple.com> |
[Utils] Skip RemoveRedundantDbgInstrs in MergeBlockIntoPredecessor (PR47746)
This patch changes MergeBlockIntoPredecessor to skip the call to RemoveRedundantDbgInstrs, in effect partially reverting
[Utils] Skip RemoveRedundantDbgInstrs in MergeBlockIntoPredecessor (PR47746)
This patch changes MergeBlockIntoPredecessor to skip the call to RemoveRedundantDbgInstrs, in effect partially reverting D71480 due to some compile-time issues spotted in LoopUnroll and SimplifyCFG.
The call to RemoveRedundantDbgInstrs appears to have changed the worst-case behavior of the merging utility. Loosely speaking, it seems to have gone from O(#phis) to O(#insts).
It might not be possible to mitigate this by scanning a block to determine whether there are any debug intrinsics to remove, since such a scan costs O(#insts).
So: skip the call to RemoveRedundantDbgInstrs. There's surprisingly little fallout from this, and most of it can be addressed by doing RemoveRedundantDbgInstrs later. The exception is (the block-local version of) SimplifyCFG, where it might just be too expensive to call RemoveRedundantDbgInstrs.
Differential Revision: https://reviews.llvm.org/D88928
show more ...
|
Revision tags: llvmorg-11.0.0-rc5, llvmorg-11.0.0-rc4, llvmorg-11.0.0-rc3, llvmorg-11.0.0-rc2, llvmorg-11.0.0-rc1 |
|
#
11e879d4 |
| 17-Jul-2020 |
Sidharth Baveja <sidharth.baveja@ibm.com> |
[Loop Simplify] Resolve an issue where metadata is not applied to a loop latch.
Summary: This patch resolves an issue where the metadata of a loop is not added to the new loop latch, and not removed
[Loop Simplify] Resolve an issue where metadata is not applied to a loop latch.
Summary: This patch resolves an issue where the metadata of a loop is not added to the new loop latch, and not removed from the old loop latch. This issue occurs in the SplitBlockPredecessors function, which adds a new block in a loop, and in the case that the block passed into this function is the header of the loop, the loop can be modified such that the latch of the loop is replaced. This patch applies to the Loop Simplify pass since it ensures that each loop has exit blocks which only have predecessors that are inside of the loop. In the case that this is not true, the pass will create a new exit block for the loop. This guarantees that the loop preheader/header will dominate the exit blocks.
Author: sidbav (Sidharth Baveja)
Reviewers: asbirlea (Alina Sbirlea), chandlerc (Chandler Carruth), Whitney (Whitney Tsang), bmahjour (Bardia Mahjour)
Reviewed By: asbirlea (Alina Sbirlea)
Subscribers: hiraditya (Aditya Kumar), llvm-commits
Tag: LLVM
Differential Revision: https://reviews.llvm.org/D83869
show more ...
|
Revision tags: llvmorg-12-init, llvmorg-10.0.1, llvmorg-10.0.1-rc4, llvmorg-10.0.1-rc3, llvmorg-10.0.1-rc2 |
|
#
15b6730f |
| 28-May-2020 |
Sidharth Baveja <Sidharth.Baveja@ibm.com> |
Create utility function to Merge Adjacent Basic Blocks
Summary: The following code from /llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp can be used by other transformations:
while (!MergeBlocks.emp
Create utility function to Merge Adjacent Basic Blocks
Summary: The following code from /llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp can be used by other transformations:
while (!MergeBlocks.empty()) { BasicBlock *BB = *MergeBlocks.begin(); BranchInst *Term = dyn_cast<BranchInst>(BB->getTerminator()); if (Term && Term->isUnconditional() && L->contains(Term->getSuccessor(0))) { BasicBlock *Dest = Term->getSuccessor(0); BasicBlock *Fold = Dest->getUniquePredecessor(); if (MergeBlockIntoPredecessor(Dest, &DTU, LI)) { // Don't remove BB and add Fold as they are the same BB assert(Fold == BB); (void)Fold; MergeBlocks.erase(Dest); } else MergeBlocks.erase(BB); } else MergeBlocks.erase(BB); } Hence it should be separated into its own utility function.
Authored By: sidbav Reviewer: Whitney, Meinersbur, asbirlea, dmgreen, etiotto Reviewed By: asbirlea Subscribers: hiraditya, zzheng, llvm-commits Tag: LLVM Differential Revision: https://reviews.llvm.org/D80583
show more ...
|
Revision tags: llvmorg-10.0.1-rc1 |
|
#
8c11bc0c |
| 15-Apr-2020 |
Sameer Sahasrabuddhe <sameer.sahasrabuddhe@amd.com> |
Introduce fix-irreducible pass
An irreducible SCC is one which has multiple "header" blocks, i.e., blocks with control-flow edges incident from outside the SCC. This pass converts an irreducible SCC
Introduce fix-irreducible pass
An irreducible SCC is one which has multiple "header" blocks, i.e., blocks with control-flow edges incident from outside the SCC. This pass converts an irreducible SCC into a natural loop by introducing a single new header block and redirecting all the edges on the original headers to this new block.
This is a useful workaround for a limitation in the structurizer which, which produces incorrect control flow in the presence of irreducible regions. The AMDGPU backend provides an option to enable this pass before the structurizer, which may eventually be enabled by default.
Reviewed By: nhaehnle
Differential Revision: https://reviews.llvm.org/D77198
This restores commit 2ada8e2525dd2653f30c8696a27162a3b1647d66.
Originally reverted with commit 44e09b59b869a91bf47d76e8bc569d9ee91ad145.
show more ...
|
#
44e09b59 |
| 15-Apr-2020 |
Sameer Sahasrabuddhe <sameer.sahasrabuddhe@amd.com> |
Revert "Introduce fix-irreducible pass"
This reverts commit 2ada8e2525dd2653f30c8696a27162a3b1647d66.
Buildbots produced compilation errors which I was not able to quickly reproduce locally. Need m
Revert "Introduce fix-irreducible pass"
This reverts commit 2ada8e2525dd2653f30c8696a27162a3b1647d66.
Buildbots produced compilation errors which I was not able to quickly reproduce locally. Need more time to investigate.
show more ...
|
#
2ada8e25 |
| 15-Apr-2020 |
Sameer Sahasrabuddhe <sameer.sahasrabuddhe@amd.com> |
Introduce fix-irreducible pass
An irreducible SCC is one which has multiple "header" blocks, i.e., blocks with control-flow edges incident from outside the SCC. This pass converts an irreducible SCC
Introduce fix-irreducible pass
An irreducible SCC is one which has multiple "header" blocks, i.e., blocks with control-flow edges incident from outside the SCC. This pass converts an irreducible SCC into a natural loop by introducing a single new header block and redirecting all the edges on the original headers to this new block.
This is a useful workaround for a limitation in the structurizer which, which produces incorrect control flow in the presence of irreducible regions. The AMDGPU backend provides an option to enable this pass before the structurizer, which may eventually be enabled by default.
Reviewed By: nhaehnle
Differential Revision: https://reviews.llvm.org/D77198
show more ...
|
#
3cbbded6 |
| 28-Mar-2020 |
Sameer Sahasrabuddhe <sameer.sahasrabuddhe@amd.com> |
Introduce unify-loop-exits pass.
For each natural loop with multiple exit blocks, this pass creates a new block N such that all exiting blocks now branch to N, and then control flow is redistributed
Introduce unify-loop-exits pass.
For each natural loop with multiple exit blocks, this pass creates a new block N such that all exiting blocks now branch to N, and then control flow is redistributed to all the original exit blocks.
The bulk of the tranformation is a new function introduced in BasicBlockUtils that an redirect control flow from a set of incoming blocks to a set of outgoing blocks via a common "hub".
This is a useful workaround for a limitation in the structurizer which incorrectly orders blocks when processing a nest of loops. This pass bypasses that issue by ensuring that each natural loop is recognized as a separate region. Since the structurizer is a region pass, it no longer sees a nest of loops in a single region, and instead processes each "level" in the nesting as a separate region.
The AMDGPU backend provides a new option to enable this pass before the structurizer, which may eventually be enabled by default.
Reviewers: madhur13490, arsenm, nhaehnle
Reviewed By: nhaehnle
Differential Revision: https://reviews.llvm.org/D75865
show more ...
|
Revision tags: llvmorg-10.0.0, llvmorg-10.0.0-rc6, llvmorg-10.0.0-rc5, llvmorg-10.0.0-rc4 |
|
#
ee9a3eba |
| 04-Mar-2020 |
Guozhi Wei <carrot@google.com> |
[CodeGenPrepare] Handle ExtractValueInst in dupRetToEnableTailCallOpts
As the test case shows if there is an ExtractValueInst in the Ret block, function dupRetToEnableTailCallOpts can't duplicat
[CodeGenPrepare] Handle ExtractValueInst in dupRetToEnableTailCallOpts
As the test case shows if there is an ExtractValueInst in the Ret block, function dupRetToEnableTailCallOpts can't duplicate it into the block containing call. So later no tail call is generated in CodeGen.
This patch adds the ExtractValueInst handling code in function dupRetToEnableTailCallOpts and FoldReturnIntoUncondBranch, and later tail call can be generated for this case.
Differential Revision: https://reviews.llvm.org/D74242
show more ...
|
Revision tags: llvmorg-10.0.0-rc3 |
|
#
2fe45769 |
| 21-Feb-2020 |
Bill Wendling <isanbard@gmail.com> |
Filter callbr insts from critical edge splitting
Similarly to how splitting predecessors with an indirectbr isn't handled in the generic way, we also shouldn't split callbrs, for similar reasons.
|
Revision tags: llvmorg-10.0.0-rc2, llvmorg-10.0.0-rc1 |
|
#
a0f627d5 |
| 23-Jan-2020 |
Alina Sbirlea <asbirlea@google.com> |
[IndVarSimplify] Fix for MemorySSA preserve.
|