31 int64_t constraintSize) {
32 if (toeval.getFunctionBody().empty()) {
33 llvm::errs() << toeval <<
"\n";
34 llvm_unreachable(
"Creating ImpulseUtils from empty function");
37 OpBuilder builder(toeval.getContext());
41 cast<mlir::FunctionType>(toeval.getFunctionType()).getInputs();
42 auto originalResults =
43 cast<mlir::FunctionType>(toeval.getFunctionType()).getResults();
44 SmallVector<mlir::Type, 4> OperandTypes;
45 SmallVector<mlir::Type, 4> ResultTypes;
50 OperandTypes.append(originalInputs.begin(), originalInputs.end());
51 ResultTypes.append(originalResults.begin(), originalResults.end());
55 if (positionSize <= 0 || constraintSize < 0) {
56 toeval.emitError(
"Impulse: Unexpected size parameters");
59 OperandTypes.push_back(
60 RankedTensorType::get({1, constraintSize}, builder.getF64Type()));
61 OperandTypes.append(originalInputs.begin(), originalInputs.end());
62 ResultTypes.push_back(
63 RankedTensorType::get({1, positionSize}, builder.getF64Type()));
64 ResultTypes.push_back(RankedTensorType::get({}, builder.getF64Type()));
65 ResultTypes.append(originalResults.begin(), originalResults.end());
68 suffix =
"regenerate";
69 if (positionSize < 0) {
70 toeval.emitError(
"Impulse: Unexpected size parameters");
73 OperandTypes.push_back(
74 RankedTensorType::get({1, positionSize}, builder.getF64Type()));
75 OperandTypes.append(originalInputs.begin(), originalInputs.end());
76 ResultTypes.push_back(
77 RankedTensorType::get({1, positionSize}, builder.getF64Type()));
78 ResultTypes.push_back(RankedTensorType::get({}, builder.getF64Type()));
79 ResultTypes.append(originalResults.begin(), originalResults.end());
83 if (positionSize < 0) {
84 toeval.emitError(
"Impulse: Unexpected size parameters");
87 OperandTypes.append(originalInputs.begin(), originalInputs.end());
88 ResultTypes.push_back(
89 RankedTensorType::get({1, positionSize}, builder.getF64Type()));
90 ResultTypes.push_back(RankedTensorType::get({}, builder.getF64Type()));
91 ResultTypes.append(originalResults.begin(), originalResults.end());
94 llvm_unreachable(
"Invalid ImpulseMode\n");
97 auto FTy = builder.getFunctionType(OperandTypes, ResultTypes);
98 auto NewF = cast<FunctionOpInterface>(toeval->cloneWithoutRegions());
99 SymbolTable::setSymbolName(NewF, toeval.getName().str() +
"." + suffix);
102 Operation *parent = toeval->getParentWithTrait<OpTrait::SymbolTable>();
103 SymbolTable table(parent);
106 IRMapping originalToNew;
107 std::map<Operation *, Operation *> originalToNewOps;
108 cloneInto(&toeval.getFunctionBody(), &NewF.getFunctionBody(), originalToNew,
112 Block &entry = NewF.getFunctionBody().front();
113 entry.insertArgument(
114 0u, RankedTensorType::get({1, constraintSize}, builder.getF64Type()),
119 Block &entry = NewF.getFunctionBody().front();
120 entry.insertArgument(
121 0u, RankedTensorType::get({1, positionSize}, builder.getF64Type()),
125 return new ImpulseUtils(NewF, toeval, originalToNew, originalToNewOps,
mode);