[mlir][emitc] Print signed integers properly
authorSimon Camphausen <simon.camphausen@iml.fraunhofer.de>
Mon, 13 Sep 2021 14:57:09 +0000 (16:57 +0200)
committerMarius Brehler <marius.brehler@iml.fraunhofer.de>
Mon, 13 Sep 2021 15:29:30 +0000 (15:29 +0000)
Previously negative integers were printed as large unsigned values.

Reviewed By: marbre

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

mlir/lib/Target/Cpp/TranslateToCpp.cpp
mlir/test/Target/Cpp/const.mlir

index 924c608..aae254a 100644 (file)
@@ -677,14 +677,16 @@ bool CppEmitter::hasBlockLabel(Block &block) {
 }
 
 LogicalResult CppEmitter::emitAttribute(Location loc, Attribute attr) {
-  auto printInt = [&](APInt val, bool isSigned) {
+  auto printInt = [&](APInt val, bool isUnsigned) {
     if (val.getBitWidth() == 1) {
       if (val.getBoolValue())
         os << "true";
       else
         os << "false";
     } else {
-      val.print(os, isSigned);
+      SmallString<128> strValue;
+      val.toString(strValue, 10, !isUnsigned, false);
+      os << strValue;
     }
   };
 
index 1543824..c9c24d3 100644 (file)
@@ -5,22 +5,34 @@
 func @emitc_constant() {
   %c0 = "emitc.constant"(){value = #emitc.opaque<""> : i32} : () -> i32
   %c1 = "emitc.constant"(){value = 42 : i32} : () -> i32
-  %c2 = "emitc.constant"(){value = #emitc.opaque<""> : !emitc.opaque<"int32_t*">} : () -> !emitc.opaque<"int32_t*">
-  %c3 = "emitc.constant"(){value = #emitc.opaque<"NULL"> : !emitc.opaque<"int32_t*">} : () -> !emitc.opaque<"int32_t*">
+  %c2 = "emitc.constant"(){value = -1 : i32} : () -> i32
+  %c3 = "emitc.constant"(){value = -1 : si8} : () -> si8
+  %c4 = "emitc.constant"(){value = 255 : ui8} : () -> ui8
+  %c5 = "emitc.constant"(){value = #emitc.opaque<""> : !emitc.opaque<"int32_t*">} : () -> !emitc.opaque<"int32_t*">
+  %c6 = "emitc.constant"(){value = #emitc.opaque<"NULL"> : !emitc.opaque<"int32_t*">} : () -> !emitc.opaque<"int32_t*">
   return
 }
 // CPP-DEFAULT: void emitc_constant() {
 // CPP-DEFAULT-NEXT: int32_t [[V0:[^ ]*]];
 // CPP-DEFAULT-NEXT: int32_t [[V1:[^ ]*]] = 42;
-// CPP-DEFAULT-NEXT: int32_t* [[V2:[^ ]*]];
-// CPP-DEFAULT-NEXT: int32_t* [[V3:[^ ]*]] = NULL;
+// CPP-DEFAULT-NEXT: int32_t [[V2:[^ ]*]] = -1;
+// CPP-DEFAULT-NEXT: int8_t [[V3:[^ ]*]] = -1;
+// CPP-DEFAULT-NEXT: uint8_t [[V4:[^ ]*]] = 255;
+// CPP-DEFAULT-NEXT: int32_t* [[V5:[^ ]*]];
+// CPP-DEFAULT-NEXT: int32_t* [[V6:[^ ]*]] = NULL;
 
 // CPP-DECLTOP: void emitc_constant() {
 // CPP-DECLTOP-NEXT: int32_t [[V0:[^ ]*]];
 // CPP-DECLTOP-NEXT: int32_t [[V1:[^ ]*]];
-// CPP-DECLTOP-NEXT: int32_t* [[V2:[^ ]*]];
-// CPP-DECLTOP-NEXT: int32_t* [[V3:[^ ]*]];
+// CPP-DECLTOP-NEXT: int32_t [[V2:[^ ]*]];
+// CPP-DECLTOP-NEXT: int8_t [[V3:[^ ]*]];
+// CPP-DECLTOP-NEXT: uint8_t [[V4:[^ ]*]];
+// CPP-DECLTOP-NEXT: int32_t* [[V5:[^ ]*]];
+// CPP-DECLTOP-NEXT: int32_t* [[V6:[^ ]*]];
 // CPP-DECLTOP-NEXT: ;
 // CPP-DECLTOP-NEXT: [[V1]] = 42;
+// CPP-DECLTOP-NEXT: [[V2]] = -1;
+// CPP-DECLTOP-NEXT: [[V3]] = -1;
+// CPP-DECLTOP-NEXT: [[V4]] = 255;
 // CPP-DECLTOP-NEXT: ;
-// CPP-DECLTOP-NEXT: [[V3]] = NULL;
+// CPP-DECLTOP-NEXT: [[V6]] = NULL;