diff --git a/mlir/lib/Analysis/AliasAnalysis/LocalAliasAnalysis.cpp b/mlir/lib/Analysis/AliasAnalysis/LocalAliasAnalysis.cpp --- a/mlir/lib/Analysis/AliasAnalysis/LocalAliasAnalysis.cpp +++ b/mlir/lib/Analysis/AliasAnalysis/LocalAliasAnalysis.cpp @@ -8,6 +8,7 @@ #include "mlir/Analysis/AliasAnalysis/LocalAliasAnalysis.h" +#include "mlir/IR/FunctionSupport.h" #include "mlir/IR/Matchers.h" #include "mlir/Interfaces/ControlFlowInterfaces.h" #include "mlir/Interfaces/SideEffectInterfaces.h" @@ -231,7 +232,9 @@ // TODO: Here we could look at the users to see if the resource is either // freed on all paths within the region, or is just not captured by anything. - allocScopeOp = nullptr; + // For now assume allocation scope to the function scope (we don't care if + // pointer escape outside function). + allocScopeOp = op->getParentWithTrait(); return success(); } diff --git a/mlir/test/Analysis/test-alias-analysis.mlir b/mlir/test/Analysis/test-alias-analysis.mlir --- a/mlir/test/Analysis/test-alias-analysis.mlir +++ b/mlir/test/Analysis/test-alias-analysis.mlir @@ -17,11 +17,11 @@ // TODO: The MayAlias below is overly conservative and should be provably // NoAlias with a proper escape analysis. // CHECK-DAG: alloc_1#0 <-> alloc_2#0: NoAlias -// CHECK-DAG: alloc_1#0 <-> func.region0#0: MayAlias -// CHECK-DAG: alloc_1#0 <-> func.region0#1: MayAlias +// CHECK-DAG: alloc_1#0 <-> func.region0#0: NoAlias +// CHECK-DAG: alloc_1#0 <-> func.region0#1: NoAlias -// CHECK-DAG: alloc_2#0 <-> func.region0#0: MayAlias -// CHECK-DAG: alloc_2#0 <-> func.region0#1: MayAlias +// CHECK-DAG: alloc_2#0 <-> func.region0#0: NoAlias +// CHECK-DAG: alloc_2#0 <-> func.region0#1: NoAlias func @simple(%arg: memref<2xf32>, %arg1: memref<2xf32>) attributes {test.ptr = "func"} { %0 = memref.alloca() {test.ptr = "alloca_1"} : memref<8x64xf32> %1 = memref.alloca() {test.ptr = "alloca_2"} : memref<8x64xf32> @@ -76,10 +76,10 @@ // CHECK-DAG: alloc_1#0 <-> func.region0.block2#0: MayAlias // CHECK-DAG: func.region0#0 <-> func.region0.block1#0: NoAlias -// CHECK-DAG: func.region0#0 <-> func.region0.block2#0: MayAlias +// CHECK-DAG: func.region0#0 <-> func.region0.block2#0: NoAlias // CHECK-DAG: func.region0#1 <-> func.region0.block1#0: NoAlias -// CHECK-DAG: func.region0#1 <-> func.region0.block2#0: MayAlias +// CHECK-DAG: func.region0#1 <-> func.region0.block2#0: NoAlias // CHECK-DAG: func.region0.block1#0 <-> func.region0.block2#0: MayAlias func @control_flow_merge(%arg: memref<2xf32>, %cond: i1) attributes {test.ptr = "func"} { @@ -120,8 +120,8 @@ // CHECK-DAG: if_alloca_merge#0 <-> func.region0#0: NoAlias // CHECK-DAG: if_alloca_merge#0 <-> func.region0#1: NoAlias -// CHECK-DAG: if_alloc#0 <-> func.region0#0: MayAlias -// CHECK-DAG: if_alloc#0 <-> func.region0#1: MayAlias +// CHECK-DAG: if_alloc#0 <-> func.region0#0: NoAlias +// CHECK-DAG: if_alloc#0 <-> func.region0#1: NoAlias func @region_control_flow(%arg: memref<2xf32>, %cond: i1) attributes {test.ptr = "func"} { %0 = memref.alloca() {test.ptr = "alloca_1"} : memref<8x64xf32> %1 = memref.alloca() {test.ptr = "alloca_2"} : memref<8x64xf32>