diff --git a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp index 648628fd1c9af..cfd90ff723793 100644 --- a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp +++ b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp @@ -12,6 +12,7 @@ #include "flang/Optimizer/Dialect/FIROpsSupport.h" #include "flang/Optimizer/Support/InternalNames.h" #include "flang/Optimizer/Transforms/Passes.h" +#include "mlir/Dialect/GPU/IR/GPUDialect.h" #include "mlir/IR/Attributes.h" #include "mlir/IR/SymbolTable.h" #include "mlir/Pass/Pass.h" @@ -58,26 +59,36 @@ void ExternalNameConversionPass::runOnOperation() { auto *context = &getContext(); llvm::DenseMap remappings; - // Update names of external Fortran functions and names of Common Block - // globals. - for (auto &funcOrGlobal : op->getRegion(0).front()) { - if (llvm::isa(funcOrGlobal) || - llvm::isa(funcOrGlobal)) { - auto symName = funcOrGlobal.getAttrOfType( - mlir::SymbolTable::getSymbolAttrName()); - auto deconstructedName = fir::NameUniquer::deconstruct(symName); - if (fir::NameUniquer::isExternalFacingUniquedName(deconstructedName)) { - auto newName = - mangleExternalName(deconstructedName, appendUnderscoreOpt); - auto newAttr = mlir::StringAttr::get(context, newName); - mlir::SymbolTable::setSymbolName(&funcOrGlobal, newAttr); - auto newSymRef = mlir::FlatSymbolRefAttr::get(newAttr); - remappings.try_emplace(symName, newSymRef); - if (llvm::isa(funcOrGlobal)) - funcOrGlobal.setAttr(fir::getInternalFuncNameAttrName(), symName); + + auto renameFuncOrGlobalInModule = [&](mlir::Operation *module) { + for (auto &funcOrGlobal : module->getRegion(0).front()) { + if (llvm::isa(funcOrGlobal) || + llvm::isa(funcOrGlobal)) { + auto symName = funcOrGlobal.getAttrOfType( + mlir::SymbolTable::getSymbolAttrName()); + auto deconstructedName = fir::NameUniquer::deconstruct(symName); + if (fir::NameUniquer::isExternalFacingUniquedName(deconstructedName)) { + auto newName = + mangleExternalName(deconstructedName, appendUnderscoreOpt); + auto newAttr = mlir::StringAttr::get(context, newName); + mlir::SymbolTable::setSymbolName(&funcOrGlobal, newAttr); + auto newSymRef = mlir::FlatSymbolRefAttr::get(newAttr); + remappings.try_emplace(symName, newSymRef); + if (llvm::isa(funcOrGlobal)) + funcOrGlobal.setAttr(fir::getInternalFuncNameAttrName(), symName); + } } } - } + }; + + // Update names of external Fortran functions and names of Common Block + // globals. + renameFuncOrGlobalInModule(op); + + // Do the same in GPU modules. + if (auto mod = mlir::dyn_cast_or_null(*op)) + for (auto gpuMod : mod.getOps()) + renameFuncOrGlobalInModule(gpuMod); if (remappings.empty()) return; diff --git a/flang/test/Fir/CUDA/cuda-extranal-mangling.mlir b/flang/test/Fir/CUDA/cuda-extranal-mangling.mlir new file mode 100644 index 0000000000000..551a89a7018c2 --- /dev/null +++ b/flang/test/Fir/CUDA/cuda-extranal-mangling.mlir @@ -0,0 +1,13 @@ +// RUN: fir-opt --split-input-file --external-name-interop %s | FileCheck %s + +gpu.module @cuda_device_mod { + gpu.func @_QPfoo() { + fir.call @_QPthreadfence() fastmath : () -> () + gpu.return + } + func.func private @_QPthreadfence() attributes {cuf.proc_attr = #cuf.cuda_proc} +} + +// CHECK-LABEL: gpu.func @_QPfoo +// CHECK: fir.call @threadfence_() +// CHECK: func.func private @threadfence_()