[mlir] Convert function signatures before converting globals

Summary: This allows global initializers to reference functions.

Differential Revision: https://reviews.llvm.org/D83266
This commit is contained in:
Sean Silva 2020-07-06 16:49:52 -07:00
parent 6cff71e92e
commit a084b94f11
3 changed files with 24 additions and 2 deletions

View File

@ -61,6 +61,8 @@ public:
LLVM::ensureDistinctSuccessors(m);
T translator(m, std::move(llvmModule));
if (failed(translator.convertFunctionSignatures()))
return nullptr;
if (failed(translator.convertGlobals()))
return nullptr;
if (failed(translator.convertFunctions()))
@ -94,6 +96,7 @@ private:
/// Check whether the module contains only supported ops directly in its body.
static LogicalResult checkSupportedModuleOps(Operation *m);
LogicalResult convertFunctionSignatures();
LogicalResult convertFunctions();
LogicalResult convertGlobals();
LogicalResult convertOneFunction(LLVMFuncOp func);

View File

@ -783,12 +783,13 @@ LogicalResult ModuleTranslation::checkSupportedModuleOps(Operation *m) {
return success();
}
LogicalResult ModuleTranslation::convertFunctions() {
LogicalResult ModuleTranslation::convertFunctionSignatures() {
// Lock access to the llvm context.
llvm::sys::SmartScopedLock<true> scopedLock(
llvmDialect->getLLVMContextMutex());
// Declare all functions first because there may be function calls that form a
// call graph with cycles.
// call graph with cycles, or global initializers that reference functions.
for (auto function : getModuleBody(mlirModule).getOps<LLVMFuncOp>()) {
llvm::FunctionCallee llvmFuncCst = llvmModule->getOrInsertFunction(
function.getName(),
@ -802,6 +803,14 @@ LogicalResult ModuleTranslation::convertFunctions() {
return failure();
}
return success();
}
LogicalResult ModuleTranslation::convertFunctions() {
// Lock access to the llvm context.
llvm::sys::SmartScopedLock<true> scopedLock(
llvmDialect->getLLVMContextMutex());
// Convert functions.
for (auto function : getModuleBody(mlirModule).getOps<LLVMFuncOp>()) {
// Ignore external functions.

View File

@ -1230,3 +1230,13 @@ llvm.func @constant_bf16() -> !llvm<"bfloat"> {
// CHECK: ret bfloat 0xR4120
// -----
llvm.func @address_taken() {
llvm.return
}
llvm.mlir.global internal constant @taker_of_address() : !llvm<"void()*"> {
%0 = llvm.mlir.addressof @address_taken : !llvm<"void()*">
llvm.return %0 : !llvm<"void()*">
}