diff options
author | Michael Kruse <llvm@meinersbur.de> | 2017-02-04 15:42:10 +0000 |
---|---|---|
committer | Michael Kruse <llvm@meinersbur.de> | 2017-02-04 15:42:10 +0000 |
commit | ec67d364931ab3a0804970fafab31b2e687307ee (patch) | |
tree | cbe274abb66c62c1e3844fdb3778f7223023eb84 /polly/unittests | |
parent | f4dc133e693c9cec5672e23382e630c971a3944f (diff) | |
download | bcm5719-llvm-ec67d364931ab3a0804970fafab31b2e687307ee.tar.gz bcm5719-llvm-ec67d364931ab3a0804970fafab31b2e687307ee.zip |
[Support] Add computeArrayUnused. NFC.
This function has been extracted from the upcoming DeLICM patch
(https://reviews.llvm.org/D24716).
llvm-svn: 294093
Diffstat (limited to 'polly/unittests')
-rw-r--r-- | polly/unittests/Isl/IslTest.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/polly/unittests/Isl/IslTest.cpp b/polly/unittests/Isl/IslTest.cpp index 959415e95ec..667045f296b 100644 --- a/polly/unittests/Isl/IslTest.cpp +++ b/polly/unittests/Isl/IslTest.cpp @@ -741,4 +741,70 @@ TEST(DeLICM, computeReachingWrite) { false, true)); } +TEST(DeLICM, computeArrayUnused) { + std::unique_ptr<isl_ctx, decltype(&isl_ctx_free)> Ctx(isl_ctx_alloc(), + &isl_ctx_free); + + // The ReadEltInSameInst parameter doesn't matter in simple cases. To also + // cover the parameter without duplicating the tests, this loops runs over + // other in both settings. + for (bool ReadEltInSameInst = false, Done = false; !Done; + Done = ReadEltInSameInst, ReadEltInSameInst = true) { + // Basic usage: one read, one write + EXPECT_EQ(UMAP("{ Elt[] -> [i] : 0 < i < 10 }"), + computeArrayUnused(UMAP("{ Read[] -> [0]; Write[] -> [10] }"), + UMAP("{ Write[] -> Elt[] }"), + UMAP("{ Read[] -> Elt[] }"), ReadEltInSameInst, + false, false)); + EXPECT_EQ(UMAP("{ Elt[] -> [i] : 0 < i <= 10 }"), + computeArrayUnused(UMAP("{ Read[] -> [0]; Write[] -> [10] }"), + UMAP("{ Write[] -> Elt[] }"), + UMAP("{ Read[] -> Elt[] }"), ReadEltInSameInst, + false, true)); + EXPECT_EQ(UMAP("{ Elt[] -> [i] : 0 <= i < 10 }"), + computeArrayUnused(UMAP("{ Read[] -> [0]; Write[] -> [10] }"), + UMAP("{ Write[] -> Elt[] }"), + UMAP("{ Read[] -> Elt[] }"), ReadEltInSameInst, + true, false)); + EXPECT_EQ(UMAP("{ Elt[] -> [i] : 0 <= i <= 10 }"), + computeArrayUnused(UMAP("{ Read[] -> [0]; Write[] -> [10] }"), + UMAP("{ Write[] -> Elt[] }"), + UMAP("{ Read[] -> Elt[] }"), ReadEltInSameInst, + true, true)); + + // Two reads + EXPECT_EQ(UMAP("{ Elt[] -> [i] : 0 < i <= 10 }"), + computeArrayUnused( + UMAP("{ Read[0] -> [-10]; Read[1] -> [0]; Write[] -> [10] }"), + UMAP("{ Write[] -> Elt[] }"), UMAP("{ Read[i] -> Elt[] }"), + ReadEltInSameInst, false, true)); + + // Corner case: no writes + EXPECT_EQ(UMAP("{}"), + computeArrayUnused(UMAP("{ Read[] -> [0] }"), UMAP("{}"), + UMAP("{ Read[] -> Elt[] }"), ReadEltInSameInst, + false, false)); + + // Corner case: no reads + EXPECT_EQ(UMAP("{ Elt[] -> [i] : i <= 0 }"), + computeArrayUnused(UMAP("{ Write[] -> [0] }"), + UMAP("{ Write[] -> Elt[] }"), UMAP("{}"), + ReadEltInSameInst, false, true)); + } + + // Read and write in same statement + EXPECT_EQ(UMAP("{ Elt[] -> [i] : i < 0 }"), + computeArrayUnused(UMAP("{ RW[] -> [0] }"), + UMAP("{ RW[] -> Elt[] }"), + UMAP("{ RW[] -> Elt[] }"), true, false, false)); + EXPECT_EQ(UMAP("{ Elt[] -> [i] : i <= 0 }"), + computeArrayUnused(UMAP("{ RW[] -> [0] }"), + UMAP("{ RW[] -> Elt[] }"), + UMAP("{ RW[] -> Elt[] }"), true, false, true)); + EXPECT_EQ(UMAP("{ Elt[] -> [0] }"), + computeArrayUnused(UMAP("{ RW[] -> [0] }"), + UMAP("{ RW[] -> Elt[] }"), + UMAP("{ RW[] -> Elt[] }"), false, true, true)); +} + } // anonymous namespace |