| //===- 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<Block *, Value> &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->getDiscardableAttrDictionary().getValue()); | |
| 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; | |
| } |