Skip to content

Commit

Permalink
[gccjit][test] update roundtrip tests and incorporate FileCheck
Browse files Browse the repository at this point in the history
  • Loading branch information
Lancern committed Oct 28, 2024
1 parent 3607759 commit 28ec288
Show file tree
Hide file tree
Showing 10 changed files with 123 additions and 9 deletions.
22 changes: 22 additions & 0 deletions cmake/FindLLVM.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,25 @@ message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION} at ${LLVM_DIR}")
include(${LLVM_DIR}/AddLLVM.cmake)
include(${LLVM_DIR}/TableGen.cmake)
include(${LLVM_DIR}/HandleLLVMOptions.cmake)

# Try to find the FileCheck utility.
if (NOT TARGET FileCheck)
find_program(LLVM_FILE_CHECK_EXE
FileCheck
NAMES FileCheck-${LLVM_VERSION_MAJOR}
HINTS "${LLVM_DIR}/../../../bin"
)
if (LLVM_FILE_CHECK_EXE)
add_executable(FileCheck IMPORTED)
set_target_properties(FileCheck PROPERTIES IMPORTED_LOCATION ${LLVM_FILE_CHECK_EXE})
endif ()
endif ()

if (TARGET FileCheck)
if (NOT LLVM_FILE_CHECK_EXE)
get_target_property(LLVM_FILE_CHECK_EXE FileCheck IMPORTED_LOCATION)
endif ()
message(STATUS "Found FileCheck utility at ${LLVM_FILE_CHECK_EXE}")
elseif (MLIR_GCCJIT_ENABLE_TEST)
message(FATAL_ERROR "Could not find FileCheck utility")
endif ()
6 changes: 5 additions & 1 deletion test/lit.cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,13 @@
config.test_source_root = os.path.dirname(__file__)
config.test_exec_root = os.path.join(config.mlir_gccjit_build_root, "test")

config.substitutions.append((r"%filecheck", config.file_check_exe))
config.substitutions.append(
(r"%gccjit-opt", os.path.join(config.mlir_gccjit_build_root, "bin/gccjit-opt"))
)
config.substitutions.append(
(r"%gccjit-translate", os.path.join(config.mlir_gccjit_build_root, "bin/gccjit-translate"))
(
r"%gccjit-translate",
os.path.join(config.mlir_gccjit_build_root, "bin/gccjit-translate"),
)
)
1 change: 1 addition & 0 deletions test/lit.site.cfg.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import os

config.mlir_gccjit_src_root = r'@PROJECT_SOURCE_DIR@'
config.mlir_gccjit_build_root = r'@PROJECT_BINARY_DIR@'
config.file_check_exe = r'@LLVM_FILE_CHECK_EXE@'

lit_cfg_file = os.path.join(
config.mlir_gccjit_src_root, "test/lit.cfg.py")
Expand Down
9 changes: 8 additions & 1 deletion test/syntax/basic.mlir
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %gccjit-opt %s
// RUN: %gccjit-opt -o %t.mlir %s
// RUN: %filecheck --input-file=%t.mlir %s

!i32 = !gccjit.int<int32_t>
module @test attributes {
Expand All @@ -10,5 +11,11 @@ module @test attributes {
^entry(%arg0: !gccjit.lvalue<!i32>, %arg1: !gccjit.lvalue<!i32>):
llvm.unreachable
}
// CHECK-LABEL: @foo
// CHECK-NEXT: ^{{.+}}(%{{.+}}: !gccjit.lvalue<!gccjit.int<int32_t>>, %{{.+}}: !gccjit.lvalue<!gccjit.int<int32_t>>):
// CHECK-NEXT: llvm.unreachable
// CHECK-NEXT: }

gccjit.func imported @bar(!gccjit.int<int>)
// CHECK-LABEL: gccjit.func imported @bar (!gccjit.int<int>)
}
28 changes: 27 additions & 1 deletion test/syntax/branch.mlir
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %gccjit-opt %s
// RUN: %gccjit-opt -o %t.mlir %s
// RUN: %filecheck --input-file=%t.mlir %s

