[MLIR] Added llvm.freeze
authorSagar Jain <cs17btech11034@iith.ac.in>
Mon, 2 Mar 2020 09:19:57 +0000 (10:19 +0100)
committerAlex Zinenko <zinenko@google.com>
Mon, 2 Mar 2020 09:24:01 +0000 (10:24 +0100)
This patch adds llvm.freeze & processes undef constants from LLVM IR.

Syntax:
LLVM IR
`<result> = freeze ty <val>`

MLIR LLVM Dialect:
`llvm.freeze val attr-dict : type`

Example:
LLVM IR: `%3 = freeze i32 5`
MLIR: `%6 = llvm.freeze %5 : !llvm.i32`

Differential Revision: https://reviews.llvm.org/D75329

mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp
mlir/test/Dialect/LLVMIR/roundtrip.mlir
mlir/test/Target/import.ll
mlir/test/Target/llvmir.mlir

index 601bfbf68926c8b553bdd9a44cdc6c6f4338b795..66d5f9d3c82c6b19d9350e320465da05105d0ef4 100644 (file)
@@ -451,6 +451,11 @@ def LLVM_SelectOp
     }]>];
   let assemblyFormat = "operands attr-dict `:` type($condition) `,` type($res)";
 }
+def LLVM_FreezeOp : LLVM_OneResultOp<"freeze", [SameOperandsAndResultType]>,
+                    Arguments<(ins LLVM_Type:$val)> {
+  let assemblyFormat = "$val attr-dict `:` type($val)";
+  string llvmBuilder = "builder.CreateFreeze($val);";
+}
 
 // Terminators.
 def LLVM_BrOp : LLVM_TerminatorOp<"br", []> {
index b5cfcd6786d154a095aca09bc98c73769195c8df..5441385acb03fb47f18a8108114552f7e3729536 100644 (file)
@@ -426,6 +426,12 @@ Value Importer::processConstant(llvm::Constant *c) {
     i->deleteValue();
     return instMap[c] = instMap[i];
   }
+  if (auto *ue = dyn_cast<llvm::UndefValue>(c)) {
+    LLVMType type = processType(ue->getType());
+    if (!type)
+      return nullptr;
+    return instMap[c] = bEntry.create<UndefOp>(UnknownLoc::get(context), type);
+  }
   emitError(unknownLoc) << "unhandled constant: " << diag(*c);
   return nullptr;
 }
@@ -493,7 +499,7 @@ static const DenseMap<unsigned, StringRef> opcMap = {
     // ICmp is handled specially.
     // FIXME: fcmp
     // PHI is handled specially.
-    INST(Call, Call),
+    INST(Freeze, Freeze), INST(Call, Call),
     // FIXME: select
     // FIXME: vaarg
     // FIXME: extractelement
@@ -591,6 +597,7 @@ LogicalResult Importer::processInstruction(llvm::Instruction *inst) {
   case llvm::Instruction::PtrToInt:
   case llvm::Instruction::IntToPtr:
   case llvm::Instruction::AddrSpaceCast:
+  case llvm::Instruction::Freeze:
   case llvm::Instruction::BitCast: {
     OperationState state(loc, opcMap.lookup(inst->getOpcode()));
     SmallVector<Value, 4> ops;
index 53a2bb1f2658debdc692b84e944d9ed20b4d986b..8a8de4cf6f213b8d89a653e02009a469aca359a2 100644 (file)
@@ -282,3 +282,14 @@ llvm.func @invokeLandingpad() -> !llvm.i32 {
 ^bb4:
   llvm.return %0 : !llvm.i32
 }
+
+// CHECK-LABEL: @useFreezeOp
+func @useFreezeOp(%arg0: !llvm.i32) {
+  // CHECK:  = llvm.freeze %[[ARG0:.*]] : !llvm.i32
+  %0 = llvm.freeze %arg0 : !llvm.i32
+  // CHECK: %[[x:.*]] = llvm.mlir.undef : !llvm.i8
+  %1 = llvm.mlir.undef : !llvm.i8
+  // CHECK:  = llvm.freeze %[[x]] : !llvm.i8
+  %2 = llvm.freeze %1 : !llvm.i8
+  return
+}
\ No newline at end of file
index 9c1f13aed68026d82507fe4d37409c6d210cd865..5e38b6b2fe7d610f27e485850e335cf2ec744274 100644 (file)
@@ -297,3 +297,14 @@ define i32 @invokeLandingpad() personality i8* bitcast (i32 (...)* @__gxx_person
   ; CHECK: llvm.return %{{[0-9]+}} : !llvm.i32
   ret i32 0
 }
+
+;CHECK-LABEL: @useFreezeOp
+define i32 @useFreezeOp(i32 %x) {
+  ;CHECK: %{{[0-9]+}} = llvm.freeze %{{[0-9a-z]+}} : !llvm.i32
+  %1 = freeze i32 %x
+  %2 = add i8 10, 10
+  ;CHECK: %{{[0-9]+}} = llvm.freeze %{{[0-9]+}} : !llvm.i8
+  %3 = freeze i8 %2
+  %poison = add nsw i1 0, undef
+  ret i32 0
+}
\ No newline at end of file
index 1049c9c6ffede92116c5ee1b48bd217cb5a8b509..9e0e8c247e2037dcc01f5772950a676df05bb4e0 100644 (file)
@@ -1171,3 +1171,13 @@ llvm.func @invokeLandingpad() -> !llvm.i32 {
 ^bb3:  // pred: ^bb1
   %8 = llvm.invoke @bar(%6) to ^bb2 unwind ^bb1 : (!llvm<"i8*">) -> !llvm<"i8*">
 }
+
+// CHECK-LABEL: @callFreezeOp
+llvm.func @callFreezeOp(%x : !llvm.i32) {
+  // CHECK: freeze i32 %{{[0-9]+}}
+  %0 = llvm.freeze %x : !llvm.i32
+  %1 = llvm.mlir.undef : !llvm.i32
+  // CHECK: freeze i32 undef 
+  %2 = llvm.freeze %1 : !llvm.i32
+  llvm.return
+}
\ No newline at end of file