From 721c5a4cd1f84b6f90e2c640fc2779d75573484e Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Thu, 27 Jan 2022 02:24:33 -0500 Subject: [PATCH] Fix sign/zero integer extension --- tools/mlir-clang/Lib/clang-mlir.cc | 2 +- tools/mlir-clang/Test/Verification/calloc.c | 8 ++--- tools/mlir-clang/Test/Verification/ext.c | 34 +++++++++++++++++++++ tools/mlir-clang/Test/Verification/fscanf.c | 24 +++++++-------- tools/mlir-clang/Test/Verification/malloc.c | 13 ++++---- 5 files changed, 56 insertions(+), 25 deletions(-) create mode 100644 tools/mlir-clang/Test/Verification/ext.c diff --git a/tools/mlir-clang/Lib/clang-mlir.cc b/tools/mlir-clang/Lib/clang-mlir.cc index b708eaf90aed..ea636401b025 100644 --- a/tools/mlir-clang/Lib/clang-mlir.cc +++ b/tools/mlir-clang/Lib/clang-mlir.cc @@ -3276,7 +3276,7 @@ ValueCategory MLIRScanner::VisitCastExpr(CastExpr *E) { } auto prevTy = scalar.getType().cast(); bool signedType = true; - if (auto bit = dyn_cast(&*E->getType())) { + if (auto bit = dyn_cast(&*E->getSubExpr()->getType())) { if (bit->isUnsignedInteger()) signedType = false; if (bit->isSignedInteger()) diff --git a/tools/mlir-clang/Test/Verification/calloc.c b/tools/mlir-clang/Test/Verification/calloc.c index d8bcd56752d8..483403ee26e1 100644 --- a/tools/mlir-clang/Test/Verification/calloc.c +++ b/tools/mlir-clang/Test/Verification/calloc.c @@ -12,13 +12,13 @@ float* zmem(int n) { // CHECK-DAG: %false = arith.constant false // CHECK-DAG: %c0_i8 = arith.constant 0 : i8 // CHECK-DAG: %c4 = arith.constant 4 : index -// CHECK-NEXT: %0 = arith.extui %arg0 : i32 to i64 -// CHECK-NEXT: %1 = arith.index_cast %0 : i64 to index -// CHECK-NEXT: %2 = arith.muli %1, %c4 : index +// CHECK-NEXT: %0 = arith.index_cast %arg0 : i32 to index +// CHECK-NEXT: %1 = arith.index_cast %0 : index to i64 +// CHECK-NEXT: %2 = arith.muli %0, %c4 : index // CHECK-NEXT: %3 = arith.divui %2, %c4 : index // CHECK-NEXT: %4 = memref.alloc(%3) : memref // CHECK-NEXT: %5 = "polygeist.memref2pointer"(%4) : (memref) -> !llvm.ptr -// CHECK-NEXT: %6 = arith.muli %0, %c4_i64 : i64 +// CHECK-NEXT: %6 = arith.muli %1, %c4_i64 : i64 // CHECK-NEXT: "llvm.intr.memset"(%5, %c0_i8, %6, %false) : (!llvm.ptr, i8, i64, i1) -> () // TODO-NEXT: scf.for %arg1 = %c0 to %3 step %c1 { // TODO-NEXT: memref.store %cst, %4[%arg1] : memref diff --git a/tools/mlir-clang/Test/Verification/ext.c b/tools/mlir-clang/Test/Verification/ext.c new file mode 100644 index 000000000000..8c913fae6522 --- /dev/null +++ b/tools/mlir-clang/Test/Verification/ext.c @@ -0,0 +1,34 @@ +// RUN: mlir-clang %s --function=* -S | FileCheck %s + +int c2i(char x) { + return x; +} + +unsigned int c2ui(char x) { + return x; +} + +int uc2i(unsigned char x) { + return x; +} + +unsigned int uc2ui(unsigned char x) { + return x; +} + +; CHECK: func @c2i(%arg0: i8) -> i32 attributes {llvm.linkage = #llvm.linkage} { +; CHECK-NEXT: %0 = arith.extsi %arg0 : i8 to i32 +; CHECK-NEXT: return %0 : i32 +; CHECK-NEXT: } +; CHECK: func @c2ui(%arg0: i8) -> i32 attributes {llvm.linkage = #llvm.linkage} { +; CHECK-NEXT: %0 = arith.extsi %arg0 : i8 to i32 +; CHECK-NEXT: return %0 : i32 +; CHECK-NEXT: } +; CHECK: func @uc2i(%arg0: i8) -> i32 attributes {llvm.linkage = #llvm.linkage} { +; CHECK-NEXT: %0 = arith.extui %arg0 : i8 to i32 +; CHECK-NEXT: return %0 : i32 +; CHECK-NEXT: } +; CHECK: func @uc2ui(%arg0: i8) -> i32 attributes {llvm.linkage = #llvm.linkage} { +; CHECK-NEXT: %0 = arith.extui %arg0 : i8 to i32 +; CHECK-NEXT: return %0 : i32 +; CHECK-NEXT: } diff --git a/tools/mlir-clang/Test/Verification/fscanf.c b/tools/mlir-clang/Test/Verification/fscanf.c index 22632c947385..225c285de4b7 100644 --- a/tools/mlir-clang/Test/Verification/fscanf.c +++ b/tools/mlir-clang/Test/Verification/fscanf.c @@ -33,18 +33,16 @@ int* alloc() { // CHECK-NEXT: %2 = llvm.getelementptr %1[%c0_i32, %c0_i32] : (!llvm.ptr>, i32, i32) -> !llvm.ptr // CHECK-NEXT: %3 = llvm.call @__isoc99_scanf(%2, %0) : (!llvm.ptr, !llvm.ptr) -> i32 // CHECK-NEXT: %4 = llvm.load %0 : !llvm.ptr -// CHECK-NEXT: %5 = arith.extui %4 : i32 to i64 -// CHECK-NEXT: %6 = arith.index_cast %5 : i64 to index -// CHECK-NEXT: %7 = arith.muli %6, %c4 : index -// CHECK-NEXT: %8 = arith.divui %7, %c4 : index -// CHECK-NEXT: %9 = memref.alloc(%8) : memref -// CHECK-NEXT: %10 = arith.index_cast %4 : i32 to index -// CHECK-NEXT: scf.for %arg0 = %c0 to %10 step %c1 { -// CHECK-NEXT: %11 = llvm.mlir.addressof @str1 : !llvm.ptr> -// CHECK-NEXT: %12 = llvm.getelementptr %11[%c0_i32, %c0_i32] : (!llvm.ptr>, i32, i32) -> !llvm.ptr -// CHECK-NEXT: %13 = llvm.call @__isoc99_scanf(%12, %0) : (!llvm.ptr, !llvm.ptr) -> i32 -// CHECK-NEXT: %14 = llvm.load %0 : !llvm.ptr -// CHECK-NEXT: memref.store %14, %9[%arg0] : memref +// CHECK-NEXT: %5 = arith.index_cast %4 : i32 to index +// CHECK-NEXT: %6 = arith.muli %5, %c4 : index +// CHECK-NEXT: %7 = arith.divui %6, %c4 : index +// CHECK-NEXT: %8 = memref.alloc(%7) : memref +// CHECK-NEXT: scf.for %arg0 = %c0 to %5 step %c1 { +// CHECK-NEXT: %9 = llvm.mlir.addressof @str1 : !llvm.ptr> +// CHECK-NEXT: %10 = llvm.getelementptr %9[%c0_i32, %c0_i32] : (!llvm.ptr>, i32, i32) -> !llvm.ptr +// CHECK-NEXT: %11 = llvm.call @__isoc99_scanf(%10, %0) : (!llvm.ptr, !llvm.ptr) -> i32 +// CHECK-NEXT: %12 = llvm.load %0 : !llvm.ptr +// CHECK-NEXT: memref.store %12, %8[%arg0] : memref // CHECK-NEXT: } -// CHECK-NEXT: return %9 : memref +// CHECK-NEXT: return %8 : memref // CHECK-NEXT: } diff --git a/tools/mlir-clang/Test/Verification/malloc.c b/tools/mlir-clang/Test/Verification/malloc.c index 9b580904355b..19e51fa6bbf7 100644 --- a/tools/mlir-clang/Test/Verification/malloc.c +++ b/tools/mlir-clang/Test/Verification/malloc.c @@ -12,12 +12,11 @@ void caller(int size) { // CHECK: func @caller(%arg0: i32) // CHECK-NEXT: %c8 = arith.constant 8 : index -// CHECK-NEXT: %0 = arith.extui %arg0 : i32 to i64 -// CHECK-NEXT: %1 = arith.index_cast %0 : i64 to index -// CHECK-NEXT: %2 = arith.muli %1, %c8 : index -// CHECK-NEXT: %3 = arith.divui %2, %c8 : index -// CHECK-NEXT: %4 = memref.alloc(%3) : memref -// CHECK-NEXT: call @sum(%4) : (memref) -> () -// CHECK-NEXT: memref.dealloc %4 : memref +// CHECK-NEXT: %0 = arith.index_cast %arg0 : i32 to index +// CHECK-NEXT: %1 = arith.muli %0, %c8 : index +// CHECK-NEXT: %2 = arith.divui %1, %c8 : index +// CHECK-NEXT: %3 = memref.alloc(%2) : memref +// CHECK-NEXT: call @sum(%3) : (memref) -> () +// CHECK-NEXT: memref.dealloc %3 : memref // CHECK-NEXT: return // CHECK-NEXT: }