|
18 | 18 | #include "Interfaces/GradientUtilsReverse.h" |
19 | 19 |
|
20 | 20 | #include "mlir/Dialect/MemRef/IR/MemRef.h" |
21 | | -#include "mlir/Dialect/SCF/IR/SCF.h" |
22 | 21 | #include "mlir/IR/DialectRegistry.h" |
23 | 22 | #include "mlir/Support/LogicalResult.h" |
24 | 23 |
|
| 24 | +// TODO: We need a way to zero out a memref (which linalg.fill does), but |
| 25 | +// ideally we wouldn't depend on the linalg dialect. |
| 26 | +#include "mlir/Dialect/Linalg/IR/Linalg.h" |
| 27 | + |
25 | 28 | using namespace mlir; |
26 | 29 | using namespace mlir::enzyme; |
27 | 30 |
|
@@ -270,33 +273,14 @@ class MemRefAutoDiffTypeInterface |
270 | 273 | LogicalResult zeroInPlace(Type self, OpBuilder &builder, Location loc, |
271 | 274 | Value val) const { |
272 | 275 | auto MT = cast<MemRefType>(self); |
273 | | - auto eltIface = dyn_cast<AutoDiffTypeInterface>(MT.getElementType()); |
274 | | - if (!eltIface || eltIface.isMutable()) |
| 276 | + if (auto iface = dyn_cast<AutoDiffTypeInterface>(MT.getElementType())) { |
| 277 | + if (!iface.isMutable()) { |
| 278 | + Value zero = iface.createNullValue(builder, loc); |
| 279 | + linalg::FillOp::create(builder, loc, zero, val); |
| 280 | + } |
| 281 | + } else { |
275 | 282 | return failure(); |
276 | | - Value zero = eltIface.createNullValue(builder, loc); |
277 | | - |
278 | | - if (MT.getRank() == 0) { |
279 | | - memref::StoreOp::create(builder, loc, zero, val, ValueRange{}); |
280 | | - return success(); |
281 | 283 | } |
282 | | - |
283 | | - Value c0 = arith::ConstantIndexOp::create(builder, loc, 0); |
284 | | - Value c1 = arith::ConstantIndexOp::create(builder, loc, 1); |
285 | | - |
286 | | - SmallVector<Value> lbs(MT.getRank(), c0); |
287 | | - SmallVector<Value> steps(MT.getRank(), c1); |
288 | | - SmallVector<Value> ubs; |
289 | | - for (auto [i, d] : llvm::enumerate(MT.getShape())) { |
290 | | - ubs.push_back( |
291 | | - d == ShapedType::kDynamic |
292 | | - ? memref::DimOp::create(builder, loc, val, i).getResult() |
293 | | - : arith::ConstantIndexOp::create(builder, loc, d).getResult()); |
294 | | - } |
295 | | - |
296 | | - scf::ParallelOp::create(builder, loc, lbs, ubs, steps, |
297 | | - [&](OpBuilder &b, Location l, ValueRange ivs) { |
298 | | - memref::StoreOp::create(b, l, zero, val, ivs); |
299 | | - }); |
300 | 284 | return success(); |
301 | 285 | } |
302 | 286 |
|
|
0 commit comments