@@ -21,3 +21,58 @@ TEST(AffineMapTest, inferMapFromAffineExprs) {
2121 map.replace (replacements);
2222 EXPECT_EQ (map, map);
2323}
24+
25+ TEST (AffineMapTest, isProjectedPermutation) {
26+ MLIRContext ctx;
27+ OpBuilder b (&ctx);
28+
29+ // 1. Empty map
30+ AffineMap map1 = b.getEmptyAffineMap ();
31+ EXPECT_TRUE (map1.isProjectedPermutation ());
32+
33+ // 2. Map with a symbol
34+ AffineMap map2 = AffineMap::get (0 , 1 , &ctx);
35+ EXPECT_FALSE (map2.isProjectedPermutation ());
36+
37+ // 3. The result map is {0} and zero results are _allowed_.
38+ auto zero = b.getAffineConstantExpr (0 );
39+ AffineMap map3 = AffineMap::get (1 , 0 , {zero}, &ctx);
40+ EXPECT_TRUE (map3.isProjectedPermutation (/* allowZeroInResults=*/ true ));
41+
42+ // 4. The result map is {0} and zero results are _not allowed_
43+ AffineMap map4 = AffineMap::get (1 , 0 , {zero}, &ctx);
44+ EXPECT_FALSE (map4.isProjectedPermutation (/* allowZeroInResults=*/ false ));
45+
46+ // 5. The number of results > inputs
47+ AffineMap map5 = AffineMap::get (1 , 0 , {zero, zero}, &ctx);
48+ EXPECT_FALSE (map5.isProjectedPermutation (/* allowZeroInResults=*/ true ));
49+
50+ // 6. A constant result that's not a {0}
51+ auto one = b.getAffineConstantExpr (1 );
52+ AffineMap map6 = AffineMap::get (1 , 0 , {one}, &ctx);
53+ EXPECT_FALSE (map6.isProjectedPermutation (/* allowZeroInResults=*/ true ));
54+
55+ // 7. Not a dim expression
56+ auto d0 = b.getAffineDimExpr (0 );
57+ auto d1 = b.getAffineDimExpr (1 );
58+
59+ auto sum = d0 + d1;
60+ AffineMap map7 = AffineMap::get (2 , 0 , {sum}, &ctx);
61+ EXPECT_FALSE (map7.isProjectedPermutation ());
62+
63+ // 8. (d0, d1, d2, d3, d4, d5) ->(d5, d3, d0, d1, d2, d4)
64+ auto d2 = b.getAffineDimExpr (2 );
65+ auto d3 = b.getAffineDimExpr (3 );
66+ auto d4 = b.getAffineDimExpr (4 );
67+ auto d5 = b.getAffineDimExpr (5 );
68+ AffineMap map8 = AffineMap::get (6 , 0 , {d5, d3, d0, d1, d2, d4}, &ctx);
69+ EXPECT_TRUE (map8.isProjectedPermutation ());
70+
71+ // 9. (d0, d1, d2, d3, d4, d5) ->(d5, d3, d0 + d1, d2, d4)
72+ AffineMap map9 = AffineMap::get (6 , 0 , {d5, d3, sum, d2, d4}, &ctx);
73+ EXPECT_FALSE (map9.isProjectedPermutation ());
74+
75+ // 10. (d0, d1, d2, d3, d4, d5) ->(d5, d3, d2, d4)
76+ AffineMap map10 = AffineMap::get (6 , 0 , {d5, d3, d2, d4}, &ctx);
77+ EXPECT_TRUE (map10.isProjectedPermutation ());
78+ }
0 commit comments