Skip to content

Commit 2021fd3

Browse files
committed
[flang] Fixed computation of position of function's arg in AddDebugInfo.
I am working on `-frepack-array` feature (#127147), which produces non-trivial manipulations with arguments of `fir.declare`. In this case, we end up with CFG computation of the `fir.declare` argument, and AddDebugInfo pass incorrectly mapped two dummy arguments to the same arg index in the debug attributes. This patch makes sure that we assign the arg index only if we can prove that we've traced the block argument to the function's entry block. I believe this problem is not specific to `-frepack-arrays`, e.g. it may appear due to MLIR inlining as well.
1 parent f6a7306 commit 2021fd3

File tree

2 files changed

+92
-2
lines changed

2 files changed

+92
-2
lines changed

flang/lib/Optimizer/Transforms/AddDebugInfo.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,13 @@ void AddDebugInfoPass::handleDeclareOp(fir::cg::XDeclareOp declOp,
206206
// a dummy_scope operand).
207207
unsigned argNo = 0;
208208
if (declOp.getDummyScope()) {
209-
if (auto arg = llvm::dyn_cast<mlir::BlockArgument>(declOp.getMemref()))
210-
argNo = arg.getArgNumber() + 1;
209+
if (auto arg = llvm::dyn_cast<mlir::BlockArgument>(declOp.getMemref())) {
210+
// Check if it is the BlockArgument of the function's entry block.
211+
if (auto funcLikeOp =
212+
declOp->getParentOfType<mlir::FunctionOpInterface>())
213+
if (arg.getOwner() == &funcLikeOp.front())
214+
argNo = arg.getArgNumber() + 1;
215+
}
211216
}
212217

213218
auto tyAttr = typeGen.convertType(fir::unwrapRefType(declOp.getType()),
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Test the case when AddDebugInfo pass cannot easily compute
2+
// position of a dummy argument in the arguments list of the function.
3+
// RUN: fir-opt --add-debug-info --mlir-print-debuginfo %s | FileCheck %s
4+
5+
// Only enabled on x86_64
6+
// REQUIRES: x86-registered-target
7+
8+
// CHECK: #[[$ATTR_20:.+]] = #llvm.di_local_variable<scope = #di_subprogram, name = "expected", file = #di_file, line = 3, arg = 1, type = #di_basic_type>
9+
10+
// 'x' is a block argument at the point of fircg.ext_declare,
11+
// but it is not the function's entry block's argument, so
12+
// 'arg' cannot be set currently.
13+
// CHECK: #[[$ATTR_21:.+]] = #llvm.di_local_variable<scope = #di_subprogram, name = "x", file = #di_file, line = 2, type = #di_composite_type>
14+
15+
// Reference Fortran code (compiled with -frepack-arrays):
16+
// subroutine test(expected, x)
17+
// integer :: x(:)
18+
// integer :: expected
19+
// end subroutine test
20+
21+
#loc1 = loc("debug-dummy-argument.f90":1:1)
22+
#loc4 = loc("debug-dummy-argument.f90":2:14)
23+
module attributes {dlti.dl_spec = #dlti.dl_spec<i128 = dense<128> : vector<2xi64>, f80 = dense<128> : vector<2xi64>, i1 = dense<8> : vector<2xi64>, !llvm.ptr<271> = dense<32> : vector<4xi64>, !llvm.ptr = dense<64> : vector<4xi64>, i64 = dense<64> : vector<2xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, i32 = dense<32> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, !llvm.ptr<270> = dense<32> : vector<4xi64>, i8 = dense<8> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, "dlti.stack_alignment" = 128 : i64, "dlti.mangling_mode" = "e", "dlti.endianness" = "little">, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", fir.target_cpu = "x86-64", llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", llvm.ident = "flang", llvm.target_triple = "x86_64-unknown-linux-gnu"} {
24+
func.func @test_(%arg0: !fir.ref<i32> {fir.bindc_name = "expected"} loc("debug-dummy-argument.f90":1:1), %arg1: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "x"} loc("debug-dummy-argument.f90":1:1)) attributes {fir.internal_name = "_QPtest"} {
25+
%c1_i32 = arith.constant 1 : i32 loc(#loc2)
26+
%c2_i32 = arith.constant 2 : i32 loc(#loc2)
27+
%false = arith.constant false loc(#loc2)
28+
%c0 = arith.constant 0 : index loc(#loc2)
29+
%0 = fir.undefined !fir.dscope loc(#loc1)
30+
%1 = fircg.ext_declare %arg0 dummy_scope %0 {uniq_name = "_QFtestEexpected"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32> loc(#loc3)
31+
%2 = fir.is_present %arg1 : (!fir.box<!fir.array<?xi32>>) -> i1 loc(#loc4)
32+
cf.cond_br %2, ^bb1, ^bb3(%c0, %false : index, i1) loc(#loc4)
33+
^bb1: // pred: ^bb0
34+
%3 = fir.convert %arg1 : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none> loc(#loc4)
35+
%4 = fir.call @_FortranAIsContiguous(%3) : (!fir.box<none>) -> i1 loc(#loc4)
36+
cf.cond_br %4, ^bb3(%c0, %false : index, i1), ^bb2 loc(#loc4)
37+
^bb2: // pred: ^bb1
38+
%5:3 = fir.box_dims %arg1, %c0 : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index) loc(#loc4)
39+
%6 = fir.box_addr %arg1 : (!fir.box<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>> loc(#loc4)
40+
%7 = fir.is_present %6 : (!fir.ref<!fir.array<?xi32>>) -> i1 loc(#loc4)
41+
cf.br ^bb3(%5#1, %7 : index, i1) loc(#loc4)
42+
^bb3(%8: index loc("debug-dummy-argument.f90":2:14), %9: i1 loc("debug-dummy-argument.f90":2:14)): // 3 preds: ^bb0, ^bb1, ^bb2
43+
cf.cond_br %9, ^bb4, ^bb5(%arg1 : !fir.box<!fir.array<?xi32>>) loc(#loc4)
44+
^bb4: // pred: ^bb3
45+
%10 = fir.allocmem !fir.array<?xi32>, %8 {bindc_name = ".repacked", uniq_name = ""} loc(#loc4)
46+
%11 = fircg.ext_embox %10(%8) : (!fir.heap<!fir.array<?xi32>>, index) -> !fir.box<!fir.heap<!fir.array<?xi32>>> loc(#loc4)
47+
%12 = fir.address_of(@_QQclXa2e9fed26218fcd52fa404284303739b) : !fir.ref<!fir.char<1,43>> loc(#loc4)
48+
%13 = fir.convert %11 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.box<none> loc(#loc4)
49+
%14 = fir.convert %arg1 : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none> loc(#loc4)
50+
%15 = fir.convert %12 : (!fir.ref<!fir.char<1,43>>) -> !fir.ref<i8> loc(#loc4)
51+
fir.call @_FortranAShallowCopyDirect(%13, %14, %15, %c2_i32) : (!fir.box<none>, !fir.box<none>, !fir.ref<i8>, i32) -> () loc(#loc4)
52+
%16 = fircg.ext_rebox %11 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.box<!fir.array<?xi32>> loc(#loc4)
53+
cf.br ^bb5(%16 : !fir.box<!fir.array<?xi32>>) loc(#loc4)
54+
^bb5(%17: !fir.box<!fir.array<?xi32>> loc("debug-dummy-argument.f90":2:14)): // 2 preds: ^bb3, ^bb4
55+
%18 = fircg.ext_declare %17 dummy_scope %0 {uniq_name = "_QFtestEx"} : (!fir.box<!fir.array<?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?xi32>> loc(#loc4)
56+
cf.cond_br %2, ^bb6, ^bb8 loc(#loc1)
57+
^bb6: // pred: ^bb5
58+
%19 = fir.box_addr %17 : (!fir.box<!fir.array<?xi32>>) -> !fir.heap<!fir.array<?xi32>> loc(#loc1)
59+
%20 = fir.box_addr %arg1 : (!fir.box<!fir.array<?xi32>>) -> !fir.heap<!fir.array<?xi32>> loc(#loc1)
60+
%21 = fir.convert %19 : (!fir.heap<!fir.array<?xi32>>) -> index loc(#loc1)
61+
%22 = fir.convert %20 : (!fir.heap<!fir.array<?xi32>>) -> index loc(#loc1)
62+
%23 = arith.cmpi ne, %21, %22 : index loc(#loc1)
63+
cf.cond_br %23, ^bb7, ^bb8 loc(#loc1)
64+
^bb7: // pred: ^bb6
65+
%24 = fir.address_of(@_QQclXa2e9fed26218fcd52fa404284303739b) : !fir.ref<!fir.char<1,43>> loc(#loc1)
66+
%25 = fir.convert %arg1 : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none> loc(#loc1)
67+
%26 = fir.convert %17 : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none> loc(#loc1)
68+
%27 = fir.convert %24 : (!fir.ref<!fir.char<1,43>>) -> !fir.ref<i8> loc(#loc1)
69+
fir.call @_FortranAShallowCopyDirect(%25, %26, %27, %c1_i32) : (!fir.box<none>, !fir.box<none>, !fir.ref<i8>, i32) -> () loc(#loc1)
70+
fir.freemem %19 : !fir.heap<!fir.array<?xi32>> loc(#loc1)
71+
cf.br ^bb8 loc(#loc1)
72+
^bb8: // 3 preds: ^bb5, ^bb6, ^bb7
73+
return loc(#loc5)
74+
} loc(#loc1)
75+
func.func private @_FortranAShallowCopyDirect(!fir.box<none>, !fir.box<none>, !fir.ref<i8>, i32) attributes {fir.runtime} loc(#loc1)
76+
fir.global linkonce @_QQclXa2e9fed26218fcd52fa404284303739b constant : !fir.char<1,43> {
77+
%0 = fir.string_lit "debug-dummy-argument.f90\00"(43) : !fir.char<1,43> loc(#loc1)
78+
fir.has_value %0 : !fir.char<1,43> loc(#loc1)
79+
} loc(#loc1)
80+
func.func private @_FortranAIsContiguous(!fir.box<none>) -> i1 attributes {fir.runtime} loc(#loc4)
81+
} loc(#loc)
82+
#loc = loc("debug-dummy-argument.f90":0:0)
83+
#loc2 = loc(unknown)
84+
#loc3 = loc("debug-dummy-argument.f90":3:14)
85+
#loc5 = loc("debug-dummy-argument.f90":4:1)

0 commit comments

Comments
 (0)