diff --git a/mlir/lib/Dialect/Linalg/Transforms/LinalgToLoops.cpp b/mlir/lib/Dialect/Linalg/Transforms/LinalgToLoops.cpp --- a/mlir/lib/Dialect/Linalg/Transforms/LinalgToLoops.cpp +++ b/mlir/lib/Dialect/Linalg/Transforms/LinalgToLoops.cpp @@ -101,7 +101,7 @@ assert(isa(terminator) && "expected an yield op in the end of the region"); for (unsigned i = 0, e = terminator.getNumOperands(); i < e; ++i) { - std_store(map.lookup(terminator.getOperand(i)), outputBuffers[i], + std_store(map.lookupOrDefault(terminator.getOperand(i)), outputBuffers[i], indexing[i]); } } diff --git a/mlir/test/Dialect/Linalg/loops.mlir b/mlir/test/Dialect/Linalg/loops.mlir --- a/mlir/test/Dialect/Linalg/loops.mlir +++ b/mlir/test/Dialect/Linalg/loops.mlir @@ -522,3 +522,24 @@ // CHECK: %[[d:.*]] = select %{{.*}}, %[[b]], %[[c]] // CHECK: %[[e:.*]] = addf %[[a]], %[[d]] // CHECK: store %[[e]], %[[ARG2]][] + +#trait_const_fill = { + args_in = 0, + args_out = 1, + indexing_maps = [affine_map<(i) -> (i)>], + iterator_types = ["parallel"], + library_call = "some_external_fn" +} +func @generic_const_init(%arg0: memref) { + %cst = constant 1.0 : f32 + linalg.generic #trait_const_fill %arg0 { + ^bb0(%arg1: f32): // no predecessors + linalg.yield %cst : f32 + }: memref + return +} +// CHECK-LABEL: @generic_const_init +// CHECK-SAME: %[[ARG0:.*]]: memref +// CHECK: %[[CONST:.*]] = constant 1.000000e+00 : f32 +// CHECK: loop.for %[[i:.*]] = {{.*}} +// CHECK: store %[[CONST]], %[[ARG0]]