1 //===- FlattenTest.cpp ----------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "polly/FlattenAlgo.h"
11 #include "polly/Support/GICHelper.h"
12 #include "gtest/gtest.h"
13 #include "isl/union_map.h"
14 
15 using namespace llvm;
16 using namespace polly;
17 
18 namespace {
19 
20 /// Flatten a schedule and compare to the expected result.
21 ///
22 /// @param ScheduleStr The schedule to flatten as string.
23 /// @param ExpectedStr The expected result as string.
24 ///
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();
28   isl_bool Success;
29 
30   {
31     auto Schedule = give(isl_union_map_read_from_str(Ctx, ScheduleStr));
32     auto Expected = give(isl_union_map_read_from_str(Ctx, ExpectedStr));
33 
34     auto Result = flattenSchedule(std::move(Schedule));
35     Success = isl_union_map_is_equal(Result.keep(), Expected.keep());
36   }
37 
38   isl_ctx_free(Ctx);
39   return Success == isl_bool_true;
40 }
41 
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 }"));
48 }
49 
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 }"));
54 
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 }"));
58 }
59 
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 }"));
64 
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 }"));
68 }
69 
70 } // anonymous namespace
71