Commit d85821df authored by Sagar Jain's avatar Sagar Jain Committed by Alex Zinenko
Browse files

[MLIR] Added llvm.freeze

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
parent 8c7c32b4
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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", []> {
+8 −1
Original line number Diff line number Diff line
@@ -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;
+11 −0
Original line number Diff line number Diff line
@@ -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
+11 −0
Original line number Diff line number Diff line
@@ -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
+10 −0
Original line number Diff line number Diff line
@@ -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