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