From: Stephan Herhut Date: Tue, 28 May 2019 11:45:50 +0000 (-0700) Subject: Fix translation of NVVM special registers to intrinsics. X-Git-Tag: llvmorg-11-init~1466^2~1583 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8d703af2f8bd0ff17abb0565c82e3f47b5fc6b0a;p=platform%2Fupstream%2Fllvm.git 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 --- 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 {