Fix translation of NVVM special registers to intrinsics.
authorStephan Herhut <herhut@google.com>
Tue, 28 May 2019 11:45:50 +0000 (04:45 -0700)
committerMehdi Amini <joker.eph@gmail.com>
Sun, 2 Jun 2019 03:05:12 +0000 (20:05 -0700)
    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
mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h
mlir/lib/Target/LLVMIR/ConvertToNVVMIR.cpp

index 5a3b21c..dd572ae 100644 (file)
@@ -38,8 +38,8 @@ class NVVM_SpecialRegisterOp<string mnemonic,
     list<OpTrait> traits = []> :
   NVVM_Op<mnemonic, !listconcat(traits, [NoSideEffect])>,
   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()); }];
 }
index e85f7b6..493b0ca 100644 (file)
@@ -86,6 +86,7 @@ private:
   Module &mlirModule;
   std::unique_ptr<llvm::Module> llvmModule;
 
+protected:
   // Mappings between original and translated values, used for lookups.
   llvm::StringMap<llvm::Function *> functionMapping;
   llvm::DenseMap<Value *, llvm::Value *> valueMapping;
index 2bd58ba..d8c7692 100644 (file)
 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 {