#include #include #include "test/cpp/tensorexpr/test_base.h" #include #include #include #include #include #include #include namespace torch { namespace jit { using namespace torch::jit::tensorexpr; TEST(IRVerifier, BitwiseOps) { VarPtr X = alloc("x", kInt); VarPtr Y = alloc("y", kFloat); { auto a = alloc(X, Y); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { auto a = alloc(X, Y); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { auto a = alloc(X, Y); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { auto a = alloc(X, Y); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { auto a = alloc(X, Y); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } } TEST(IRVerifier, CompareSelect) { ExprPtr X = alloc(1); ExprPtr Y = alloc(3.14f); { auto a = alloc(X, X, X, Y, kEQ); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { auto a = alloc(X, Y, X, X, kEQ); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } } TEST(IRVerifier, Ramp) { VarPtr I = alloc("i", kInt); VarPtr J = alloc("j", kFloat); { auto a = alloc(I, J, 4); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } } TEST(IRVerifier, Load) { VarPtr I = alloc("i", kInt); VarPtr J = alloc("j", kLong); VarPtr K = alloc("k", kFloat); BufPtr B = alloc( "b", std::vector({alloc(10), alloc(20)}), kFloat); { // Indices with different int dtypes (kInt, kLong) are ok auto a = alloc(B, std::vector({I, J})); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_NO_THROW(verify(a)); } { // Float index auto a = alloc(B, std::vector({K, K})); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { // Multilanes are only allowed in flattened indices auto multilane_index = alloc(I, alloc(1), 4); auto a = alloc(B, std::vector({I, multilane_index})); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } } TEST(IRVerifier, IfThenElse) { VarPtr I = alloc("i", kInt); VarPtr J = alloc("j", kLong); VarPtr K = alloc("k", kFloat); { // Condition must be integral auto a = alloc(K, I, I); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { // Dtypes of true and false exprs must match auto a = alloc(I, I, J); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { // Can't have multiple lanes in condition expr auto a = alloc(alloc(I, 4), I, I); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } } TEST(IRVerifier, For) { VarPtr I = alloc("i", kInt); VarPtr J = alloc("j", kInt); StmtPtr body = alloc(std::vector({})); { // Can't have nullptr as a Var auto a = alloc(nullptr, I, J, body); // NOLINTNEXTLINE(hicpp-avoid-goto,cppcoreguidelines-avoid-goto) EXPECT_ANY_THROW(verify(a)); } } TEST(IRVerifier, Block) { VarPtr I = alloc("i", kInt); BufPtr B = alloc("B", std::vector({alloc(10)}), kInt); { StmtPtr store = alloc(B, std::vector({I}), I); // NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores) StmtPtr block1 = alloc(std::vector({store})); // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) StmtPtr block2 = alloc(std::vector({store})); // Stmt can't have multiple parents, thus inserting it into several blocks // is illegal // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(block2)); } } TEST(IRVerifier, Store) { VarPtr I = alloc("i", kInt); VarPtr J = alloc("j", kLong); VarPtr K = alloc("k", kFloat); BufPtr B = alloc( "b", std::vector({alloc(10), alloc(20)}), kFloat); { // Indices with different int dtypes (kInt, kLong) are ok auto a = alloc(B, std::vector({I, J}), K); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_NO_THROW(verify(a)); } { // Float index auto a = alloc(B, std::vector({K, K}), K); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { // Multilanes are only allowed in flattened indices auto multilane_index = alloc(I, alloc(1), 4); auto a = alloc(B, std::vector({I, multilane_index}), K); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } { // Value and buf dtypes mismatch auto a = alloc(B, std::vector({I}), I); // NOLINTNEXTLINE(cppcoreguidelines-avoid-goto,hicpp-avoid-goto,clang-analyzer-cplusplus.NewDeleteLeaks) EXPECT_ANY_THROW(verify(a)); } } } // namespace jit } // namespace torch