From 8d703af2f8bd0ff17abb0565c82e3f47b5fc6b0a Mon Sep 17 00:00:00 2001 From: Stephan Herhut Date: Tue, 28 May 2019 04:45:50 -0700 Subject: [PATCH] Fix translation of NVVM special registers to intrinsics. The original implementation did not map the return value of the intrinsics call to the result value of the special register op. Uses of the result value hence hit a nullpointer. -- PiperOrigin-RevId: 250255436 --- mlir/include/mlir/LLVMIR/NVVMOps.td | 4 ++-- mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h | 1 + mlir/lib/Target/LLVMIR/ConvertToNVVMIR.cpp | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/mlir/include/mlir/LLVMIR/NVVMOps.td b/mlir/include/mlir/LLVMIR/NVVMOps.td index 5a3b21c..dd572ae 100644 --- a/mlir/include/mlir/LLVMIR/NVVMOps.td +++ b/mlir/include/mlir/LLVMIR/NVVMOps.td @@ -38,8 +38,8 @@ class NVVM_SpecialRegisterOp traits = []> : NVVM_Op, Results<(outs LLVM_Type:$res)>, Arguments<(ins)> { - string llvmBuilder = "createIntrinsicCall(builder, llvm::Intrinsic::nvvm_" - # !subst(".","_", mnemonic) # ");"; + string llvmBuilder = "$res = createIntrinsicCall(builder," + # "llvm::Intrinsic::nvvm_" # !subst(".","_", mnemonic) # ");"; let parser = [{ return parseNVVMSpecialRegisterOp(parser, result); }]; let printer = [{ printNVVMSpecialRegisterOp(p, this->getOperation()); }]; } diff --git a/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h b/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h index e85f7b6..493b0ca 100644 --- a/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h +++ b/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h @@ -86,6 +86,7 @@ private: Module &mlirModule; std::unique_ptr llvmModule; +protected: // Mappings between original and translated values, used for lookups. llvm::StringMap functionMapping; llvm::DenseMap valueMapping; diff --git a/mlir/lib/Target/LLVMIR/ConvertToNVVMIR.cpp b/mlir/lib/Target/LLVMIR/ConvertToNVVMIR.cpp index 2bd58ba..d8c7692 100644 --- a/mlir/lib/Target/LLVMIR/ConvertToNVVMIR.cpp +++ b/mlir/lib/Target/LLVMIR/ConvertToNVVMIR.cpp @@ -34,11 +34,11 @@ using namespace mlir; namespace { -static void createIntrinsicCall(llvm::IRBuilder<> &builder, - llvm::Intrinsic::ID intrinsic) { +static llvm::Value *createIntrinsicCall(llvm::IRBuilder<> &builder, + llvm::Intrinsic::ID intrinsic) { llvm::Module *module = builder.GetInsertBlock()->getModule(); llvm::Function *fn = llvm::Intrinsic::getDeclaration(module, intrinsic, {}); - builder.CreateCall(fn); + return builder.CreateCall(fn); } class ModuleTranslation : public LLVM::ModuleTranslation { -- 2.7.4