[llvm] 3f71b42 - [Attributor] Preserve BBs and instructions added in AA manifests
Giorgis Georgakoudis via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 21 11:27:06 PDT 2021
Author: Giorgis Georgakoudis
Date: 2021-07-21T11:27:00-07:00
New Revision: 3f71b425b20838d972151aa65a355b489caf4d8e
URL: https://github.com/llvm/llvm-project/commit/3f71b425b20838d972151aa65a355b489caf4d8e
DIFF: https://github.com/llvm/llvm-project/commit/3f71b425b20838d972151aa65a355b489caf4d8e.diff
LOG: [Attributor] Preserve BBs and instructions added in AA manifests
Manifesting AbstractAttributes may add new BBs in the IR. This patch provides an interface to register those BBs in the Attributor so that those BBs and containing instructions are not deleted as dead.
Reviewed By: jdoerfert
Differential Revision: https://reviews.llvm.org/D106383
Added:
Modified:
llvm/include/llvm/Transforms/IPO/Attributor.h
llvm/lib/Transforms/IPO/Attributor.cpp
llvm/lib/Transforms/IPO/OpenMPOpt.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h
index 9d6681791dd2..2d0eab855167 100644
--- a/llvm/include/llvm/Transforms/IPO/Attributor.h
+++ b/llvm/include/llvm/Transforms/IPO/Attributor.h
@@ -1487,6 +1487,12 @@ struct Attributor {
/// triggers deletion of trivially dead istructions.
void deleteAfterManifest(BasicBlock &BB) { ToBeDeletedBlocks.insert(&BB); }
+ // Record that \p BB is added during the manifest of an AA. Added basic blocks
+ // are preserved in the IR.
+ void registerManifestAddedBasicBlock(BasicBlock &BB) {
+ ManifestAddedBlocks.insert(&BB);
+ }
+
/// Record that \p F is deleted after information was manifested.
void deleteAfterManifest(Function &F) {
if (DeleteFns)
@@ -1979,6 +1985,7 @@ struct Attributor {
///{
SmallPtrSet<Function *, 8> ToBeDeletedFunctions;
SmallPtrSet<BasicBlock *, 8> ToBeDeletedBlocks;
+ SmallPtrSet<BasicBlock *, 8> ManifestAddedBlocks;
SmallDenseSet<WeakVH, 8> ToBeDeletedInsts;
///}
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index 3ec75bf4a6df..f91d56ec8464 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -801,6 +801,9 @@ bool Attributor::isAssumedDead(const Instruction &I,
const IRPosition::CallBaseContext *CBCtx =
QueryingAA ? QueryingAA->getCallBaseContext() : nullptr;
+ if (ManifestAddedBlocks.contains(I.getParent()))
+ return false;
+
if (!FnLivenessAA)
FnLivenessAA =
lookupAAFor<AAIsDead>(IRPosition::function(*I.getFunction(), CBCtx),
@@ -1441,7 +1444,9 @@ ChangeStatus Attributor::cleanupIR() {
<< ToBeDeletedBlocks.size() << " blocks and "
<< ToBeDeletedInsts.size() << " instructions and "
<< ToBeChangedValues.size() << " values and "
- << ToBeChangedUses.size() << " uses\n");
+ << ToBeChangedUses.size() << " uses. "
+ << "Preserve manifest added " << ManifestAddedBlocks.size()
+ << " blocks\n");
SmallVector<WeakTrackingVH, 32> DeadInsts;
SmallVector<Instruction *, 32> TerminatorsToFold;
@@ -1602,6 +1607,9 @@ ChangeStatus Attributor::cleanupIR() {
assert(isRunOn(*BB->getParent()) &&
"Cannot delete a block outside the current SCC!");
CGModifiedFunctions.insert(BB->getParent());
+ // Do not delete BBs added during manifests of AAs.
+ if (ManifestAddedBlocks.contains(BB))
+ continue;
ToBeDeletedBBs.push_back(BB);
}
// Actually we do not delete the blocks but squash them into a single
diff --git a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
index ff66fb3a003c..c2c212960fd6 100644
--- a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
+++ b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
@@ -3043,6 +3043,14 @@ struct AAKernelInfoFunction : AAKernelInfo {
Kernel, UserCodeEntryBB);
BasicBlock *StateMachineDoneBarrierBB = BasicBlock::Create(
Ctx, "worker_state_machine.done.barrier", Kernel, UserCodeEntryBB);
+ A.registerManifestAddedBasicBlock(*InitBB);
+ A.registerManifestAddedBasicBlock(*UserCodeEntryBB);
+ A.registerManifestAddedBasicBlock(*StateMachineBeginBB);
+ A.registerManifestAddedBasicBlock(*StateMachineFinishedBB);
+ A.registerManifestAddedBasicBlock(*StateMachineIsActiveCheckBB);
+ A.registerManifestAddedBasicBlock(*StateMachineIfCascadeCurrentBB);
+ A.registerManifestAddedBasicBlock(*StateMachineEndParallelBB);
+ A.registerManifestAddedBasicBlock(*StateMachineDoneBarrierBB);
const DebugLoc &DLoc = KernelInitCB->getDebugLoc();
ReturnInst::Create(Ctx, StateMachineFinishedBB)->setDebugLoc(DLoc);
More information about the llvm-commits
mailing list