Skip to content

Commit edc6b7d

Browse files
j2kuncopybara-github
authored andcommitted
Add in-place OpenFHE ops and in-place transform
New ops: - `add_inplace` - `add_plain_inplace` - `level_reduce_inplace` - `mod_reduce_inplace` - `mul_const_inplace` - `negate_inplace` - `relin_inplace` - `square_inplace` - `sub_inplace` - `sub_plain_inplace` Note: openfhe does not appear to have in-place variants for: `EvalMult` (ciphertext or plaintext), `EvalMulNoRelin`, `EvalRotate`, `EvalAutomorphism`, `EvalBootstrap`. New transform: `openfhe-alloc-to-inplace` PiperOrigin-RevId: 856367329
1 parent eda63e8 commit edc6b7d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1975
-621
lines changed

lib/Analysis/Cpp/BUILD

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
load("@rules_cc//cc:cc_library.bzl", "cc_library")
2+
3+
package(
4+
default_applicable_licenses = ["@heir//:license"],
5+
default_visibility = ["//visibility:public"],
6+
)
7+
8+
cc_library(
9+
name = "ConstQualifierAnalysis",
10+
srcs = ["ConstQualifierAnalysis.cpp"],
11+
hdrs = ["ConstQualifierAnalysis.h"],
12+
deps = [
13+
"@heir//lib/Utils/Tablegen:InPlaceOpInterface",
14+
"@llvm-project//llvm:Support",
15+
"@llvm-project//mlir:IR",
16+
"@llvm-project//mlir:SideEffectInterfaces",
17+
"@llvm-project//mlir:Support",
18+
],
19+
)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include "lib/Analysis/Cpp/ConstQualifierAnalysis.h"
2+
3+
#include "lib/Utils/Tablegen/InPlaceOpInterface.h"
4+
#include "llvm/include/llvm/ADT/STLExtras.h" // from @llvm-project
5+
#include "mlir/include/mlir/IR/Operation.h" // from @llvm-project
6+
#include "mlir/include/mlir/IR/Value.h" // from @llvm-project
7+
#include "mlir/include/mlir/IR/Visitors.h" // from @llvm-project
8+
#include "mlir/include/mlir/Interfaces/SideEffectInterfaces.h" // from @llvm-project
9+
#include "mlir/include/mlir/Support/LLVM.h" // from @llvm-project
10+
11+
namespace mlir {
12+
namespace heir {
13+
14+
bool isMutated(Value value) {
15+
return llvm::any_of(value.getUsers(), [&](Operation* user) {
16+
bool mutatesOperand = hasEffect<MemoryEffects::Write>(user, value);
17+
auto inPlaceOp = dyn_cast<InPlaceOpInterface>(user);
18+
bool isTargetOfInPlaceOp =
19+
inPlaceOp &&
20+
user->getOperand(inPlaceOp.getInPlaceOperandIndex()) == value;
21+
return mutatesOperand || isTargetOfInPlaceOp;
22+
});
23+
}
24+
25+
ConstQualifierAnalysis::ConstQualifierAnalysis(Operation* op) {
26+
op->walk([&](Operation* op) {
27+
for (Value result : op->getResults()) {
28+
if (!isMutated(result)) {
29+
constValues.insert(result);
30+
}
31+
}
32+
});
33+
}
34+
35+
} // namespace heir
36+
} // namespace mlir
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef LIB_ANALYSIS_CPP_CONSTQUALIFIERANALYSIS_H_
2+
#define LIB_ANALYSIS_CPP_CONSTQUALIFIERANALYSIS_H_
3+
4+
#include <cassert>
5+
6+
#include "mlir/include/mlir/IR/Operation.h" // from @llvm-project
7+
#include "mlir/include/mlir/IR/Value.h" // from @llvm-project
8+
#include "mlir/include/mlir/Support/LLVM.h" // from @llvm-project
9+
10+
namespace mlir {
11+
namespace heir {
12+
13+
class ConstQualifierAnalysis {
14+
public:
15+
ConstQualifierAnalysis(Operation* op);
16+
~ConstQualifierAnalysis() = default;
17+
18+
/// Return true if the value can be marked as const in C++ codegen.
19+
bool canBeMarkedConst(Value value) const {
20+
return constValues.contains(value);
21+
}
22+
23+
private:
24+
llvm::DenseSet<Value> constValues;
25+
};
26+
27+
} // namespace heir
28+
} // namespace mlir
29+
30+
#endif // LIB_ANALYSIS_CPP_CONSTQUALIFIERANALYSIS_H_

