Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,15 @@ class ControlFlowConversionState::Impl : public ControlFlowConversionState {
Instruction *persistedCombinedDivergentExitMask = nullptr;
};

struct LoopMasksInfoMap : DenseMap<Loop *, LoopMasksInfo> {
using DenseMap::DenseMap;

using DenseMap::at;
LoopMasksInfo &at(Loop *val) {
return const_cast<LoopMasksInfo &>(DenseMap::at(val));
}
};

/// @brief Create loop masks for the specified loop and its subloops.
/// @param[in] L Loop which should have its LoopMasksInfo created.
void createLoopMasks(Loop *L);
Expand Down Expand Up @@ -360,7 +369,7 @@ class ControlFlowConversionState::Impl : public ControlFlowConversionState {

BasicBlock *functionExitBlock = nullptr;
DenseSet<const Instruction *> blends;
DenseMap<Loop *, LoopMasksInfo> LoopMasks;
LoopMasksInfoMap LoopMasks;
};

STATISTIC(VeczCFGFail,
Expand Down Expand Up @@ -555,11 +564,6 @@ bool ControlFlowConversionState::Impl::convertToDataFlow() {
LI = &AM.getResult<LoopAnalysis>(F);
UVR = &AM.getResult<UniformValueAnalysis>(F);

// Make sure every loop has an entry in the masks table before we start.
for (auto *L : *LI) {
createLoopMasks(L);
}

if (!VU.choices().linearizeBOSCC()) {
ROSCCGadget ROSCC(*this);
ROSCC.run(F);
Expand All @@ -579,6 +583,13 @@ bool ControlFlowConversionState::Impl::convertToDataFlow() {
}
}

// Make sure every loop has an entry in the masks table.
// Do this after duplicateUniformRegions() since it may create additional
// loops.
for (auto *L : *LI) {
createLoopMasks(L);
}

// Reserve space for the masks table and default-construct all entries, to
// avoid re-hashing/element relocation on access.
MaskInfos.reserve(F.size());
Expand Down Expand Up @@ -960,7 +971,7 @@ bool ControlFlowConversionState::Impl::createExitMasks(BasicBlock &BB,
}

bool ControlFlowConversionState::Impl::createLoopExitMasks(LoopTag &LTag) {
auto &LMask = LoopMasks[LTag.loop];
auto &LMask = LoopMasks.at(LTag.loop);
// If the Loop already has a CombinedExitMasks we have already processed it.
if (LMask.combinedDivergentExitMask) {
return true;
Expand Down Expand Up @@ -1038,7 +1049,7 @@ bool ControlFlowConversionState::Impl::createLoopExitMasks(LoopTag &LTag) {
if (exitingLTag->loop != LTag.loop) {
if (Loop *nestedLoop = nextInnerLoopLeft(exitingBlock, exitBlock)) {
maskUpdateOperand =
LoopMasks[nestedLoop]
LoopMasks.at(nestedLoop)
.updatedPersistedDivergentExitMasks[exitingBlock];
}
}
Expand Down Expand Up @@ -1095,7 +1106,7 @@ bool ControlFlowConversionState::Impl::createCombinedLoopExitMask(
SmallVector<Loop::Edge, 1> exitEdges;
auto *const Loop = LTag.loop;
Loop->getExitEdges(exitEdges);
auto &LMask = LoopMasks[Loop];
auto &LMask = LoopMasks.at(Loop);
for (const Loop::Edge &EE : exitEdges) {
BasicBlock *exitingBlock = const_cast<BasicBlock *>(EE.first);
BasicBlock *exitBlock = const_cast<BasicBlock *>(EE.second);
Expand Down Expand Up @@ -1836,7 +1847,7 @@ bool ControlFlowConversionState::Impl::computeDivergentLoopPureExit(
BasicBlockTag &pureExitTag = DR->getOrCreateTag(pureExit);

// Set the tags.
auto &LMask = LoopMasks[LTag.loop];
auto &LMask = LoopMasks.at(LTag.loop);
MaskInfos[pureExit].entryMask = LMask.persistedCombinedDivergentExitMask;
pureExitTag.outermostExitedLoop = &LTag;

Expand Down Expand Up @@ -2174,7 +2185,7 @@ bool ControlFlowConversionState::Impl::generateDivergentLoopResults(

bool ControlFlowConversionState::Impl::generateDivergentLoopResultUpdates(
Value *LLV, LoopTag &LTag) {
auto &LMask = LoopMasks[LTag.loop];
auto &LMask = LoopMasks.at(LTag.loop);
Value *mask = LMask.combinedDivergentExitMask;
VECZ_ERROR_IF(!mask, "Divergent loop does not have an exit mask");
PHINode *PHI = LTag.loopResultPrevs[LLV];
Expand Down Expand Up @@ -2285,7 +2296,7 @@ bool ControlFlowConversionState::Impl::blendDivergentLoopExitMasks(
}
}

auto &LMask = LoopMasks[LTag.loop];
auto &LMask = LoopMasks.at(LTag.loop);
for (const Loop::Edge &EE : exitEdges) {
BasicBlock *exitingBlock = const_cast<BasicBlock *>(EE.first);
BasicBlock *exitBlock = const_cast<BasicBlock *>(EE.second);
Expand Down Expand Up @@ -3055,7 +3066,7 @@ bool ControlFlowConversionState::Impl::blendInstructions() {
}
}

auto &LMask = LoopMasks[LTag->loop];
auto &LMask = LoopMasks.at(LTag->loop);
for (auto &UPREM : LMask.updatedPersistedDivergentExitMasks) {
if (UPREM.first != header) {
blendMap[UPREM.second][header] =
Expand Down Expand Up @@ -3122,7 +3133,7 @@ bool ControlFlowConversionState::Impl::blendInstructions() {
auto *const srcLoop = srcTag.loop;
if (srcLoop && srcLoop->isLoopDivergent()) {
if (dst != srcLoop->header) {
auto &srcMasks = LoopMasks[srcLoop->loop];
auto &srcMasks = LoopMasks.at(srcLoop->loop);
const auto &headerTag = DR->getTag(srcLoop->header);

// If 'opDef' is an update loop exit mask, set an entry point in
Expand Down