diff --git a/mlir/lib/Dialect/Affine/Analysis/AffineAnalysis.cpp b/mlir/lib/Dialect/Affine/Analysis/AffineAnalysis.cpp --- a/mlir/lib/Dialect/Affine/Analysis/AffineAnalysis.cpp +++ b/mlir/lib/Dialect/Affine/Analysis/AffineAnalysis.cpp @@ -609,6 +609,10 @@ !isa(dstAccess.opInst)) return DependenceResult::NoDependence; + // We can't analyze further if the ops lie in different affine scopes. + if (getAffineScope(srcAccess.opInst) != getAffineScope(dstAccess.opInst)) + return DependenceResult::Failure; + // Create access relation from each MemRefAccess. FlatAffineRelation srcRel, dstRel; if (failed(srcAccess.getAccessRelation(srcRel))) diff --git a/mlir/test/Dialect/Affine/scalrep.mlir b/mlir/test/Dialect/Affine/scalrep.mlir --- a/mlir/test/Dialect/Affine/scalrep.mlir +++ b/mlir/test/Dialect/Affine/scalrep.mlir @@ -744,3 +744,24 @@ } return } + +// No scalrep will be performed here but we ensure dependence correctly fails. + +// CHECK-LABEL: func @affine_load_store_in_different_scopes +func.func @affine_load_store_in_different_scopes() -> memref<1xf32> { + %A = memref.alloc() : memref<1xf32> + %cf0 = arith.constant 0.0 : f32 + %cf5 = arith.constant 5.0 : f32 + + affine.store %cf0, %A[0] : memref<1xf32> + test.affine_scope { + affine.store %cf5, %A[0] : memref<1xf32> + "test.terminate"() : () -> () + } + %v = affine.load %A[0] : memref<1xf32> + // CHECK: affine.store + // CHECK-NEXT: test.affine_scope + // CHECK: affine.store + // CHECK: affine.load + return %A : memref<1xf32> +}