!bool = !gccjit.int<bool>
!long = !gccjit.int<long>
Expand All @@ -12,6 +13,16 @@ module @test {
^false:
gccjit.return
}
// CHECK-LABEL: @foo
// CHECK-NEXT: ^{{.+}}(%[[ARG0:.+]]: !gccjit.lvalue<!gccjit.int<bool>>):
// CHECK-NEXT: %[[#V0:]] = gccjit.as_rvalue %[[ARG0:.+]] : <!gccjit.int<bool>> to !gccjit.int<bool>
// CHECK-NEXT: gccjit.conditional(%[[#V0]] : <bool>), ^[[BB1:.+]], ^[[BB2:.+]]
// CHECK-NEXT: ^[[BB1]]:
// CHECK-NEXT: gccjit.return
// CHECK-NEXT: ^[[BB2]]:
// CHECK-NEXT: gccjit.return
// CHECK-NEXT: }

gccjit.func exported @bar(!long) {
^entry(%arg0: !gccjit.lvalue<!long>):
%0 = gccjit.as_rvalue %arg0 : !gccjit.lvalue<!long> to !long
Expand All @@ -27,4 +38,19 @@ module @test {
^default:
gccjit.return
}
// CHECK-LABEL: @bar
// CHECK-NEXT: ^{{.+}}(%[[ARG0:.+]]: !gccjit.lvalue<!gccjit.int<long>>):
// CHECK-NEXT: %[[#V0:]] = gccjit.as_rvalue %[[ARG0]] : <!gccjit.int<long>> to !gccjit.int<long>
// CHECK-NEXT: gccjit.switch(%[[#V0]] : <long>) {
// CHECK-NEXT: default -> ^[[BB3:.+]],
// CHECK-NEXT: #gccjit.int<5> : !gccjit.int<long> -> ^[[BB1:.+]],
// CHECK-NEXT: #gccjit.int<10> : !gccjit.int<long>...#gccjit.int<20> : !gccjit.int<long> -> ^[[BB2:.+]]
// CHECK-NEXT: }
// CHECK-NEXT: ^[[BB1]]:
// CHECK-NEXT: gccjit.return
// CHECK-NEXT: ^[[BB2]]:
// CHECK-NEXT: gccjit.return
// CHECK-NEXT: ^[[BB3]]:
// CHECK-NEXT: gccjit.return
// CHECK-NEXT: }
}
9 changes: 8 additions & 1 deletion test/syntax/extened_asm.mlir
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %gccjit-opt %s
// RUN: %gccjit-opt -o %t.mlir %s
// RUN: %filecheck --input-file=%t.mlir %s

!u64 = !gccjit.int<uint64_t>
module @test {
Expand All @@ -13,4 +14,10 @@ module @test {
%val = gccjit.as_rvalue %msr : !gccjit.lvalue<!u64> to !u64
gccjit.return %val : !u64
}
// CHECK-LABEL: @foo
// CHECK-NEXT: %[[#V0:]] = gccjit.local : <!gccjit.int<uint64_t>>
// CHECK-NEXT: gccjit.asm volatile("rdtsc\0A\09shl $32, %%rdx\0A\09or %%rdx, %0\0A\09" : "=a"(%[[#V0]] : !gccjit.lvalue<!gccjit.int<uint64_t>>) : : "rdx")
// CHECK-NEXT: %[[#V1:]] = gccjit.as_rvalue %[[#V0]] : <!gccjit.int<uint64_t>> to !gccjit.int<uint64_t>
// CHECK-NEXT: gccjit.return %[[#V1]] : !gccjit.int<uint64_t>
// CHECK-NEXT: }
}
8 changes: 7 additions & 1 deletion test/syntax/floating_point.mlir
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %gccjit-opt %s
// RUN: %gccjit-opt -o %t.mlir %s
// RUN: %filecheck --input-file=%t.mlir %s