lib/Dialect/Lattigo/IR/BUILD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ cc_library(
2929
":LattigoOps",
3030
":LattigoTypes",
3131
"@heir//lib/Dialect:HEIRInterfaces",
32-
"@heir//lib/Utils/Tablegen:InplaceOpInterface",
32+
"@heir//lib/Utils/Tablegen:InPlaceOpInterface",
3333
"@llvm-project//llvm:Support",
3434
"@llvm-project//mlir:IR",
3535
],
@@ -88,7 +88,7 @@ cc_library(
8888
":ops_inc_gen",
8989
":types_inc_gen",
9090
"@heir//lib/Dialect:HEIRInterfaces",
91-
"@heir//lib/Utils/Tablegen:InplaceOpInterface",
91+
"@heir//lib/Utils/Tablegen:InPlaceOpInterface",
9292
"@llvm-project//mlir:IR",
9393
"@llvm-project//mlir:Support",
9494
],

lib/Dialect/Lattigo/IR/LattigoBGVOps.td

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def Lattigo_BGVNewEncoderOp : Lattigo_BGVOp<"new_encoder"> {
4343
let results = (outs Lattigo_BGVEncoder:$encoder);
4444
}
4545

46-
def Lattigo_BGVEncodeOp : Lattigo_BGVOp<"encode", [InplaceOpInterface]> {
46+
def Lattigo_BGVEncodeOp : Lattigo_BGVOp<"encode", [InPlaceOpInterface]> {
4747
let summary = "Encode a plaintext value in the Lattigo BGV dialect";
4848
let description = [{
4949
This operation encodes a plaintext value using the specified encoder in the Lattigo BGV dialect.
@@ -60,7 +60,7 @@ def Lattigo_BGVEncodeOp : Lattigo_BGVOp<"encode", [InplaceOpInterface]> {
6060
);
6161
let results = (outs Lattigo_RLWEPlaintext:$encoded);
6262

63-
let extraClassDeclaration = "int getInplaceOperandIndex() { return 2; }";
63+
let extraClassDeclaration = "int getInPlaceOperandIndex() { return 2; }";
6464
}
6565

6666
def Lattigo_BGVDecodeOp : Lattigo_BGVOp<"decode", [AllTypesMatch<["value", "decoded"]>]> {
@@ -137,8 +137,8 @@ def Lattigo_BGVMulNewOp : Lattigo_BGVBinaryOp<"mul_new", [IncreasesMulDepthOpInt
137137
}];
138138
}
139139

140-
class Lattigo_BGVBinaryInplaceOp<string mnemonic, list<Trait> traits = []> :
141-
Lattigo_BGVOp<mnemonic, traits # [InplaceOpInterface]> {
140+
class Lattigo_BGVBinaryInPlaceOp<string mnemonic, list<Trait> traits = []> :
141+
Lattigo_BGVOp<mnemonic, traits # [InPlaceOpInterface]> {
142142
let arguments = (ins
143143
Lattigo_BGVEvaluator:$evaluator,
144144
Lattigo_RLWECiphertext:$lhs,
@@ -149,10 +149,10 @@ class Lattigo_BGVBinaryInplaceOp<string mnemonic, list<Trait> traits = []> :
149149
);
150150
let results = (outs Lattigo_RLWECiphertext:$output);
151151

152-
let extraClassDeclaration = "int getInplaceOperandIndex() { return 3; }";
152+
let extraClassDeclaration = "int getInPlaceOperandIndex() { return 3; }";
153153
}
154154

155-
def Lattigo_BGVAddOp : Lattigo_BGVBinaryInplaceOp<"add"> {
155+
def Lattigo_BGVAddOp : Lattigo_BGVBinaryInPlaceOp<"add"> {
156156
let summary = "Add two ciphertexts in the Lattigo BGV dialect";
157157
let description = [{
158158
This operation adds two ciphertext values in the Lattigo BGV dialect.
@@ -162,7 +162,7 @@ def Lattigo_BGVAddOp : Lattigo_BGVBinaryInplaceOp<"add"> {
162162
}];
163163
}
164164

165-
def Lattigo_BGVSubOp : Lattigo_BGVBinaryInplaceOp<"sub"> {
165+
def Lattigo_BGVSubOp : Lattigo_BGVBinaryInPlaceOp<"sub"> {
166166
let summary = "Subtract two ciphertexts in the Lattigo BGV dialect";
167167
let description = [{
168168
This operation subtracts one ciphertext value from another in the Lattigo BGV dialect.
@@ -172,7 +172,7 @@ def Lattigo_BGVSubOp : Lattigo_BGVBinaryInplaceOp<"sub"> {
172172
}];
173173
}
174174

175-
def Lattigo_BGVMulOp : Lattigo_BGVBinaryInplaceOp<"mul", [IncreasesMulDepthOpInterface]> {
175+
def Lattigo_BGVMulOp : Lattigo_BGVBinaryInPlaceOp<"mul", [IncreasesMulDepthOpInterface]> {
176176
let summary = "Multiply two ciphertexts in the Lattigo BGV dialect";
177177
let description = [{
178178
This operation multiplies two ciphertext values in the Lattigo BGV dialect.
@@ -231,20 +231,20 @@ def Lattigo_BGVRotateRowsNewOp : Lattigo_BGVUnaryOp<"rotate_rows_new"> {
231231
}];
232232
}
233233

234-
class Lattigo_BGVUnaryInplaceOp<string mnemonic> :
235-
Lattigo_BGVOp<mnemonic, [InplaceOpInterface]> {
234+
class Lattigo_BGVUnaryInPlaceOp<string mnemonic> :
235+
Lattigo_BGVOp<mnemonic, [InPlaceOpInterface]> {
236236
let arguments = (ins
237237
Lattigo_BGVEvaluator:$evaluator,
238238
Lattigo_RLWECiphertext:$input,
239-
// see BinaryInplaceOp above
239+
// see BinaryInPlaceOp above
240240
Lattigo_RLWECiphertext:$inplace
241241
);
242242
let results = (outs Lattigo_RLWECiphertext:$output);
243243

244-
let extraClassDeclaration = "int getInplaceOperandIndex() { return 2; }";
244+
let extraClassDeclaration = "int getInPlaceOperandIndex() { return 2; }";
245245
}
246246

247-
def Lattigo_BGVRelinearizeOp : Lattigo_BGVUnaryInplaceOp<"relinearize"> {
247+
def Lattigo_BGVRelinearizeOp : Lattigo_BGVUnaryInPlaceOp<"relinearize"> {
248248
let summary = "Relinearize a ciphertext in the Lattigo BGV dialect";
249249
let description = [{
250250
This operation relinearizes a ciphertext value in the Lattigo BGV dialect.
@@ -254,7 +254,7 @@ def Lattigo_BGVRelinearizeOp : Lattigo_BGVUnaryInplaceOp<"relinearize"> {
254254
}];
255255
}
256256

257-
def Lattigo_BGVRescaleOp : Lattigo_BGVUnaryInplaceOp<"rescale"> {
257+
def Lattigo_BGVRescaleOp : Lattigo_BGVUnaryInPlaceOp<"rescale"> {
258258
let summary = "Rescale a ciphertext in the Lattigo BGV dialect";
259259
let description = [{
260260
This operation rescales a ciphertext value in the Lattigo BGV dialect.
@@ -264,7 +264,7 @@ def Lattigo_BGVRescaleOp : Lattigo_BGVUnaryInplaceOp<"rescale"> {
264264
}];
265265
}
266266

267-
def Lattigo_BGVRotateColumnsOp : Lattigo_BGVUnaryInplaceOp<"rotate_columns"> {
267+
def Lattigo_BGVRotateColumnsOp : Lattigo_BGVUnaryInPlaceOp<"rotate_columns"> {
268268
let summary = "Rotate columns of a ciphertext in the Lattigo BGV dialect";
269269
let description = [{
270270
This operation rotates the columns of a ciphertext value in the Lattigo BGV dialect.
@@ -285,7 +285,7 @@ def Lattigo_BGVRotateColumnsOp : Lattigo_BGVUnaryInplaceOp<"rotate_columns"> {
285285
let results = (outs Lattigo_RLWECiphertext:$output);
286286
}
287287

288-
def Lattigo_BGVRotateRowsOp : Lattigo_BGVUnaryInplaceOp<"rotate_rows"> {
288+
def Lattigo_BGVRotateRowsOp : Lattigo_BGVUnaryInPlaceOp<"rotate_rows"> {
289289
let summary = "Rotate rows of a ciphertext in the Lattigo BGV dialect";
290290
let description = [{
291291
This operation swap the rows of a ciphertext value in the Lattigo BGV dialect.

lib/Dialect/Lattigo/IR/LattigoCKKSOps.td

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def Lattigo_CKKSNewEncoderOp : Lattigo_CKKSOp<"new_encoder"> {
4343
let results = (outs Lattigo_CKKSEncoder:$encoder);
4444
}
4545

46-
def Lattigo_CKKSEncodeOp : Lattigo_CKKSOp<"encode", [InplaceOpInterface]> {
46+
def Lattigo_CKKSEncodeOp : Lattigo_CKKSOp<"encode", [InPlaceOpInterface]> {
4747
let summary = "Encode a plaintext value in the Lattigo CKKS dialect";
4848
let description = [{
4949
This operation encodes a plaintext value using the specified encoder in the Lattigo CKKS dialect.
@@ -60,7 +60,7 @@ def Lattigo_CKKSEncodeOp : Lattigo_CKKSOp<"encode", [InplaceOpInterface]> {
6060
);
6161
let results = (outs Lattigo_RLWEPlaintext:$encoded);
6262

63-
let extraClassDeclaration = "int getInplaceOperandIndex() { return 2; }";
63+
let extraClassDeclaration = "int getInPlaceOperandIndex() { return 2; }";
6464
}
6565

6666
def Lattigo_CKKSDecodeOp : Lattigo_CKKSOp<"decode", [AllTypesMatch<["value", "decoded"]>]> {
@@ -131,8 +131,8 @@ def Lattigo_CKKSMulNewOp : Lattigo_CKKSBinaryOp<"mul_new", [IncreasesMulDepthOpI
131131
}];
132132
}
133133

134-
class Lattigo_CKKSBinaryInplaceOp<string mnemonic, list<Trait> traits = []> :
135-
Lattigo_CKKSOp<mnemonic, traits # [InplaceOpInterface]> {
134+
class Lattigo_CKKSBinaryInPlaceOp<string mnemonic, list<Trait> traits = []> :
135+
Lattigo_CKKSOp<mnemonic, traits # [InPlaceOpInterface]> {
136136
let arguments = (ins
137137
Lattigo_CKKSEvaluator:$evaluator,
138138
Lattigo_RLWECiphertext:$lhs,
@@ -143,10 +143,10 @@ class Lattigo_CKKSBinaryInplaceOp<string mnemonic, list<Trait> traits = []> :
143143
);
144144
let results = (outs Lattigo_RLWECiphertext:$output);
145145

146-
let extraClassDeclaration = "int getInplaceOperandIndex() { return 3; }";
146+
let extraClassDeclaration = "int getInPlaceOperandIndex() { return 3; }";
147147
}
148148

149-
def Lattigo_CKKSAddOp : Lattigo_CKKSBinaryInplaceOp<"add"> {
149+
def Lattigo_CKKSAddOp : Lattigo_CKKSBinaryInPlaceOp<"add"> {
150150
let summary = "Add two ciphertexts in the Lattigo CKKS dialect";
151151
let description = [{
152152
This operation adds two ciphertext values in the Lattigo CKKS dialect.
@@ -156,7 +156,7 @@ def Lattigo_CKKSAddOp : Lattigo_CKKSBinaryInplaceOp<"add"> {
156156
}];
157157
}
158158

159-
def Lattigo_CKKSSubOp : Lattigo_CKKSBinaryInplaceOp<"sub"> {
159+
def Lattigo_CKKSSubOp : Lattigo_CKKSBinaryInPlaceOp<"sub"> {
160160
let summary = "Subtract two ciphertexts in the Lattigo CKKS dialect";
161161
let description = [{
162162
This operation subtracts one ciphertext value from another in the Lattigo CKKS dialect.
@@ -166,7 +166,7 @@ def Lattigo_CKKSSubOp : Lattigo_CKKSBinaryInplaceOp<"sub"> {
166166
}];
167167
}
168168

169-
def Lattigo_CKKSMulOp : Lattigo_CKKSBinaryInplaceOp<"mul", [IncreasesMulDepthOpInterface]> {
169+
def Lattigo_CKKSMulOp : Lattigo_CKKSBinaryInPlaceOp<"mul", [IncreasesMulDepthOpInterface]> {
170170
let summary = "Multiply two ciphertexts in the Lattigo CKKS dialect";
171171
let description = [{
172172
This operation multiplies two ciphertext values in the Lattigo CKKS dialect.
@@ -218,20 +218,20 @@ def Lattigo_CKKSRotateNewOp : Lattigo_CKKSOp<"rotate_new"> {
218218
let results = (outs Lattigo_RLWECiphertext:$output);
219219
}
220220

221-
class Lattigo_CKKSUnaryInplaceOp<string mnemonic> :
222-
Lattigo_CKKSOp<mnemonic, [InplaceOpInterface]> {
221+
class Lattigo_CKKSUnaryInPlaceOp<string mnemonic> :
222+
Lattigo_CKKSOp<mnemonic, [InPlaceOpInterface]> {
223223
let arguments = (ins
224224
Lattigo_CKKSEvaluator:$evaluator,
225225
Lattigo_RLWECiphertext:$input,
226-
// see BinaryInplaceOp above
226+
// see BinaryInPlaceOp above
227227
Lattigo_RLWECiphertext:$inplace
228228
);
229229
let results = (outs Lattigo_RLWECiphertext:$output);
230230

231-
let extraClassDeclaration = "int getInplaceOperandIndex() { return 2; }";
231+
let extraClassDeclaration = "int getInPlaceOperandIndex() { return 2; }";
232232
}
233233

234-
def Lattigo_CKKSRelinearizeOp : Lattigo_CKKSUnaryInplaceOp<"relinearize"> {
234+
def Lattigo_CKKSRelinearizeOp : Lattigo_CKKSUnaryInPlaceOp<"relinearize"> {
235235
let summary = "Relinearize a ciphertext in the Lattigo CKKS dialect";
236236
let description = [{
237237
This operation relinearizes a ciphertext value in the Lattigo CKKS dialect.
@@ -241,7 +241,7 @@ def Lattigo_CKKSRelinearizeOp : Lattigo_CKKSUnaryInplaceOp<"relinearize"> {
241241
}];
242242
}
243243

244-
def Lattigo_CKKSRescaleOp : Lattigo_CKKSUnaryInplaceOp<"rescale"> {
244+
def Lattigo_CKKSRescaleOp : Lattigo_CKKSUnaryInPlaceOp<"rescale"> {
245245
let summary = "Rescale a ciphertext in the Lattigo CKKS dialect";
246246
let description = [{
247247
This operation rescales a ciphertext value in the Lattigo CKKS dialect.
@@ -251,7 +251,7 @@ def Lattigo_CKKSRescaleOp : Lattigo_CKKSUnaryInplaceOp<"rescale"> {
251251
}];
252252
}
253253

254-
def Lattigo_CKKSRotateOp : Lattigo_CKKSUnaryInplaceOp<"rotate"> {
254+
def Lattigo_CKKSRotateOp : Lattigo_CKKSUnaryInPlaceOp<"rotate"> {
255255
let summary = "Rotate slots of a ciphertext in the Lattigo CKKS dialect";
256256
let description = [{
257257
This operation rotates slots of a ciphertext value in the Lattigo CKKS dialect.
@@ -268,7 +268,7 @@ def Lattigo_CKKSRotateOp : Lattigo_CKKSUnaryInplaceOp<"rotate"> {
268268
let arguments = (ins
269269
Lattigo_CKKSEvaluator:$evaluator,
270270
Lattigo_RLWECiphertext:$input,
271-
// see BinaryInplaceOp above
271+
// see BinaryInPlaceOp above
272272
Lattigo_RLWECiphertext:$inplace,
273273
Builtin_IntegerAttr:$offset
274274
);

lib/Dialect/Lattigo/IR/LattigoOps.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include "lib/Dialect/HEIRInterfaces.h"
66
#include "lib/Dialect/Lattigo/IR/LattigoDialect.h"
77
#include "lib/Dialect/Lattigo/IR/LattigoTypes.h"
8-
#include "lib/Utils/Tablegen/InplaceOpInterface.h"
8+
#include "lib/Utils/Tablegen/InPlaceOpInterface.h"
99
#include "mlir/include/mlir/IR/BuiltinOps.h" // from @llvm-project
1010
// IWYU pragma: end_keep
1111

lib/Dialect/Lattigo/IR/LattigoOps.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
include "LattigoDialect.td"
55
include "LattigoTypes.td"
66
include "mlir/IR/OpBase.td"
7-
include "lib/Utils/Tablegen/InplaceOpInterface.td"
7+
include "lib/Utils/Tablegen/InPlaceOpInterface.td"
88

99
class Lattigo_Op<string mnemonic, list<Trait> traits = []> :
1010
Op<Lattigo_Dialect, mnemonic, traits> {

lib/Dialect/Lattigo/IR/LattigoRLWEOps.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def Lattigo_RLWEDropLevelNewOp : Lattigo_RLWEOp<"drop_level_new"> {
132132
let results = (outs Lattigo_RLWECiphertext:$output);
133133
}
134134

135-
def Lattigo_RLWEDropLevelOp : Lattigo_RLWEOp<"drop_level", [InplaceOpInterface]> {
135+
def Lattigo_RLWEDropLevelOp : Lattigo_RLWEOp<"drop_level", [InPlaceOpInterface]> {
136136
let summary = "Drop level of a ciphertext";
137137
let description = [{
138138
This operation drops the level of a ciphertext
@@ -148,7 +148,7 @@ def Lattigo_RLWEDropLevelOp : Lattigo_RLWEOp<"drop_level", [InplaceOpInterface]>
148148
);
149149
let results = (outs Lattigo_RLWECiphertext:$output);
150150

151-
let extraClassDeclaration = "int getInplaceOperandIndex() { return 2; }";
151+
let extraClassDeclaration = "int getInPlaceOperandIndex() { return 2; }";
152152
}
153153

154154
def Lattigo_RLWENegateNewOp : Lattigo_RLWEOp<"negate_new"> {
@@ -160,7 +160,7 @@ def Lattigo_RLWENegateNewOp : Lattigo_RLWEOp<"negate_new"> {
160160
let results = (outs Lattigo_RLWECiphertext:$output);
161161
}
162162

163-
def Lattigo_RLWENegateOp : Lattigo_RLWEOp<"negate", [InplaceOpInterface]> {
163+
def Lattigo_RLWENegateOp : Lattigo_RLWEOp<"negate", [InPlaceOpInterface]> {
164164
let summary = "Negate of a ciphertext";
165165
let description = [{
166166
This operation negates a ciphertext
@@ -175,7 +175,7 @@ def Lattigo_RLWENegateOp : Lattigo_RLWEOp<"negate", [InplaceOpInterface]> {
175175
);
176176
let results = (outs Lattigo_RLWECiphertext:$output);
177177

178-
let extraClassDeclaration = "int getInplaceOperandIndex() { return 2; }";
178+
let extraClassDeclaration = "int getInPlaceOperandIndex() { return 2; }";
179179
}
180180

181181
#endif // LIB_DIALECT_LATTIGO_IR_LATTIGORLWEOPS_TD_

0 commit comments

Comments
 (0)