Skip to content

Commit d4180c7

Browse files
authored
Fix sign/zero integer extension (#162)
1 parent 01519e8 commit d4180c7

File tree

5 files changed

+56
-25
lines changed

5 files changed

+56
-25
lines changed

tools/mlir-clang/Lib/clang-mlir.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3276,7 +3276,7 @@ ValueCategory MLIRScanner::VisitCastExpr(CastExpr *E) {
32763276
}
32773277
auto prevTy = scalar.getType().cast<mlir::IntegerType>();
32783278
bool signedType = true;
3279-
if (auto bit = dyn_cast<clang::BuiltinType>(&*E->getType())) {
3279+
if (auto bit = dyn_cast<clang::BuiltinType>(&*E->getSubExpr()->getType())) {
32803280
if (bit->isUnsignedInteger())
32813281
signedType = false;
32823282
if (bit->isSignedInteger())

tools/mlir-clang/Test/Verification/calloc.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ float* zmem(int n) {
1212
// CHECK-DAG: %false = arith.constant false
1313
// CHECK-DAG: %c0_i8 = arith.constant 0 : i8
1414
// CHECK-DAG: %c4 = arith.constant 4 : index
15-
// CHECK-NEXT: %0 = arith.extui %arg0 : i32 to i64
16-
// CHECK-NEXT: %1 = arith.index_cast %0 : i64 to index
17-
// CHECK-NEXT: %2 = arith.muli %1, %c4 : index
15+
// CHECK-NEXT: %0 = arith.index_cast %arg0 : i32 to index
16+
// CHECK-NEXT: %1 = arith.index_cast %0 : index to i64
17+
// CHECK-NEXT: %2 = arith.muli %0, %c4 : index
1818
// CHECK-NEXT: %3 = arith.divui %2, %c4 : index
1919
// CHECK-NEXT: %4 = memref.alloc(%3) : memref<?xf32>
2020
// CHECK-NEXT: %5 = "polygeist.memref2pointer"(%4) : (memref<?xf32>) -> !llvm.ptr<i8>
21-
// CHECK-NEXT: %6 = arith.muli %0, %c4_i64 : i64
21+
// CHECK-NEXT: %6 = arith.muli %1, %c4_i64 : i64
2222
// CHECK-NEXT: "llvm.intr.memset"(%5, %c0_i8, %6, %false) : (!llvm.ptr<i8>, i8, i64, i1) -> ()
2323
// TODO-NEXT: scf.for %arg1 = %c0 to %3 step %c1 {
2424
// TODO-NEXT: memref.store %cst, %4[%arg1] : memref<?xf32>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// RUN: mlir-clang %s --function=* -S | FileCheck %s
2+
3+
int c2i(char x) {
4+
return x;
5+
}
6+
7+
unsigned int c2ui(char x) {
8+
return x;
9+
}
10+
11+
int uc2i(unsigned char x) {
12+
return x;
13+
}
14+
15+
unsigned int uc2ui(unsigned char x) {
16+
return x;
17+
}
18+
19+
; CHECK: func @c2i(%arg0: i8) -> i32 attributes {llvm.linkage = #llvm.linkage<external>} {
20+
; CHECK-NEXT: %0 = arith.extsi %arg0 : i8 to i32
21+
; CHECK-NEXT: return %0 : i32
22+
; CHECK-NEXT: }
23+
; CHECK: func @c2ui(%arg0: i8) -> i32 attributes {llvm.linkage = #llvm.linkage<external>} {
24+
; CHECK-NEXT: %0 = arith.extsi %arg0 : i8 to i32
25+
; CHECK-NEXT: return %0 : i32
26+
; CHECK-NEXT: }
27+
; CHECK: func @uc2i(%arg0: i8) -> i32 attributes {llvm.linkage = #llvm.linkage<external>} {
28+
; CHECK-NEXT: %0 = arith.extui %arg0 : i8 to i32
29+
; CHECK-NEXT: return %0 : i32
30+
; CHECK-NEXT: }
31+
; CHECK: func @uc2ui(%arg0: i8) -> i32 attributes {llvm.linkage = #llvm.linkage<external>} {
32+
; CHECK-NEXT: %0 = arith.extui %arg0 : i8 to i32
33+
; CHECK-NEXT: return %0 : i32
34+
; CHECK-NEXT: }

tools/mlir-clang/Test/Verification/fscanf.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,16 @@ int* alloc() {
3333
// CHECK-NEXT: %2 = llvm.getelementptr %1[%c0_i32, %c0_i32] : (!llvm.ptr<array<3 x i8>>, i32, i32) -> !llvm.ptr<i8>
3434
// CHECK-NEXT: %3 = llvm.call @__isoc99_scanf(%2, %0) : (!llvm.ptr<i8>, !llvm.ptr<i32>) -> i32
3535
// CHECK-NEXT: %4 = llvm.load %0 : !llvm.ptr<i32>
36-
// CHECK-NEXT: %5 = arith.extui %4 : i32 to i64
37-
// CHECK-NEXT: %6 = arith.index_cast %5 : i64 to index
38-
// CHECK-NEXT: %7 = arith.muli %6, %c4 : index
39-
// CHECK-NEXT: %8 = arith.divui %7, %c4 : index
40-
// CHECK-NEXT: %9 = memref.alloc(%8) : memref<?xi32>
41-
// CHECK-NEXT: %10 = arith.index_cast %4 : i32 to index
42-
// CHECK-NEXT: scf.for %arg0 = %c0 to %10 step %c1 {
43-
// CHECK-NEXT: %11 = llvm.mlir.addressof @str1 : !llvm.ptr<array<4 x i8>>
44-
// CHECK-NEXT: %12 = llvm.getelementptr %11[%c0_i32, %c0_i32] : (!llvm.ptr<array<4 x i8>>, i32, i32) -> !llvm.ptr<i8>
45-
// CHECK-NEXT: %13 = llvm.call @__isoc99_scanf(%12, %0) : (!llvm.ptr<i8>, !llvm.ptr<i32>) -> i32
46-
// CHECK-NEXT: %14 = llvm.load %0 : !llvm.ptr<i32>
47-
// CHECK-NEXT: memref.store %14, %9[%arg0] : memref<?xi32>
36+
// CHECK-NEXT: %5 = arith.index_cast %4 : i32 to index
37+
// CHECK-NEXT: %6 = arith.muli %5, %c4 : index
38+
// CHECK-NEXT: %7 = arith.divui %6, %c4 : index
39+
// CHECK-NEXT: %8 = memref.alloc(%7) : memref<?xi32>
40+
// CHECK-NEXT: scf.for %arg0 = %c0 to %5 step %c1 {
41+
// CHECK-NEXT: %9 = llvm.mlir.addressof @str1 : !llvm.ptr<array<4 x i8>>
42+
// CHECK-NEXT: %10 = llvm.getelementptr %9[%c0_i32, %c0_i32] : (!llvm.ptr<array<4 x i8>>, i32, i32) -> !llvm.ptr<i8>
43+
// CHECK-NEXT: %11 = llvm.call @__isoc99_scanf(%10, %0) : (!llvm.ptr<i8>, !llvm.ptr<i32>) -> i32
44+
// CHECK-NEXT: %12 = llvm.load %0 : !llvm.ptr<i32>
45+
// CHECK-NEXT: memref.store %12, %8[%arg0] : memref<?xi32>
4846
// CHECK-NEXT: }
49-
// CHECK-NEXT: return %9 : memref<?xi32>
47+
// CHECK-NEXT: return %8 : memref<?xi32>
5048
// CHECK-NEXT: }

tools/mlir-clang/Test/Verification/malloc.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@ void caller(int size) {
1212

1313
// CHECK: func @caller(%arg0: i32)
1414
// CHECK-NEXT: %c8 = arith.constant 8 : index
15-
// CHECK-NEXT: %0 = arith.extui %arg0 : i32 to i64
16-
// CHECK-NEXT: %1 = arith.index_cast %0 : i64 to index
17-
// CHECK-NEXT: %2 = arith.muli %1, %c8 : index
18-
// CHECK-NEXT: %3 = arith.divui %2, %c8 : index
19-
// CHECK-NEXT: %4 = memref.alloc(%3) : memref<?xf64>
20-
// CHECK-NEXT: call @sum(%4) : (memref<?xf64>) -> ()
21-
// CHECK-NEXT: memref.dealloc %4 : memref<?xf64>
15+
// CHECK-NEXT: %0 = arith.index_cast %arg0 : i32 to index
16+
// CHECK-NEXT: %1 = arith.muli %0, %c8 : index
17+
// CHECK-NEXT: %2 = arith.divui %1, %c8 : index
18+
// CHECK-NEXT: %3 = memref.alloc(%2) : memref<?xf64>
19+
// CHECK-NEXT: call @sum(%3) : (memref<?xf64>) -> ()
20+
// CHECK-NEXT: memref.dealloc %3 : memref<?xf64>
2221
// CHECK-NEXT: return
2322
// CHECK-NEXT: }

0 commit comments

Comments
 (0)