@@ -32,18 +32,17 @@ static constexpr llvm::StringRef builtinPrefix = "_QM__fortran_builtins";
32
32
33
33
static void processAddrOfOp (fir::AddrOfOp addrOfOp,
34
34
mlir::SymbolTable &symbolTable,
35
- llvm::DenseSet<fir::GlobalOp> &candidates) {
35
+ llvm::DenseSet<fir::GlobalOp> &candidates,
36
+ bool recurseInGlobal) {
36
37
if (auto globalOp = symbolTable.lookup <fir::GlobalOp>(
37
38
addrOfOp.getSymbol ().getRootReference ().getValue ())) {
38
39
// TO DO: limit candidates to non-scalars. Scalars appear to have been
39
40
// folded in already.
40
41
if (globalOp.getConstant ()) {
41
- // Limit recursion to builtin global for now.
42
- if (globalOp.getSymName ().starts_with (builtinPrefix)) {
42
+ if (recurseInGlobal)
43
43
globalOp.walk ([&](fir::AddrOfOp op) {
44
- processAddrOfOp (op, symbolTable, candidates);
44
+ processAddrOfOp (op, symbolTable, candidates, recurseInGlobal );
45
45
});
46
- }
47
46
candidates.insert (globalOp);
48
47
}
49
48
}
@@ -52,18 +51,18 @@ static void processAddrOfOp(fir::AddrOfOp addrOfOp,
52
51
static void processEmboxOp (fir::EmboxOp emboxOp, mlir::SymbolTable &symbolTable,
53
52
llvm::DenseSet<fir::GlobalOp> &candidates) {
54
53
if (auto recTy = mlir::dyn_cast<fir::RecordType>(
55
- fir::unwrapRefType (emboxOp.getMemref ().getType ())))
56
- // Only look at builtin record type.
57
- if (recTy.getName ().starts_with (builtinPrefix))
58
- if (auto globalOp = symbolTable.lookup <fir::GlobalOp>(
59
- fir::NameUniquer::getTypeDescriptorName (recTy.getName ()))) {
60
- if (!candidates.contains (globalOp)) {
61
- globalOp.walk ([&](fir::AddrOfOp op) {
62
- processAddrOfOp (op, symbolTable, candidates);
63
- });
64
- candidates.insert (globalOp);
65
- }
54
+ fir::unwrapRefType (emboxOp.getMemref ().getType ()))) {
55
+ if (auto globalOp = symbolTable.lookup <fir::GlobalOp>(
56
+ fir::NameUniquer::getTypeDescriptorName (recTy.getName ()))) {
57
+ if (!candidates.contains (globalOp)) {
58
+ globalOp.walk ([&](fir::AddrOfOp op) {
59
+ processAddrOfOp (op, symbolTable, candidates,
60
+ /* recurseInGlobal=*/ true );
61
+ });
62
+ candidates.insert (globalOp);
66
63
}
64
+ }
65
+ }
67
66
}
68
67
69
68
static void
@@ -74,7 +73,7 @@ prepareImplicitDeviceGlobals(mlir::func::FuncOp funcOp,
74
73
funcOp->getAttrOfType <cuf::ProcAttributeAttr>(cuf::getProcAttrName ())};
75
74
if (cudaProcAttr && cudaProcAttr.getValue () != cuf::ProcAttribute::Host) {
76
75
funcOp.walk ([&](fir::AddrOfOp op) {
77
- processAddrOfOp (op, symbolTable, candidates);
76
+ processAddrOfOp (op, symbolTable, candidates, /* recurseInGlobal= */ false );
78
77
});
79
78
funcOp.walk (
80
79
[&](fir::EmboxOp op) { processEmboxOp (op, symbolTable, candidates); });
@@ -97,7 +96,8 @@ class CUFDeviceGlobal : public fir::impl::CUFDeviceGlobalBase<CUFDeviceGlobal> {
97
96
});
98
97
mod.walk ([&](cuf::KernelOp kernelOp) {
99
98
kernelOp.walk ([&](fir::AddrOfOp addrOfOp) {
100
- processAddrOfOp (addrOfOp, symTable, candidates);
99
+ processAddrOfOp (addrOfOp, symTable, candidates,
100
+ /* recurseInGlobal=*/ false );
101
101
});
102
102
});
103
103
0 commit comments