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
}]>];
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", []> {
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;
}
// 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
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;
^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
; 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
^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