//===- MemorySlotUtils.cpp - Utilities for MemorySlot interfaces ----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements common utilities for implementing MemorySlot interfaces, // in particular PromotableRegionOpInterface. // //===----------------------------------------------------------------------===// #include "mlir/Interfaces/Utils/MemorySlotUtils.h" using namespace mlir; void mlir::memoryslot::updateTerminator( Block *block, Value defaultReachingDef, const DenseMap &reachingAtBlockEnd) { Value blockReachingDef = reachingAtBlockEnd.lookup(block); if (!blockReachingDef) blockReachingDef = defaultReachingDef; Operation *terminator = block->getTerminator(); terminator->insertOperands(terminator->getNumOperands(), {blockReachingDef}); } Operation *mlir::memoryslot::replaceWithNewResults(RewriterBase &rewriter, Operation *op, TypeRange resultTypes) { RewriterBase::InsertionGuard guard(rewriter); rewriter.setInsertionPoint(op); OperationState state(op->getLoc(), op->getName(), op->getOperands(), resultTypes, op->getAttrs()); state.propertiesAttr = op->getPropertiesAsAttribute(); unsigned numRegions = op->getNumRegions(); for (unsigned i = 0; i < numRegions; ++i) state.addRegion(); Operation *newOp = rewriter.create(state); rewriter.startOpModification(newOp); rewriter.startOpModification(op); for (unsigned i = 0; i < numRegions; ++i) newOp->getRegion(i).takeBody(op->getRegion(i)); rewriter.finalizeOpModification(op); rewriter.finalizeOpModification(newOp); rewriter.replaceAllOpUsesWith( op, newOp->getResults().take_front(op->getNumResults())); rewriter.eraseOp(op); return newOp; }