Skip to content

Commit 6a0a19a

Browse files
committed
[flang] support (hl)fir.declare in alias analysis
Differential Revision: https://reviews.llvm.org/D157106
1 parent 3fe8ec7 commit 6a0a19a

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed

flang/lib/Optimizer/Analysis/AliasAnalysis.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "flang/Optimizer/Dialect/FIROps.h"
1111
#include "flang/Optimizer/Dialect/FIROpsSupport.h"
1212
#include "flang/Optimizer/Dialect/FIRType.h"
13+
#include "flang/Optimizer/HLFIR/HLFIROps.h"
1314
#include "mlir/Analysis/AliasAnalysis.h"
1415
#include "mlir/IR/BuiltinOps.h"
1516
#include "mlir/IR/Value.h"
@@ -228,6 +229,11 @@ AliasAnalysis::Source AliasAnalysis::getSource(mlir::Value v) {
228229
global = llvm::cast<fir::AddrOfOp>(op).getSymbol();
229230
breakFromLoop = true;
230231
})
232+
.Case<hlfir::DeclareOp, fir::DeclareOp>([&](auto op) {
233+
// Track further through the operand
234+
v = op.getMemref();
235+
defOp = v.getDefiningOp();
236+
})
231237
.Default([&](auto op) {
232238
defOp = nullptr;
233239
breakFromLoop = true;

flang/lib/Optimizer/Analysis/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ add_flang_library(FIRAnalysis
88
LINK_LIBS
99
FIRBuilder
1010
FIRDialect
11+
HLFIRDialect
1112
MLIRFuncDialect
1213
MLIRLLVMDialect
1314
MLIRMathTransforms

flang/test/Analysis/AliasAnalysis/alias-analysis-2.fir

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,90 @@ func.func @_QFPtest3(%arg0: !fir.ref<!fir.box<!fir.ptr<f32>>> {fir.bindc_name =
171171
%13 = fir.box_addr %6 {test.ptr = "box.addr"} : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32>
172172
return
173173
}
174+
175+
// -----
176+
177+
// CHECK-LABEL: Testing : "_QFPtest4"
178+
179+
// Same as test3 but check that the alias analysis can follow (hl)fir.declare
180+
// operations
181+
182+
// CHECK-DAG: p#0 <-> func.region0#0: MayAlias
183+
// CHECK-DAG: p_fir#0 <-> func.region0#0: MayAlias
184+
// CHECK-DAG: p_hlfir#0 <-> func.region0#0: MayAlias
185+
// CHECK-DAG: p_hlfir#1 <-> func.region0#0: MayAlias
186+
187+
// CHECK-DAG: p#0 <-> func.region0#1: NoAlias
188+
// CHECK-DAG: p_fir#0 <-> func.region0#1: NoAlias
189+
// CHECK-DAG: p_hlfir#0 <-> func.region0#1: NoAlias
190+
// CHECK-DAG: p_hlfir#1 <-> func.region0#1: NoAlias
191+
192+
// CHECK-DAG: var2#0 <-> p#0: NoAlias
193+
// CHECK-DAG: var2#0 <-> p_fir#0: NoAlias
194+
// CHECK-DAG: var2#0 <-> p_hlfir#0: NoAlias
195+
// CHECK-DAG: var2#0 <-> p_hlfir#1: NoAlias
196+
// CHECK-DAG: var2_fir#0 <-> p#0: NoAlias
197+
// CHECK-DAG: var2_fir#0 <-> p_fir#0: NoAlias
198+
// CHECK-DAG: var2_fir#0 <-> p_hlfir#0: NoAlias
199+
// CHECK-DAG: var2_fir#0 <-> p_hlfir#1: NoAlias
200+
// CHECK-DAG: var2_hlfir#0 <-> p#0: NoAlias
201+
// CHECK-DAG: var2_hlfir#0 <-> p_fir#0: NoAlias
202+
// CHECK-DAG: var2_hlfir#0 <-> p_hlfir#0: NoAlias
203+
// CHECK-DAG: var2_hlfir#0 <-> p_hlfir#1: NoAlias
204+
// CHECK-DAG: var2_hlfir#1 <-> p#0: NoAlias
205+
// CHECK-DAG: var2_hlfir#1 <-> p_fir#0: NoAlias
206+
// CHECK-DAG: var2_hlfir#1 <-> p_hlfir#0: NoAlias
207+
// CHECK-DAG: var2_hlfir#1 <-> p_hlfir#1: NoAlias
208+
209+
// CHECK-DAG: var2#0 <-> func.region0#0: MayAlias
210+
// CHECK-DAG: var2_fir#0 <-> func.region0#0: MayAlias
211+
// CHECK-DAG: var2_hlfir#0 <-> func.region0#0: MayAlias
212+
// CHECK-DAG: var2_hlfir#1 <-> func.region0#0: MayAlias
213+
214+
// CHECK-DAG: var2#0 <-> box.addr#0: MustAlias
215+
// CHECK-DAG: var2#0 <-> box.addr_fir#0: MustAlias
216+
// CHECK-DAG: var2#0 <-> box.addr_hlfir#0: MustAlias
217+
// CHECK-DAG: var2#0 <-> box.addr_hlfir#1: MustAlias
218+
// CHECK-DAG: var2_fir#0 <-> box.addr#0: MustAlias
219+
// CHECK-DAG: var2_fir#0 <-> box.addr_fir#0: MustAlias
220+
// CHECK-DAG: var2_fir#0 <-> box.addr_hlfir#0: MustAlias
221+
// CHECK-DAG: var2_fir#0 <-> box.addr_hlfir#1: MustAlias
222+
// CHECK-DAG: var2_hlfir#0 <-> box.addr#0: MustAlias
223+
// CHECK-DAG: var2_hlfir#0 <-> box.addr_fir#0: MustAlias
224+
// CHECK-DAG: var2_hlfir#0 <-> box.addr_hlfir#0: MustAlias
225+
// CHECK-DAG: var2_hlfir#0 <-> box.addr_hlfir#1: MustAlias
226+
// CHECK-DAG: var2_hlfir#1 <-> box.addr#0: MustAlias
227+
// CHECK-DAG: var2_hlfir#1 <-> box.addr_fir#0: MustAlias
228+
// CHECK-DAG: var2_hlfir#1 <-> box.addr_hlfir#0: MustAlias
229+
// CHECK-DAG: var2_hlfir#1 <-> box.addr_hlfir#1: MustAlias
230+
231+
// CHECK-DAG: var2#0 <-> func.region0#1: NoAlias
232+
// CHECK-DAG: var2_fir#0 <-> func.region0#1: NoAlias
233+
// CHECK-DAG: var2_hlfir#0 <-> func.region0#1: NoAlias
234+
// CHECK-DAG: var2_hlfir#1 <-> func.region0#1: NoAlias
235+
236+
// CHECK-DAG: func.region0#0 <-> func.region0#1: NoAlias
237+
238+
fir.global @_QMpointersEp : !fir.box<!fir.ptr<f32>> {
239+
%0 = fir.zero_bits !fir.ptr<f32>
240+
%1 = fir.embox %0 : (!fir.ptr<f32>) -> !fir.box<!fir.ptr<f32>>
241+
fir.has_value %1 : !fir.box<!fir.ptr<f32>>
242+
}
243+
244+
fir.global internal @_QFEvar2 target : f32 {
245+
%cst = arith.constant 2.000000e+00 : f32
246+
fir.has_value %cst : f32
247+
}
248+
249+
func.func @_QFPtest4(%arg0: !fir.ref<!fir.box<!fir.ptr<f32>>> {fir.bindc_name = "p1"}, %arg1: !fir.ref<f32>) attributes {test.ptr = "func"} {
250+
%4 = fir.address_of(@_QFEvar2) {test.ptr = "var2"} : !fir.ref<f32>
251+
%fir_decl_var2 = fir.declare %4 {uniq_name = "var2_fir", test.ptr = "var2_fir"}: (!fir.ref<f32>) -> !fir.ref<f32>
252+
%hlfir_decl_var2:2 = hlfir.declare %4 {uniq_name = "var2_hlfir", test.ptr = "var2_hlfir"}: (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
253+
%5 = fir.address_of(@_QMpointersEp) {test.ptr = "p"} : !fir.ref<!fir.box<!fir.ptr<f32>>>
254+
%fir_decl_p = fir.declare %5 {uniq_name = "p_fir", test.ptr = "p_fir"}: (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>>
255+
%hlfir_decl_p:2 = hlfir.declare %5 {uniq_name = "p_hlfir", test.ptr = "p_hlfir"}: (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> (!fir.ref<!fir.box<!fir.ptr<f32>>>, !fir.ref<!fir.box<!fir.ptr<f32>>>)
256+
%13 = fir.convert %4 {test.ptr = "box.addr"} : (!fir.ref<f32>) -> !fir.ptr<f32>
257+
%fir_decl_convert = fir.declare %13 {uniq_name = "box_addr_fir", test.ptr = "box.addr_fir"}: (!fir.ptr<f32>) -> !fir.ptr<f32>
258+
%hlfir_decl_convert:2 = hlfir.declare %13 {uniq_name = "box_addr_hlfir", test.ptr = "box.addr_hlfir"}: (!fir.ptr<f32>) -> (!fir.ptr<f32>, !fir.ptr<f32>)
259+
return
260+
}

0 commit comments

Comments
 (0)