@@ -809,4 +809,127 @@ TEST(FlatAffineConstraintsTest, simplifyLocalsTest) {
809809 EXPECT_TRUE (fac3.isEmpty ());
810810}
811811
812+ TEST (FlatAffineConstraintsTest, mergeDivisionsSimple) {
813+ {
814+ // (x) : (exists z, y = [x / 2] : x = 3y and x + z + 1 >= 0).
815+ FlatAffineConstraints fac1 (1 , 0 , 1 );
816+ fac1.addLocalFloorDiv ({1 , 0 , 0 }, 2 ); // y = [x / 2].
817+ fac1.addEquality ({1 , 0 , -3 , 0 }); // x = 3y.
818+ fac1.addInequality ({1 , 1 , 0 , 1 }); // x + z + 1 >= 0.
819+
820+ // (x) : (exists y = [x / 2], z : x = 5y).
821+ FlatAffineConstraints fac2 (1 );
822+ fac2.addLocalFloorDiv ({1 , 0 }, 2 ); // y = [x / 2].
823+ fac2.addEquality ({1 , -5 , 0 }); // x = 5y.
824+ fac2.appendLocalId (); // Add local id z.
825+
826+ fac1.mergeLocalIds (fac2);
827+
828+ // Local space should be same.
829+ EXPECT_EQ (fac1.getNumLocalIds (), fac2.getNumLocalIds ());
830+
831+ // 1 division should be matched + 2 unmatched local ids.
832+ EXPECT_EQ (fac1.getNumLocalIds (), 3u );
833+ EXPECT_EQ (fac2.getNumLocalIds (), 3u );
834+ }
835+
836+ {
837+ // (x) : (exists z = [x / 5], y = [x / 2] : x = 3y).
838+ FlatAffineConstraints fac1 (1 );
839+ fac1.addLocalFloorDiv ({1 , 0 }, 5 ); // z = [x / 5].
840+ fac1.addLocalFloorDiv ({1 , 0 , 0 }, 2 ); // y = [x / 2].
841+ fac1.addEquality ({1 , 0 , -3 , 0 }); // x = 3y.
842+
843+ // (x) : (exists y = [x / 2], z = [x / 5]: x = 5z).
844+ FlatAffineConstraints fac2 (1 );
845+ fac2.addLocalFloorDiv ({1 , 0 }, 2 ); // y = [x / 2].
846+ fac2.addLocalFloorDiv ({1 , 0 , 0 }, 5 ); // z = [x / 5].
847+ fac2.addEquality ({1 , 0 , -5 , 0 }); // x = 5z.
848+
849+ fac1.mergeLocalIds (fac2);
850+
851+ // Local space should be same.
852+ EXPECT_EQ (fac1.getNumLocalIds (), fac2.getNumLocalIds ());
853+
854+ // 2 divisions should be matched.
855+ EXPECT_EQ (fac1.getNumLocalIds (), 2u );
856+ EXPECT_EQ (fac2.getNumLocalIds (), 2u );
857+ }
858+ }
859+
860+ TEST (FlatAffineConstraintsTest, mergeDivisionsNestedDivsions) {
861+ {
862+ // (x) : (exists y = [x / 2], z = [x + y / 3]: y + z >= x).
863+ FlatAffineConstraints fac1 (1 );
864+ fac1.addLocalFloorDiv ({1 , 0 }, 2 ); // y = [x / 2].
865+ fac1.addLocalFloorDiv ({1 , 1 , 0 }, 3 ); // z = [x + y / 3].
866+ fac1.addInequality ({-1 , 1 , 1 , 0 }); // y + z >= x.
867+
868+ // (x) : (exists y = [x / 2], z = [x + y / 3]: y + z <= x).
869+ FlatAffineConstraints fac2 (1 );
870+ fac2.addLocalFloorDiv ({1 , 0 }, 2 ); // y = [x / 2].
871+ fac2.addLocalFloorDiv ({1 , 1 , 0 }, 3 ); // z = [x + y / 3].
872+ fac2.addInequality ({1 , -1 , -1 , 0 }); // y + z <= x.
873+
874+ fac1.mergeLocalIds (fac2);
875+
876+ // Local space should be same.
877+ EXPECT_EQ (fac1.getNumLocalIds (), fac2.getNumLocalIds ());
878+
879+ // 2 divisions should be matched.
880+ EXPECT_EQ (fac1.getNumLocalIds (), 2u );
881+ EXPECT_EQ (fac2.getNumLocalIds (), 2u );
882+ }
883+
884+ {
885+ // (x) : (exists y = [x / 2], z = [x + y / 3], w = [z + 1 / 5]: y + z >= x).
886+ FlatAffineConstraints fac1 (1 );
887+ fac1.addLocalFloorDiv ({1 , 0 }, 2 ); // y = [x / 2].
888+ fac1.addLocalFloorDiv ({1 , 1 , 0 }, 3 ); // z = [x + y / 3].
889+ fac1.addLocalFloorDiv ({0 , 0 , 1 , 1 }, 5 ); // w = [z + 1 / 5].
890+ fac1.addInequality ({-1 , 1 , 1 , 0 , 0 }); // y + z >= x.
891+
892+ // (x) : (exists y = [x / 2], z = [x + y / 3], w = [z + 1 / 5]: y + z <= x).
893+ FlatAffineConstraints fac2 (1 );
894+ fac2.addLocalFloorDiv ({1 , 0 }, 2 ); // y = [x / 2].
895+ fac2.addLocalFloorDiv ({1 , 1 , 0 }, 3 ); // z = [x + y / 3].
896+ fac2.addLocalFloorDiv ({0 , 0 , 1 , 1 }, 5 ); // w = [z + 1 / 5].
897+ fac2.addInequality ({1 , -1 , -1 , 0 , 0 }); // y + z <= x.
898+
899+ fac1.mergeLocalIds (fac2);
900+
901+ // Local space should be same.
902+ EXPECT_EQ (fac1.getNumLocalIds (), fac2.getNumLocalIds ());
903+
904+ // 3 divisions should be matched.
905+ EXPECT_EQ (fac1.getNumLocalIds (), 3u );
906+ EXPECT_EQ (fac2.getNumLocalIds (), 3u );
907+ }
908+ }
909+
910+ TEST (FlatAffineConstraintsTest, mergeDivisionsConstants) {
911+ {
912+ // (x) : (exists y = [x + 1 / 3], z = [x + 2 / 3]: y + z >= x).
913+ FlatAffineConstraints fac1 (1 );
914+ fac1.addLocalFloorDiv ({1 , 1 }, 2 ); // y = [x + 1 / 2].
915+ fac1.addLocalFloorDiv ({1 , 0 , 2 }, 3 ); // z = [x + 2 / 3].
916+ fac1.addInequality ({-1 , 1 , 1 , 0 }); // y + z >= x.
917+
918+ // (x) : (exists y = [x + 1 / 3], z = [x + 2 / 3]: y + z <= x).
919+ FlatAffineConstraints fac2 (1 );
920+ fac2.addLocalFloorDiv ({1 , 1 }, 2 ); // y = [x + 1 / 2].
921+ fac2.addLocalFloorDiv ({1 , 0 , 2 }, 3 ); // z = [x + 2 / 3].
922+ fac2.addInequality ({1 , -1 , -1 , 0 }); // y + z <= x.
923+
924+ fac1.mergeLocalIds (fac2);
925+
926+ // Local space should be same.
927+ EXPECT_EQ (fac1.getNumLocalIds (), fac2.getNumLocalIds ());
928+
929+ // 2 divisions should be matched.
930+ EXPECT_EQ (fac1.getNumLocalIds (), 2u );
931+ EXPECT_EQ (fac2.getNumLocalIds (), 2u );
932+ }
933+ }
934+
812935} // namespace mlir
0 commit comments