[polly] r279734 - Introduce unittests.

Tobias Grosser via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 25 06:24:07 PDT 2016


This seems to have triggered a problem due to missing libraries:

http://lab.llvm.org:8011/builders/perf-x86_64-penryn-O3-polly-parallel-fast/builds/23099

Best,
Tobias

On Thu, Aug 25, 2016, at 02:36 PM, Michael Kruse via llvm-commits wrote:
> 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
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list