!float = !gccjit.fp<float>
!ldb = !gccjit.fp<long double>
Expand All @@ -8,4 +9,9 @@ module @test {
%0 = gccjit.const #gccjit.zero : !float
gccjit.return %0 : !float
}
// CHECK-LABEL: @foo
// CHECK-NEXT: ^{{.+}}(%{{.+}}: !gccjit.lvalue<!gccjit.fp<float>>, %{{.+}}: !gccjit.lvalue<!gccjit.fp<long double>>):
// CHECK-NEXT: %[[#V0:]] = gccjit.const #gccjit.zero : !gccjit.fp<float>
// CHECK-NEXT: gccjit.return %[[#V0]] : !gccjit.fp<float>
// CHECK-NEXT: }
}
9 changes: 7 additions & 2 deletions test/syntax/function_attrs.mlir
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %gccjit-opt %s
// RUN: %gccjit-opt -o %t.mlir %s
// RUN: %filecheck --input-file=%t.mlir %s

!i32 = !gccjit.int<int32_t>
!ptr_i32 = !gccjit.ptr<!i32>
Expand All @@ -16,5 +17,9 @@ module @test attributes {
%0 = gccjit.as_rvalue %arg0 : !gccjit.lvalue<!ptr_i32> to !ptr_i32
gccjit.return %0 : !ptr_i32
}

// CHECK-LABEL: @foo
// CHECK-NEXT: ^{{.+}}(%[[ARG0:.+]]: !gccjit.lvalue<!gccjit.ptr<!gccjit.int<int32_t>>>):
// CHECK-NEXT: %[[#V0:]] = gccjit.as_rvalue %[[ARG0]] : <!gccjit.ptr<!gccjit.int<int32_t>>> to !gccjit.ptr<!gccjit.int<int32_t>>
// CHECK-NEXT: gccjit.return %[[#V0]] : !gccjit.ptr<!gccjit.int<int32_t>>
// CHECK-NEXT: }
}
11 changes: 10 additions & 1 deletion test/syntax/hello_world.mlir
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %gccjit-opt %s
// RUN: %gccjit-opt -o %t.mlir %s
// RUN: %filecheck --input-file=%t.mlir %s

!i32 = !gccjit.int<int32_t>
!char = !gccjit.int<char>
Expand All @@ -11,10 +12,18 @@ module @test attributes {
gccjit.debug_info = true
} {
gccjit.func imported @puts(!str) -> !i32
// CHECK-LABEL: gccjit.func imported @puts (!gccjit.ptr<!gccjit.qualified<!gccjit.int<char>, const>>) -> !gccjit.int<int32_t>

// CHECK-LABEL: @main
gccjit.func exported @main() -> !i32 {
%0 = gccjit.literal <"hello, world!\n"> : !str
%1 = gccjit.call @puts(%0) : (!str) -> !i32
%2 = gccjit.const #gccjit.zero : !i32
gccjit.return %2 : !i32

// CHECK-NEXT: %[[#V0:]] = gccjit.literal <"hello, world!\0A"> : <!gccjit.qualified<!gccjit.int<char>, const>>
// CHECK-NEXT: %[[#V1:]] = gccjit.call @puts(%[[#V0]]) : (!gccjit.ptr<!gccjit.qualified<!gccjit.int<char>, const>>) -> !gccjit.int<int32_t>
// CHECK-NEXT: %[[#V2:]] = gccjit.const #gccjit.zero : !gccjit.int<int32_t>
// CHECK-NEXT: gccjit.return %[[#V2]] : !gccjit.int<int32_t>
}
}
29 changes: 28 additions & 1 deletion test/syntax/variables.mlir
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
// RUN: %gccjit-opt %s
// RUN: %gccjit-opt -o %t.mlir %s
// RUN: %filecheck --input-file=%t.mlir %s

