1 //===- FlattenTest.cpp ----------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "polly/FlattenAlgo.h"
11 #include "polly/Support/GICHelper.h"
12 #include "gtest/gtest.h"
13 #include "isl/union_map.h"
16 using namespace polly
;
20 /// Flatten a schedule and compare to the expected result.
22 /// @param ScheduleStr The schedule to flatten as string.
23 /// @param ExpectedStr The expected result as string.
25 /// @result Whether the flattened schedule is the same as the expected schedule.
26 bool checkFlatten(const char *ScheduleStr
, const char *ExpectedStr
) {
27 auto *Ctx
= isl_ctx_alloc();
31 auto Schedule
= give(isl_union_map_read_from_str(Ctx
, ScheduleStr
));
32 auto Expected
= give(isl_union_map_read_from_str(Ctx
, ExpectedStr
));
34 auto Result
= flattenSchedule(std::move(Schedule
));
35 Success
= isl_union_map_is_equal(Result
.keep(), Expected
.keep());
39 return Success
== isl_bool_true
;
42 TEST(Flatten
, FlattenTrivial
) {
43 EXPECT_TRUE(checkFlatten("{ A[] -> [0] }", "{ A[] -> [0] }"));
44 EXPECT_TRUE(checkFlatten("{ A[i] -> [i, 0] : 0 <= i < 10 }",
45 "{ A[i] -> [i] : 0 <= i < 10 }"));
46 EXPECT_TRUE(checkFlatten("{ A[i] -> [0, i] : 0 <= i < 10 }",
47 "{ A[i] -> [i] : 0 <= i < 10 }"));
50 TEST(Flatten
, FlattenSequence
) {
51 EXPECT_TRUE(checkFlatten(
52 "[n] -> { A[i] -> [0, i] : 0 <= i < n; B[i] -> [1, i] : 0 <= i < n }",
53 "[n] -> { A[i] -> [i] : 0 <= i < n; B[i] -> [n + i] : 0 <= i < n }"));
55 EXPECT_TRUE(checkFlatten(
56 "{ A[i] -> [0, i] : 0 <= i < 10; B[i] -> [1, i] : 0 <= i < 10 }",
57 "{ A[i] -> [i] : 0 <= i < 10; B[i] -> [10 + i] : 0 <= i < 10 }"));
60 TEST(Flatten
, FlattenLoop
) {
61 EXPECT_TRUE(checkFlatten(
62 "[n] -> { A[i] -> [i, 0] : 0 <= i < n; B[i] -> [i, 1] : 0 <= i < n }",
63 "[n] -> { A[i] -> [2i] : 0 <= i < n; B[i] -> [2i + 1] : 0 <= i < n }"));
65 EXPECT_TRUE(checkFlatten(
66 "{ A[i] -> [i, 0] : 0 <= i < 10; B[i] -> [i, 1] : 0 <= i < 10 }",
67 "{ A[i] -> [2i] : 0 <= i < 10; B[i] -> [2i + 1] : 0 <= i < 10 }"));
70 } // anonymous namespace