Skip to content

Commit b4124cf

Browse files
committed
Fix case of allocatable arg
The address in it should be a `SourceKind::Direct` not a `SourceKind::Argument`. The fix is to set `SourceKind::Direct` in the case of `!fir.heap` besides just pointers. An effect is that the address *in* it cannot alias the address *of* it. flang/test/Analysis/AliasAnalysis/alias-analysis-8.fir expects the same relationship in the case of allocatable globals. Extend AddAliasTags to handle the case of `SourceKind::Direct` for an arg, and update the occurrence in flang/test/Transforms/tbaa2.fir.
1 parent 91def8c commit b4124cf

File tree

4 files changed

+31
-9
lines changed

4 files changed

+31
-9
lines changed

flang/lib/Optimizer/Analysis/AliasAnalysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ AliasAnalysis::Source AliasAnalysis::getSource(mlir::Value v) {
412412
attributes.set(Attribute::Target);
413413
if (Source::isPointerReference(ty))
414414
attributes.set(Attribute::Pointer);
415-
if (followBoxAddr && attributes.test(Attribute::Pointer))
415+
if (followBoxAddr && fir::isa_ref_type(ty))
416416
type = SourceKind::Direct;
417417
else
418418
type = SourceKind::Argument;

flang/lib/Optimizer/Transforms/AddAliasTags.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,28 @@ void AddAliasTagsPass::runOnAliasInterface(fir::FirAliasTagOpInterface op,
171171
<< " at " << *op << "\n");
172172
tag = state.getFuncTree(func).directDataTree.getTag(name);
173173
} else {
174-
// SourceKind::Direct is likely to be extended to cases which are not a
175-
// SymbolRefAttr in the future
176-
LLVM_DEBUG(llvm::dbgs().indent(2) << "Can't get name for direct "
177-
<< source << " at " << *op << "\n");
174+
bool sourceIsDummyArgument = false;
175+
if (auto blockArg =
176+
source.u.get<mlir::Value>().dyn_cast<mlir::BlockArgument>())
177+
sourceIsDummyArgument = blockArg.getOwner()->isEntryBlock();
178+
if (sourceIsDummyArgument) {
179+
std::string name = getFuncArgName(source.u.get<mlir::Value>());
180+
if (!name.empty()) {
181+
LLVM_DEBUG(llvm::dbgs().indent(2)
182+
<< "Found reference to direct from dummy argument " << name
183+
<< " at " << *op << "\n");
184+
tag = state.getFuncTree(func).directDataTree.getTag(name);
185+
} else {
186+
LLVM_DEBUG(llvm::dbgs().indent(2)
187+
<< "WARN: for direct, couldn't find a name for dummy "
188+
<< "argument " << *op << "\n");
189+
}
190+
} else {
191+
// SourceKind::Direct is likely to be extended to more cases in the
192+
// future
193+
LLVM_DEBUG(llvm::dbgs().indent(2) << "Can't get name for direct "
194+
<< source << " at " << *op << "\n");
195+
}
178196
}
179197

180198
// TBAA for local allocations

flang/test/Analysis/AliasAnalysis/alias-analysis-box-addr-load/arg.fir

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// as well as its diagnostic output.
55
// RUN: fir-opt %s \
66
// RUN: -pass-pipeline='builtin.module(func.func(test-fir-alias-analysis))' \
7-
// RUN: --mlir-disable-threading 2>&1 | FileCheck %s
7+
// RUN: --mlir-disable-threading 2>&1 | FileCheck -match-full-lines %s
88

99
// subroutine test(p0, p1, arr, t_arr, alloc, t_alloc)
1010
// real, pointer :: p0, p1
@@ -51,8 +51,12 @@
5151
// CHECK-DAG: p0.tgt_addr#0 <-> alloc.tgt_addr#0: NoAlias
5252
// CHECK-DAG: p0.tgt_addr#0 <-> t_alloc.tgt_addr#0: MayAlias
5353

