1*b537c5b4SEugene Zhulenev //===- PassDetail.cpp - Async Pass class details ----------------*- C++ -*-===// 2*b537c5b4SEugene Zhulenev // 3*b537c5b4SEugene Zhulenev // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*b537c5b4SEugene Zhulenev // See https://llvm.org/LICENSE.txt for license information. 5*b537c5b4SEugene Zhulenev // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*b537c5b4SEugene Zhulenev // 7*b537c5b4SEugene Zhulenev //===----------------------------------------------------------------------===// 8*b537c5b4SEugene Zhulenev 9*b537c5b4SEugene Zhulenev #include "PassDetail.h" 10*b537c5b4SEugene Zhulenev #include "mlir/IR/Builders.h" 11*b537c5b4SEugene Zhulenev #include "mlir/Transforms/RegionUtils.h" 12*b537c5b4SEugene Zhulenev 13*b537c5b4SEugene Zhulenev using namespace mlir; 14*b537c5b4SEugene Zhulenev cloneConstantsIntoTheRegion(Region & region)15*b537c5b4SEugene Zhulenevvoid mlir::async::cloneConstantsIntoTheRegion(Region ®ion) { 16*b537c5b4SEugene Zhulenev OpBuilder builder(®ion); 17*b537c5b4SEugene Zhulenev cloneConstantsIntoTheRegion(region, builder); 18*b537c5b4SEugene Zhulenev } 19*b537c5b4SEugene Zhulenev cloneConstantsIntoTheRegion(Region & region,OpBuilder & builder)20*b537c5b4SEugene Zhulenevvoid mlir::async::cloneConstantsIntoTheRegion(Region ®ion, 21*b537c5b4SEugene Zhulenev OpBuilder &builder) { 22*b537c5b4SEugene Zhulenev // Values implicitly captured by the region. 23*b537c5b4SEugene Zhulenev llvm::SetVector<Value> captures; 24*b537c5b4SEugene Zhulenev getUsedValuesDefinedAbove(region, region, captures); 25*b537c5b4SEugene Zhulenev 26*b537c5b4SEugene Zhulenev OpBuilder::InsertionGuard guard(builder); 27*b537c5b4SEugene Zhulenev builder.setInsertionPointToStart(®ion.front()); 28*b537c5b4SEugene Zhulenev 29*b537c5b4SEugene Zhulenev // Clone ConstantLike operations into the region. 30*b537c5b4SEugene Zhulenev for (Value capture : captures) { 31*b537c5b4SEugene Zhulenev Operation *op = capture.getDefiningOp(); 32*b537c5b4SEugene Zhulenev if (!op || !op->hasTrait<OpTrait::ConstantLike>()) 33*b537c5b4SEugene Zhulenev continue; 34*b537c5b4SEugene Zhulenev 35*b537c5b4SEugene Zhulenev Operation *cloned = builder.clone(*op); 36*b537c5b4SEugene Zhulenev 37*b537c5b4SEugene Zhulenev for (auto tuple : llvm::zip(op->getResults(), cloned->getResults())) { 38*b537c5b4SEugene Zhulenev Value orig = std::get<0>(tuple); 39*b537c5b4SEugene Zhulenev Value replacement = std::get<1>(tuple); 40*b537c5b4SEugene Zhulenev replaceAllUsesInRegionWith(orig, replacement, region); 41*b537c5b4SEugene Zhulenev } 42*b537c5b4SEugene Zhulenev } 43*b537c5b4SEugene Zhulenev } 44