!i32 = !gccjit.int<int32_t>
!ptr_i32 = !gccjit.ptr<!i32>
module @test attributes {
gccjit.debug_info = true
} {
// CHECK-LABEL: @foo
gccjit.func exported @foo(!i32) -> !i32 attrs([
#gccjit.fn_attr<noinline>
]) {
Expand All @@ -16,18 +18,43 @@ module @test attributes {
%3 = gccjit.as_rvalue %arg0 : !gccjit.lvalue<!i32> to !i32
%4 = gccjit.binary plus (%2 : !i32, %3 : !i32) : !i32
gccjit.return %4 : !i32

// CHECK: ^{{.+}}(%arg0: !gccjit.lvalue<!gccjit.int<int32_t>>):
// CHECK-NEXT: %[[#V0:]] = gccjit.local align(16) : <!gccjit.int<int32_t>>
// CHECK-NEXT: %[[#V1:]] = gccjit.const #gccjit.one : !gccjit.int<int32_t>
// CHECK-NEXT: gccjit.assign %[[#V1]] to %[[#V0]] : !gccjit.int<int32_t>, <!gccjit.int<int32_t>>
// CHECK-NEXT: %[[#V2:]] = gccjit.as_rvalue %[[#V0]] : <!gccjit.int<int32_t>> to !gccjit.int<int32_t>
// CHECK-NEXT: %[[#V3:]] = gccjit.as_rvalue %arg0 : <!gccjit.int<int32_t>> to !gccjit.int<int32_t>
// CHECK-NEXT: %[[#V4:]] = gccjit.binary plus(%[[#V2]] : !gccjit.int<int32_t>, %[[#V3]] : !gccjit.int<int32_t>) : !gccjit.int<int32_t>
// CHECK-NEXT: gccjit.return %[[#V4]] : !gccjit.int<int32_t>
}

gccjit.global imported @test : !gccjit.lvalue<!i32>
// CHECK-LABEL: gccjit.global imported @test : !gccjit.lvalue<!gccjit.int<int32_t>>

gccjit.global internal @test2 array(#gccjit.byte_array<[0, 0, 0, 0]>) : !gccjit.lvalue<!gccjit.array<!i32, 1>>
// CHECK-LABEL: gccjit.global internal @test2 array(<[0, 0, 0, 0]>) : !gccjit.lvalue<!gccjit.array<!gccjit.int<int32_t>, 1>>

// CHECK-LABEL: @test3
gccjit.global exported @test3 init {
%0 = gccjit.const #gccjit.zero : !i32
gccjit.return %0 : !i32

// CHECK: %[[#V0:]] = gccjit.const #gccjit.zero : !gccjit.int<int32_t>
// CHECK-NEXT: gccjit.return %[[#V0]] : !gccjit.int<int32_t>
} : !gccjit.lvalue<!i32>

gccjit.global exported @test4 literal (#gccjit.str<"hello, world!">) : !gccjit.lvalue<!gccjit.array<!gccjit.int<char>, 14>>
// CHECK-LABEL: gccjit.global exported @test4 literal(<"hello, world!">) : !gccjit.lvalue<!gccjit.array<!gccjit.int<char>, 14>>

// CHECK-LABEL: @test5
gccjit.global exported @test5 link_section(#gccjit.link_section<".rodata">) init {
%0 = gccjit.get_global @test3 : !gccjit.lvalue<!i32>
%addr = gccjit.addr (%0 : !gccjit.lvalue<!i32>) : !gccjit.ptr<!i32>
gccjit.return %addr : !gccjit.ptr<!i32>

// CHECK: %[[#V0:]] = gccjit.get_global @test3 : <!gccjit.int<int32_t>>
// CHECK-NEXT: %[[#V1:]] = gccjit.addr(%[[#V0]] : <!gccjit.int<int32_t>>) : <!gccjit.int<int32_t>>
// CHECK-NEXT: gccjit.return %[[#V1]] : !gccjit.ptr<!gccjit.int<int32_t>>
} : !gccjit.lvalue<!gccjit.ptr<!i32>>
}

0 comments on commit 28ec288

Please sign in to comment.