220 auto & correlation = correlationOpt.value();
222 if (!
heuristic_->shouldUnswitchLoop(*correlation))
244 for (
const auto & oldLoopVar : oldThetaNode.
GetLoopVars())
245 stage1SMap.
insert(oldLoopVar.pre, oldLoopVar.input->origin());
253 &stage1SMap.
lookup(*oldGammaNode->predicate()->origin()),
254 oldGammaNode->nsubregions());
256 const auto [oldRepetitionSubregion, oldExitSubregion] =
258 const auto & newRepetitionSubregion = newGammaNode->subregion(oldRepetitionSubregion->index());
259 const auto repetitionSubregionIndex = oldRepetitionSubregion->index();
260 const auto exitSubregionIndex = oldExitSubregion->index();
264 std::unordered_map<rvsdg::Input *, rvsdg::Input *> oldGammaNewGammaInputMap;
265 std::unordered_map<rvsdg::Input *, rvsdg::Input *> oldGammaNewThetaInputMap;
266 for (
const auto & [oldInput, oldBranchArgument] : oldGammaNode->GetEntryVars())
268 auto & newOrigin = stage1SMap.
lookup(*oldInput->origin());
269 auto newEntryVar = newGammaNode->AddEntryVar(&newOrigin);
271 newThetaNode->AddLoopVar(newEntryVar.branchArgument[repetitionSubregionIndex]);
272 oldGammaNewGammaInputMap[oldInput] = newEntryVar.input;
273 oldGammaNewThetaInputMap[oldInput] = newLoopVar.input;
279 for (
const auto & [oldInput, oldBranchArgument] : oldGammaNode->GetEntryVars())
281 auto newLoopInput = oldGammaNewThetaInputMap[oldInput];
282 auto newLoopVar = newThetaNode->MapInputLoopVar(*newLoopInput);
283 stage3SMap.
insert(oldBranchArgument[repetitionSubregionIndex], newLoopVar.pre);
286 oldRepetitionSubregion->copy(newThetaNode->subregion(), stage3SMap);
294 auto oldExitVar = oldGammaNode->MapOutputExitVar(*oldLoopVar.post->origin());
295 auto oldOrigin = oldExitVar.branchResult[repetitionSubregionIndex]->origin();
296 auto & newOrigin = stage3SMap.
lookup(*oldOrigin);
297 stage4SMap.
insert(oldLoopVar.pre, &newOrigin);
306 for (
const auto & [oldInput, oldBranchArgument] : oldGammaNode->GetEntryVars())
308 auto newLoopVarInput = oldGammaNewThetaInputMap[oldInput];
309 auto newLoopVar = newThetaNode->MapInputLoopVar(*newLoopVarInput);
310 auto & newOrigin = stage4SMap.
lookup(*oldInput->origin());
311 newLoopVar.post->divert_to(&newOrigin);
315 std::unordered_map<rvsdg::Input *, rvsdg::Output *> oldGammaNewGammaOutputMap;
317 for (
const auto & [oldInput, oldBranchArgument] : oldGammaNode->GetEntryVars())
319 auto newGammaInput = oldGammaNewGammaInputMap[oldInput];
321 std::get<rvsdg::GammaNode::EntryVar>(newGammaNode->MapInput(*newGammaInput));
322 auto newLoopVarInput = oldGammaNewThetaInputMap[oldInput];
323 auto newLoopVar = newThetaNode->MapInputLoopVar(*newLoopVarInput);
325 std::vector<rvsdg::Output *> values(2);
326 values[exitSubregionIndex] = newEntryVar.branchArgument[exitSubregionIndex];
327 values[repetitionSubregionIndex] = newLoopVar.output;
328 auto newExitVar = newGammaNode->AddExitVar(values);
329 oldGammaNewGammaOutputMap[oldInput] = newExitVar.output;
336 for (
const auto & [oldInput, oldBranchArgument] : oldGammaNode->GetEntryVars())
338 auto newOrigin = oldGammaNewGammaOutputMap[oldInput];
339 stage7SMap.
insert(oldBranchArgument[exitSubregionIndex], newOrigin);
342 oldExitSubregion->copy(oldThetaNode.
region(), stage7SMap);
348 auto oldExitVar = oldGammaNode->MapOutputExitVar(*oldLoopVar.post->origin());
349 auto oldOrigin = oldExitVar.branchResult[exitSubregionIndex]->origin();
350 auto & newOrigin = stage7SMap.
lookup(*oldOrigin);