| #include <gtest/gtest.h> | 
 |  | 
 | #include <torch/csrc/jit/ir/ir.h> | 
 | #include <torch/csrc/jit/ir/irparser.h> | 
 | #include <torch/csrc/jit/passes/constant_pooling.h> | 
 | #include <torch/csrc/jit/passes/constant_propagation.h> | 
 | #include <torch/csrc/jit/testing/file_check.h> | 
 |  | 
 | #include <sstream> | 
 | #include <string> | 
 |  | 
 | namespace torch { | 
 | namespace jit { | 
 |  | 
 | TEST(ConstantPoolingTest, Int) { | 
 |   auto graph = std::make_shared<Graph>(); | 
 |   parseIR( | 
 |       R"IR( | 
 | graph(): | 
 |   %8 : int = prim::Constant[value=1]() | 
 |   %10 : int = prim::Constant[value=1]() | 
 |   return (%8, %10) | 
 |   )IR", | 
 |       &*graph); | 
 |   ConstantPooling(graph); | 
 |   testing::FileCheck() | 
 |       .check_count("prim::Constant", 1, /*exactly*/ true) | 
 |       ->run(*graph); | 
 | } | 
 |  | 
 | TEST(ConstantPoolingTest, PoolingAcrossBlocks) { | 
 |   auto graph = std::make_shared<Graph>(); | 
 |   parseIR( | 
 |       R"IR( | 
 | graph(%cond : Tensor): | 
 |   %a : str = prim::Constant[value="bcd"]() | 
 |   %3 : bool = aten::Bool(%cond) | 
 |   %b : str = prim::If(%3) | 
 |     block0(): | 
 |       %b.1 : str = prim::Constant[value="abc"]() | 
 |       -> (%b.1) | 
 |     block1(): | 
 |       %b.2 : str = prim::Constant[value="abc"]() | 
 |       -> (%b.2) | 
 |   %7 : (str, str) = prim::TupleConstruct(%a, %b) | 
 |   return (%7) | 
 |   )IR", | 
 |       &*graph); | 
 |   ConstantPooling(graph); | 
 |   testing::FileCheck() | 
 |       .check_count("prim::Constant[value=\"abc\"]", 1, /*exactly*/ true) | 
 |       ->check_count("prim::Constant[value=\"bcd\"]", 1, /*exactly*/ true) | 
 |       ->run(*graph); | 
 | } | 
 |  | 
 | TEST(ConstantPoolingTest, PoolingDifferentDevices) { | 
 |   auto graph = std::make_shared<Graph>(); | 
 |   parseIR( | 
 |       R"IR( | 
 | graph(): | 
 |   %2 : int = prim::Constant[value=2]() | 
 |   %1 : int = prim::Constant[value=1]() | 
 |   %5 : int? = prim::Constant() | 
 |   %7 : Device? = prim::Constant() | 
 |   %15: bool = prim::Constant[value=0]() | 
 |   %10 : int = prim::Constant[value=6]() | 
 |   %3 : int[] = prim::ListConstruct(%1, %2) | 
 |   %x : Tensor = aten::tensor(%3, %5, %7, %15) | 
 |   %y : Tensor = aten::tensor(%3, %10, %7, %15) | 
 |   %9 : int[] = prim::ListConstruct(%1, %2) | 
 |   %z : Tensor = aten::tensor(%9, %10, %7, %15) | 
 |   prim::Print(%x, %y, %z) | 
 |   return (%1) | 
 |   )IR", | 
 |       &*graph); | 
 |   // three tensors created - two different devices among the three | 
 |   // don't have good support for parsing tensor constants | 
 |   ConstantPropagation(graph); | 
 |   ConstantPooling(graph); | 
 |   testing::FileCheck() | 
 |       .check_count( | 
 |           "Float(2, strides=[1], requires_grad=0, device=cpu) = prim::Constant", | 
 |           1, | 
 |           /*exactly*/ true) | 
 |       ->check_count( | 
 |           "Long(2, strides=[1], requires_grad=0, device=cpu) = prim::Constant", | 
 |           1, | 
 |           /*exactly*/ true) | 
 |       ->run(*graph); | 
 | } | 
 |  | 
 | TEST(ConstantPoolingTest, DictConstantPooling) { | 
 |   auto graph = std::make_shared<Graph>(); | 
 |   parseIR( | 
 |       R"IR( | 
 | graph(): | 
 |   %0 : int = prim::Constant[value=1]() # test/elias.py:6:9 | 
 |   %1 : int = prim::Constant[value=2]() # test/elias.py:6:12 | 
 |   %a.1 : Dict(int, int) = prim::DictConstruct(%0, %1) | 
 |   %b.1 : Dict(int, int) = prim::DictConstruct(%1, %1) | 
 |   return (%a.1, %b.1) | 
 |   )IR", | 
 |       &*graph); | 
 |   ConstantPropagation(graph); | 
 |   ConstantPooling(graph); | 
 |   testing::FileCheck() | 
 |       .check_count( | 
 |           "Dict(int, int) = prim::Constant", | 
 |           2, | 
 |           /*exactly*/ true) | 
 |       ->run(*graph); | 
 | } | 
 | } // namespace jit | 
 | } // namespace torch |