[Mlir-commits] [mlir] c9eeeb3 - [mlir] [VectorOps] remove print_i1 from runtime support library
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Jun 18 11:08:01 PDT 2020
Author: aartbik
Date: 2020-06-18T11:07:43-07:00
New Revision: c9eeeb38719fd40d0ecdf2842aaace1dd7c5b5e8
URL: https://github.com/llvm/llvm-project/commit/c9eeeb38719fd40d0ecdf2842aaace1dd7c5b5e8
DIFF: https://github.com/llvm/llvm-project/commit/c9eeeb38719fd40d0ecdf2842aaace1dd7c5b5e8.diff
LOG: [mlir] [VectorOps] remove print_i1 from runtime support library
Summary:
The "i1" (viz. bool) type does not have a proper equivalent on the "C"
size. So, to avoid any ABIs issues, we simply use print_i32 on an i32
value of one or zero for true and false. This has the added advantage
that one less function needs to be implemented when porting the runtime
support library.
Reviewers: ftynse, bkramer, nicolasvasilache
Reviewed By: ftynse
Subscribers: mehdi_amini, rriddle, jpienaar, shauheen, antiagainst, nicolasvasilache, arpith-jacob, mgester, lucyrfox, liufengdb, stephenneuendorffer, Joonsoo, grosul1, frgossen, Kayjukh, jurahul, msifontes
Tags: #mlir
Differential Revision: https://reviews.llvm.org/D82048
Added:
Modified:
mlir/include/mlir/ExecutionEngine/CRunnerUtils.h
mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
mlir/lib/ExecutionEngine/CRunnerUtils.cpp
mlir/test/Conversion/VectorToLLVM/vector-to-llvm.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/ExecutionEngine/CRunnerUtils.h b/mlir/include/mlir/ExecutionEngine/CRunnerUtils.h
index b55e504ae660..3f369b066fbe 100644
--- a/mlir/include/mlir/ExecutionEngine/CRunnerUtils.h
+++ b/mlir/include/mlir/ExecutionEngine/CRunnerUtils.h
@@ -200,7 +200,6 @@ class DynamicMemRefType {
//===----------------------------------------------------------------------===//
// Small runtime support "lib" for vector.print lowering during codegen.
//===----------------------------------------------------------------------===//
-extern "C" MLIR_CRUNNERUTILS_EXPORT void print_i1(int b);
extern "C" MLIR_CRUNNERUTILS_EXPORT void print_i32(int32_t i);
extern "C" MLIR_CRUNNERUTILS_EXPORT void print_i64(int64_t l);
extern "C" MLIR_CRUNNERUTILS_EXPORT void print_f32(float f);
diff --git a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
index f17f21ad6603..4d9734a87f0c 100644
--- a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
+++ b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
@@ -978,9 +978,7 @@ class VectorPrintOpConversion : public ConvertToLLVMPattern {
Type eltType = vectorType ? vectorType.getElementType() : printType;
int64_t rank = vectorType ? vectorType.getRank() : 0;
Operation *printer;
- if (eltType.isSignlessInteger(1))
- printer = getPrintI1(op);
- else if (eltType.isSignlessInteger(32))
+ if (eltType.isSignlessInteger(1) || eltType.isSignlessInteger(32))
printer = getPrintI32(op);
else if (eltType.isSignlessInteger(64))
printer = getPrintI64(op);
@@ -1004,6 +1002,17 @@ class VectorPrintOpConversion : public ConvertToLLVMPattern {
int64_t rank) const {
Location loc = op->getLoc();
if (rank == 0) {
+ if (value.getType() ==
+ LLVM::LLVMType::getInt1Ty(typeConverter.getDialect())) {
+ // Convert i1 (bool) to i32 so we can use the print_i32 method.
+ // This avoids the need for a print_i1 method with an unclear ABI.
+ auto i32Type = LLVM::LLVMType::getInt32Ty(typeConverter.getDialect());
+ auto trueVal = rewriter.create<ConstantOp>(
+ loc, i32Type, rewriter.getI32IntegerAttr(1));
+ auto falseVal = rewriter.create<ConstantOp>(
+ loc, i32Type, rewriter.getI32IntegerAttr(0));
+ value = rewriter.create<SelectOp>(loc, value, trueVal, falseVal);
+ }
emitCall(rewriter, loc, printer, value);
return;
}
@@ -1047,11 +1056,6 @@ class VectorPrintOpConversion : public ConvertToLLVMPattern {
}
// Helpers for method names.
- Operation *getPrintI1(Operation *op) const {
- LLVM::LLVMDialect *dialect = typeConverter.getDialect();
- return getPrint(op, dialect, "print_i1",
- LLVM::LLVMType::getInt1Ty(dialect));
- }
Operation *getPrintI32(Operation *op) const {
LLVM::LLVMDialect *dialect = typeConverter.getDialect();
return getPrint(op, dialect, "print_i32",
diff --git a/mlir/lib/ExecutionEngine/CRunnerUtils.cpp b/mlir/lib/ExecutionEngine/CRunnerUtils.cpp
index 6f2014d4684f..ad5be24378ce 100644
--- a/mlir/lib/ExecutionEngine/CRunnerUtils.cpp
+++ b/mlir/lib/ExecutionEngine/CRunnerUtils.cpp
@@ -23,7 +23,6 @@
// By providing elementary printing methods only, this
// library can remain fully unaware of low-level implementation
// details of our vectors. Also useful for direct LLVM IR output.
-extern "C" void print_i1(int b) { fputc(b ? '1' : '0', stdout); }
extern "C" void print_i32(int32_t i) { fprintf(stdout, "%" PRId32, i); }
extern "C" void print_i64(int64_t l) { fprintf(stdout, "%" PRId64, l); }
extern "C" void print_f32(float f) { fprintf(stdout, "%g", f); }
diff --git a/mlir/test/Conversion/VectorToLLVM/vector-to-llvm.mlir b/mlir/test/Conversion/VectorToLLVM/vector-to-llvm.mlir
index b61dc172799b..75848c92c9ec 100644
--- a/mlir/test/Conversion/VectorToLLVM/vector-to-llvm.mlir
+++ b/mlir/test/Conversion/VectorToLLVM/vector-to-llvm.mlir
@@ -439,8 +439,11 @@ func @vector_print_scalar_i1(%arg0: i1) {
}
// CHECK-LABEL: llvm.func @vector_print_scalar_i1(
// CHECK-SAME: %[[A:.*]]: !llvm.i1)
-// CHECK: llvm.call @print_i1(%[[A]]) : (!llvm.i1) -> ()
-// CHECK: llvm.call @print_newline() : () -> ()
+// CHECK: %[[T:.*]] = llvm.mlir.constant(1 : i32) : !llvm.i32
+// CHECK: %[[F:.*]] = llvm.mlir.constant(0 : i32) : !llvm.i32
+// CHECK: %[[S:.*]] = llvm.select %[[A]], %[[T]], %[[F]] : !llvm.i1, !llvm.i32
+// CHECK: llvm.call @print_i32(%[[S]]) : (!llvm.i32) -> ()
+// CHECK: llvm.call @print_newline() : () -> ()
func @vector_print_scalar_i32(%arg0: i32) {
vector.print %arg0 : i32
More information about the Mlir-commits
mailing list