54+
// The address *in* an allocatable cannot alias the address *of* that
55+
// allocatable.
56+
// CHECK-DAG: alloc#0 <-> alloc.tgt_addr#0: NoAlias
57+
5458
func.func @_QPtest(%arg0: !fir.ref<!fir.box<!fir.ptr<f32>>> {fir.bindc_name = "p0"}, %arg1: !fir.ref<!fir.box<!fir.ptr<f32>>> {fir.bindc_name = "p1"}, %arg2: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "arr"}, %arg3: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "t_arr", fir.target}, %arg4: !fir.ref<!fir.box<!fir.heap<f32>>> {fir.bindc_name = "alloc"}, %arg5: !fir.ref<!fir.box<!fir.heap<f32>>> {fir.bindc_name = "t_alloc", fir.target}) attributes {test.ptr="func"} {
55-
%0:2 = hlfir.declare %arg4 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtestEalloc"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
59+
%0:2 = hlfir.declare %arg4 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtestEalloc", test.ptr="alloc"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
5660
%1:2 = hlfir.declare %arg2 {uniq_name = "_QFtestEarr"} : (!fir.box<!fir.array<?xf32>>) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>)
5761
%2:2 = hlfir.declare %arg0 {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFtestEp0"} : (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> (!fir.ref<!fir.box<!fir.ptr<f32>>>, !fir.ref<!fir.box<!fir.ptr<f32>>>)
5862
%3:2 = hlfir.declare %arg1 {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFtestEp1"} : (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> (!fir.ref<!fir.box<!fir.ptr<f32>>>, !fir.ref<!fir.box<!fir.ptr<f32>>>)

flang/test/Transforms/tbaa2.fir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@
4848
// CHECK: #[[ANY_ACCESS:.+]] = #llvm.tbaa_type_desc<id = "any access", members = {<#[[ROOT]], 0>}>
4949
// CHECK: #[[ANY_DATA:.+]] = #llvm.tbaa_type_desc<id = "any data access", members = {<#[[ANY_ACCESS]], 0>}>
5050
// CHECK: #[[ANY_GLBL:.+]] = #llvm.tbaa_type_desc<id = "global data", members = {<#[[ANY_DATA]], 0>}>
51-
// CHECK: #[[ANY_ARG:.+]] = #llvm.tbaa_type_desc<id = "dummy arg data", members = {<#[[ANY_DATA]], 0>}>
5251
// CHECK: #[[ANY_DIRECT:.+]] = #llvm.tbaa_type_desc<id = "direct data", members = {<#[[ANY_DATA]], 0>}>
52+
// CHECK: #[[ANY_ARG:.+]] = #llvm.tbaa_type_desc<id = "dummy arg data", members = {<#[[ANY_DATA]], 0>}>
5353
// CHECK: #[[GLBL_ZSTART:.+]] = #llvm.tbaa_type_desc<id = "global data/_QMmodEzstart", members = {<#[[ANY_GLBL]], 0>}>
5454
// CHECK: #[[GLBL_ZSTOP:.+]] = #llvm.tbaa_type_desc<id = "global data/_QMmodEzstop", members = {<#[[ANY_GLBL]], 0>}>
5555
// CHECK: #[[GLBL_YSTART:.+]] = #llvm.tbaa_type_desc<id = "global data/_QMmodEystart", members = {<#[[ANY_GLBL]], 0>}>
5656
// CHECK: #[[GLBL_YSTOP:.+]] = #llvm.tbaa_type_desc<id = "global data/_QMmodEystop", members = {<#[[ANY_GLBL]], 0>}>
5757
// CHECK: #[[GLBL_XSTART:.+]] = #llvm.tbaa_type_desc<id = "global data/_QMmodExstart", members = {<#[[ANY_GLBL]], 0>}>
58-
// CHECK: #[[ARG_LOW:.+]] = #llvm.tbaa_type_desc<id = "dummy arg data/_QMmodFcalleeElow", members = {<#[[ANY_ARG]], 0>}>
58+
// CHECK: #[[ARG_LOW:.+]] = #llvm.tbaa_type_desc<id = "direct data/_QMmodFcalleeElow", members = {<#[[ANY_DIRECT]], 0>}>
5959
// CHECK: #[[DIRECT_A:.+]] = #llvm.tbaa_type_desc<id = "direct data/_QMmodEa", members = {<#[[ANY_DIRECT]], 0>}>
6060
// CHECK: #[[DIRECT_B:.+]] = #llvm.tbaa_type_desc<id = "direct data/_QMmodEb", members = {<#[[ANY_DIRECT]], 0>}>
6161
// CHECK: #[[ARG_Z:.+]] = #llvm.tbaa_type_desc<id = "dummy arg data/_QMmodFcalleeEz", members = {<#[[ANY_ARG]], 0>}>

0 commit comments

Comments
 (0)