[polly] r279734 - Introduce unittests.
Michael Kruse via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 25 05:36:16 PDT 2016
Author: meinersbur
Date: Thu Aug 25 07:36:15 2016
New Revision: 279734
URL: http://llvm.org/viewvc/llvm-project?rev=279734&view=rev
Log:
Introduce unittests.
Add the infrastructure for unittests to Polly and two simple tests for
conversion between isl_val and APInt. In addition, a build target
check-polly-unittests is added to run only the unittests but not the regression
tests.
Clang's unittest mechanism served as as a blueprint which then was adapted to
Polly.
Differential Revision: https://reviews.llvm.org/D23833
Added:
polly/trunk/test/Unit/
polly/trunk/test/Unit/lit.cfg
polly/trunk/test/Unit/lit.site.cfg.in
polly/trunk/unittests/
polly/trunk/unittests/CMakeLists.txt
polly/trunk/unittests/Isl/
polly/trunk/unittests/Isl/CMakeLists.txt
polly/trunk/unittests/Isl/IslTest.cpp
Modified:
polly/trunk/CMakeLists.txt
polly/trunk/test/CMakeLists.txt
Modified: polly/trunk/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/CMakeLists.txt?rev=279734&r1=279733&r2=279734&view=diff
==============================================================================
--- polly/trunk/CMakeLists.txt (original)
+++ polly/trunk/CMakeLists.txt Thu Aug 25 07:36:15 2016
@@ -88,9 +88,33 @@ if (NOT DEFINED LLVM_MAIN_SRC_DIR)
endif()
endif()
+ # Sources available, too?
+ execute_process(COMMAND "${LLVM_INSTALL_ROOT}/bin/llvm-config" --src-root
+ OUTPUT_VARIABLE MAIN_SRC_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ set(LLVM_SOURCE_ROOT ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
+
+ # Enable unit tests if available.
+ set(UNITTEST_DIR ${LLVM_SOURCE_ROOT}/utils/unittest)
+ if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h)
+ add_library(gtest ${UNITTEST_DIR}/googletest/src/gtest-all.cc)
+ target_include_directories(gtest PUBLIC "${UNITTEST_DIR}/googletest/include" PRIVATE "${UNITTEST_DIR}/googletest")
+ if( NOT MSVC )
+ target_link_libraries(gtest pthread tinfo dl)
+ endif ()
+
+ add_library(gtest_main ${UNITTEST_DIR}/UnitTestMain/TestMain.cpp)
+ target_link_libraries(gtest_main gtest)
+
+ set(POLLY_GTEST_AVAIL 1)
+ endif()
+
# Make sure the isl c files are built as fPIC
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
-endif(NOT DEFINED LLVM_MAIN_SRC_DIR)
+else ()
+ set(LLVM_SOURCE_ROOT "${LLVM_MAIN_SRC_DIR}")
+ set(POLLY_GTEST_AVAIL 1)
+endif ()
set(POLLY_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(POLLY_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
@@ -169,6 +193,9 @@ add_definitions( -D_GNU_SOURCE )
add_subdirectory(docs)
add_subdirectory(lib)
add_subdirectory(test)
+if (POLLY_GTEST_AVAIL)
+ add_subdirectory(unittests)
+endif ()
add_subdirectory(tools)
# TODO: docs.
@@ -177,7 +204,7 @@ configure_file( ${CMAKE_CURRENT_SOURCE_D
${POLLY_BINARY_DIR}/include/polly/Config/config.h )
# Add target to check formatting of polly files
-file( GLOB_RECURSE files *.h lib/*.cpp lib/*.c tools/*.cpp tools/*.c tools/*.h)
+file( GLOB_RECURSE files *.h lib/*.cpp lib/*.c tools/*.cpp tools/*.c tools/*.h unittests/*.cpp)
file( GLOB_RECURSE jsonfiles lib/JSON/*.h lib/JSON/*.cpp)
file( GLOB_RECURSE external lib/External/*.h lib/External/*.c)
list( REMOVE_ITEM files ${jsonfiles} ${external})
Modified: polly/trunk/test/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/CMakeLists.txt?rev=279734&r1=279733&r2=279734&view=diff
==============================================================================
--- polly/trunk/test/CMakeLists.txt (original)
+++ polly/trunk/test/CMakeLists.txt Thu Aug 25 07:36:15 2016
@@ -18,6 +18,9 @@ if (NOT DEFINED LLVM_MAIN_SRC_DIR)
# FIXME: FileCheck is not available in llvm install directory at the moment.
set(LLVM_LIT ${LLVM_INSTALL_ROOT}/bin/llvm-lit)
set(POLLY_TEST_DEPS LLVMPolly)
+ if (POLLY_GTEST_AVAIL)
+ list(APPEND POLLY_TEST_DEPS PollyUnitTests)
+ endif ()
set(LLVM_BINARY_DIR "${LLVM_INSTALL_ROOT}")
set(LLVM_TOOLS_DIR "${LLVM_INSTALL_ROOT}/bin")
@@ -67,18 +70,38 @@ if (NOT DEFINED LLVM_MAIN_SRC_DIR)
add_custom_target(check-polly
COMMAND ${LLVM_LIT}
--param polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
+ --param polly_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
--param build_config=${CMAKE_CFG_INTDIR}
-sv ${POLLY_TEST_EXTRA_ARGS}
${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${POLLY_TEST_DEPS}
- COMMENT "Running Polly regression tests")
+ COMMENT "Running Polly regression/unit tests")
set_target_properties(check-polly PROPERTIES FOLDER "Polly")
+
+ if (POLLY_GTEST_AVAIL)
+ configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.in
+ ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg)
+
+ add_custom_target(check-polly-unittests
+ COMMAND ${LLVM_LIT}
+ --param polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
+ --param build_config=${CMAKE_CFG_INTDIR}
+ -sv ${POLLY_TEST_EXTRA_ARGS}
+ ${CMAKE_CURRENT_BINARY_DIR}/Unit
+ DEPENDS PollyUnitTests
+ COMMENT "Running Polly unit tests")
+ set_target_properties(check-polly-unittests PROPERTIES FOLDER "Polly")
+ endif ()
endif()
else (NOT DEFINED LLVM_MAIN_SRC_DIR)
set(LLVM_LIT ${LLVM_TOOLS_BINARY_DIR}/llvm-lit)
set(POLLY_TEST_DEPS llvm-config opt LLVMPolly FileCheck not)
+ if (POLLY_GTEST_AVAIL)
+ list(APPEND POLLY_TEST_DEPS PollyUnitTests)
+ endif ()
set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}")
set(LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}")
@@ -89,14 +112,31 @@ else (NOT DEFINED LLVM_MAIN_SRC_DIR)
${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg)
+ # Run regression and unit tests
add_lit_testsuite(check-polly "Running polly regression tests"
${CMAKE_CURRENT_BINARY_DIR}
PARAMS polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
+ polly_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
DEPENDS ${POLLY_TEST_DEPS}
)
set_target_properties(check-polly PROPERTIES FOLDER "Polly")
+ if (POLLY_GTEST_AVAIL)
+ configure_lit_site_cfg(
+ ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.in
+ ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
+ )
+
+ # Run only unit tests
+ add_lit_testsuite(check-polly-unittests "Running polly unit tests only"
+ ${CMAKE_CURRENT_BINARY_DIR}/Unit
+ PARAMS polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
+ DEPENDS PollyUnitTests
+ )
+ set_target_properties(check-polly-unittests PROPERTIES FOLDER "Polly")
+ endif ()
+
# Run polly-check-format as part of polly-check only if we are compiling with
# clang, so clang-format is availbale.
# if (TARGET clang-format) would be preferable, but this target is only added
Added: polly/trunk/test/Unit/lit.cfg
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Unit/lit.cfg?rev=279734&view=auto
==============================================================================
--- polly/trunk/test/Unit/lit.cfg (added)
+++ polly/trunk/test/Unit/lit.cfg Thu Aug 25 07:36:15 2016
@@ -0,0 +1,108 @@
+# -*- Python -*-
+
+# Configuration file for the 'lit' test runner.
+
+import os
+import platform
+
+import lit.formats
+import lit.util
+
+# name: The name of this test suite.
+config.name = 'Polly-Unit'
+
+# suffixes: A list of file extensions to treat as test files.
+config.suffixes = []
+
+# test_source_root: The root path where tests are located.
+# test_exec_root: The root path where tests should be run.
+polly_obj_root = getattr(config, 'polly_obj_root', None)
+if polly_obj_root is not None:
+ config.test_exec_root = os.path.join(polly_obj_root, 'unittests')
+ config.test_source_root = config.test_exec_root
+
+# testFormat: The test format to use to interpret tests.
+llvm_build_mode = getattr(config, 'llvm_build_mode', "Debug")
+config.test_format = lit.formats.GoogleTest(llvm_build_mode, 'Tests')
+
+# Propagate the temp directory. Windows requires this because it uses \Windows\
+# if none of these are present.
+if 'TMP' in os.environ:
+ config.environment['TMP'] = os.environ['TMP']
+if 'TEMP' in os.environ:
+ config.environment['TEMP'] = os.environ['TEMP']
+
+# Propagate path to symbolizer for ASan/MSan.
+for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']:
+ if symbolizer in os.environ:
+ config.environment[symbolizer] = os.environ[symbolizer]
+
+###
+
+# Check that the object root is known.
+if config.test_exec_root is None:
+ # Otherwise, we haven't loaded the site specific configuration (the user is
+ # probably trying to run on a test file directly, and either the site
+ # configuration hasn't been created by the build system, or we are in an
+ # out-of-tree build situation).
+
+ # Check for 'polly_unit_site_config' user parameter, and use that if available.
+ site_cfg = lit_config.params.get('polly_unit_site_config', None)
+ if site_cfg and os.path.exists(site_cfg):
+ lit_config.load_config(config, site_cfg)
+ raise SystemExit
+
+ # Try to detect the situation where we are using an out-of-tree build by
+ # looking for 'llvm-config'.
+ #
+ # FIXME: I debated (i.e., wrote and threw away) adding logic to
+ # automagically generate the lit.site.cfg if we are in some kind of fresh
+ # build situation. This means knowing how to invoke the build system
+ # though, and I decided it was too much magic.
+
+ llvm_config = lit.util.which('llvm-config', config.environment['PATH'])
+ if not llvm_config:
+ lit_config.fatal('No site specific configuration available!')
+
+ # Get the source and object roots.
+ llvm_src_root = lit.util.capture(['llvm-config', '--src-root']).strip()
+ llvm_obj_root = lit.util.capture(['llvm-config', '--obj-root']).strip()
+ polly_src_root = os.path.join(llvm_src_root, "tools", "polly")
+ polly_obj_root = os.path.join(llvm_obj_root, "tools", "polly")
+
+ # Validate that we got a tree which points to here, using the standard
+ # tools/clang layout.
+ this_src_root = os.path.join(os.path.dirname(__file__),'..','..')
+ if os.path.realpath(polly_src_root) != os.path.realpath(this_src_root):
+ lit_config.fatal('No site specific configuration available!')
+
+ # Check that the site specific configuration exists.
+ site_cfg = os.path.join(polly_obj_root, 'test', 'Unit', 'lit.site.cfg')
+ if not os.path.exists(site_cfg):
+ lit_config.fatal('No site specific configuration available!')
+
+ # Okay, that worked. Notify the user of the automagic, and reconfigure.
+ lit_config.note('using out-of-tree build at %r' % polly_obj_root)
+ lit_config.load_config(config, site_cfg)
+ raise SystemExit
+
+shlibpath_var = ''
+if platform.system() == 'Linux':
+ shlibpath_var = 'LD_LIBRARY_PATH'
+elif platform.system() == 'Darwin':
+ shlibpath_var = 'DYLD_LIBRARY_PATH'
+elif platform.system() == 'Windows':
+ shlibpath_var = 'PATH'
+
+# Point the dynamic loader at dynamic libraries in 'lib'.
+llvm_libs_dir = getattr(config, 'llvm_libs_dir', None)
+if not llvm_libs_dir:
+ lit_config.fatal('No LLVM libs dir set!')
+shlibpath = os.path.pathsep.join((llvm_libs_dir,
+ config.environment.get(shlibpath_var,'')))
+
+# Win32 seeks DLLs along %PATH%.
+if sys.platform in ['win32', 'cygwin'] and os.path.isdir(config.shlibdir):
+ shlibpath = os.path.pathsep.join((config.shlibdir, shlibpath))
+
+config.environment[shlibpath_var] = shlibpath
Added: polly/trunk/test/Unit/lit.site.cfg.in
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Unit/lit.site.cfg.in?rev=279734&view=auto
==============================================================================
--- polly/trunk/test/Unit/lit.site.cfg.in (added)
+++ polly/trunk/test/Unit/lit.site.cfg.in Thu Aug 25 07:36:15 2016
@@ -0,0 +1,31 @@
+ at LIT_SITE_CFG_IN_HEADER@
+
+import sys
+
+config.llvm_src_root = "@LLVM_SOURCE_DIR@"
+config.llvm_obj_root = "@LLVM_BINARY_DIR@"
+config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
+config.llvm_libs_dir = "@LLVM_LIBS_DIR@"
+config.llvm_build_mode = "@LLVM_BUILD_MODE@"
+config.polly_obj_root = "@POLLY_BINARY_DIR@"
+config.polly_lib_dir = "@POLLY_LIB_DIR@"
+config.enable_shared = @ENABLE_SHARED@
+config.shlibdir = "@SHLIBDIR@"
+config.target_triple = "@TARGET_TRIPLE@"
+config.enable_gpgpu_codegen = "@GPU_CODEGEN@"
+config.link_polly_into_tools = "@LINK_POLLY_INTO_TOOLS@"
+
+# Support substitution of the tools_dir, libs_dirs, and build_mode with user
+# parameters. This is used when we can't determine the tool dir at
+# configuration time.
+try:
+ config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params
+ config.llvm_libs_dir = config.llvm_libs_dir % lit_config.params
+ config.llvm_build_mode = config.llvm_build_mode % lit_config.params
+except KeyError:
+ e = sys.exc_info()[1]
+ key, = e.args
+ lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key))
+
+# Let the main config do the real work.
+lit_config.load_config(config, "@POLLY_SOURCE_DIR@/test/Unit/lit.cfg")
Added: polly/trunk/unittests/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/unittests/CMakeLists.txt?rev=279734&view=auto
==============================================================================
--- polly/trunk/unittests/CMakeLists.txt (added)
+++ polly/trunk/unittests/CMakeLists.txt Thu Aug 25 07:36:15 2016
@@ -0,0 +1,22 @@
+add_custom_target(PollyUnitTests)
+set_target_properties(PollyUnitTests PROPERTIES FOLDER "Polly")
+
+# add_polly_unittest(test_dirname file1.cpp file2.cpp)
+#
+# Will compile the list of files together and link against Polly and its dependences.
+function(add_polly_unittest test_name)
+ if(COMMAND add_unittest)
+ add_unittest(PollyUnitTests ${test_name} ${ARGN})
+ else()
+ add_executable(${test_name} ${ARGN})
+ set_target_properties(${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+
+ target_link_libraries(${test_name} gtest_main gtest)
+ add_dependencies(PollyUnitTests ${test_name})
+
+ set_property(TARGET ${test_name} PROPERTY FOLDER "Polly")
+ endif()
+ target_link_libraries(${test_name} Polly LLVMCore LLVMSupport)
+endfunction()
+
+add_subdirectory(Isl)
Added: polly/trunk/unittests/Isl/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/unittests/Isl/CMakeLists.txt?rev=279734&view=auto
==============================================================================
--- polly/trunk/unittests/Isl/CMakeLists.txt (added)
+++ polly/trunk/unittests/Isl/CMakeLists.txt Thu Aug 25 07:36:15 2016
@@ -0,0 +1,3 @@
+add_polly_unittest(IslTests
+ IslTest.cpp
+ )
Added: polly/trunk/unittests/Isl/IslTest.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/unittests/Isl/IslTest.cpp?rev=279734&view=auto
==============================================================================
--- polly/trunk/unittests/Isl/IslTest.cpp (added)
+++ polly/trunk/unittests/Isl/IslTest.cpp Thu Aug 25 07:36:15 2016
@@ -0,0 +1,101 @@
+//===- IslTest.cpp ----------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "polly/Support/GICHelper.h"
+#include "gtest/gtest.h"
+#include "isl/val.h"
+
+using namespace llvm;
+using namespace polly;
+
+namespace {
+
+TEST(Isl, APIntToIslVal) {
+ isl_ctx *IslCtx = isl_ctx_alloc();
+
+ {
+ APInt APNOne(32, -1, true);
+ auto *IslNOne = isl_valFromAPInt(IslCtx, APNOne, true);
+ EXPECT_EQ(isl_bool_true, isl_val_is_negone(IslNOne));
+ isl_val_free(IslNOne);
+ }
+
+ {
+ APInt APZero(32, 0, false);
+ auto *IslZero = isl_valFromAPInt(IslCtx, APZero, false);
+ EXPECT_EQ(isl_val_is_zero(IslZero), isl_bool_true);
+ isl_val_free(IslZero);
+ }
+
+ {
+ APInt APOne(32, 1, false);
+ auto *IslOne = isl_valFromAPInt(IslCtx, APOne, false);
+ EXPECT_EQ(isl_val_is_one(IslOne), isl_bool_true);
+ isl_val_free(IslOne);
+ }
+
+ {
+ APInt APTwo(32, 2, false);
+ auto *IslTwo = isl_valFromAPInt(IslCtx, APTwo, false);
+ EXPECT_EQ(isl_val_cmp_si(IslTwo, 2), 0);
+ isl_val_free(IslTwo);
+ }
+
+ {
+ APInt APNOne(32, (1ull << 32) - 1, false);
+ auto *IslNOne = isl_valFromAPInt(IslCtx, APNOne, false);
+ auto *IslRef = isl_val_int_from_ui(IslCtx, (1ull << 32) - 1);
+ EXPECT_EQ(isl_val_eq(IslNOne, IslRef), isl_bool_true);
+ isl_val_free(IslNOne);
+ isl_val_free(IslRef);
+ }
+
+ isl_ctx_free(IslCtx);
+}
+
+TEST(Isl, IslValToAPInt) {
+ isl_ctx *IslCtx = isl_ctx_alloc();
+
+ {
+ auto *IslNOne = isl_val_int_from_si(IslCtx, -1);
+ auto APNOne = APIntFromVal(IslNOne);
+ // APInt has no sign bit, so never equals to a negative number.
+ // FIXME: The canonical representation of a negative APInt is two's
+ // complement.
+ EXPECT_EQ(APNOne, 1);
+ }
+
+ {
+ auto *IslZero = isl_val_int_from_ui(IslCtx, 0);
+ auto APZero = APIntFromVal(IslZero);
+ EXPECT_EQ(APZero, 0);
+ }
+
+ {
+ auto *IslOne = isl_val_int_from_ui(IslCtx, 1);
+ auto APOne = APIntFromVal(IslOne);
+ EXPECT_EQ(APOne, 1);
+ }
+
+ {
+ auto *IslTwo = isl_val_int_from_ui(IslCtx, 2);
+ auto APTwo = APIntFromVal(IslTwo);
+ EXPECT_EQ(APTwo, 2);
+ }
+
+ {
+ auto *IslNOne = isl_val_int_from_ui(IslCtx, (1ull << 32) - 1);
+ auto APNOne = APIntFromVal(IslNOne);
+ EXPECT_EQ(APNOne, (1ull << 32) - 1);
+ }
+
+ isl_ctx_free(IslCtx);
+}
+
+} // anonymous namespace
More information about the llvm-commits
mailing list