eliminate_common_subexpression_test.cpp 3.71 KB
Newer Older
Paul's avatar
Paul committed
1
#include <migraphx/eliminate_common_subexpression.hpp>
Paul's avatar
Paul committed
2
#include <migraphx/dead_code_elimination.hpp>
3
#include <migraphx/op/add.hpp>
Paul's avatar
Paul committed
4
5
6
7
8
9
#include <basic_ops.hpp>
#include <test.hpp>

struct cse_target
{
    std::string name() const { return "dce"; }
Paul's avatar
Paul committed
10
    std::vector<migraphx::pass> get_passes(migraphx::context&) const
Paul's avatar
Paul committed
11
    {
Paul's avatar
Paul committed
12
        return {migraphx::eliminate_common_subexpression{}, migraphx::dead_code_elimination{}};
Paul's avatar
Paul committed
13
    }
Paul's avatar
Paul committed
14
    migraphx::context get_context() const { return {}; }
Paul's avatar
Paul committed
15
16
};

Paul's avatar
Paul committed
17
TEST_CASE(cse_test1)
Paul's avatar
Paul committed
18
{
Paul's avatar
Paul committed
19
    migraphx::program p1;
Paul's avatar
Paul committed
20
    {
Paul's avatar
Paul committed
21
22
        auto one  = p1.add_literal(1);
        auto two  = p1.add_literal(2);
Paul's avatar
Paul committed
23
24
25
        auto sum1 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum3 = p1.add_instruction(migraphx::op::add{}, sum1, sum2);
Paul's avatar
Paul committed
26
27
28
29
        p1.add_instruction(pass_op{}, sum3);
    }
    p1.compile(cse_target{});

Paul's avatar
Paul committed
30
    migraphx::program p2;
Paul's avatar
Paul committed
31
    {
Paul's avatar
Paul committed
32
33
        auto one  = p2.add_literal(1);
        auto two  = p2.add_literal(2);
Paul's avatar
Paul committed
34
35
        auto sum1 = p2.add_instruction(migraphx::op::add{}, one, two);
        auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, sum1);
Paul's avatar
Paul committed
36
37
38
39
40
        p2.add_instruction(pass_op{}, sum3);
    }
    EXPECT(p1 == p2);
}

Paul's avatar
Paul committed
41
TEST_CASE(cse_test2)
Paul's avatar
Paul committed
42
{
Paul's avatar
Paul committed
43
    migraphx::program p1;
Paul's avatar
Paul committed
44
    {
Paul's avatar
Paul committed
45
46
        auto one  = p1.add_literal(1);
        auto two  = p1.add_literal(2);
Paul's avatar
Paul committed
47
48
49
        auto sum1 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p1.add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = p1.add_instruction(migraphx::op::add{}, sum1, sum2);
Paul's avatar
Paul committed
50
51
52
53
        p1.add_instruction(pass_op{}, sum3);
    }
    p1.compile(cse_target{});

Paul's avatar
Paul committed
54
    migraphx::program p2;
Paul's avatar
Paul committed
55
    {
Paul's avatar
Paul committed
56
57
        auto one  = p2.add_literal(1);
        auto two  = p2.add_literal(2);
Paul's avatar
Paul committed
58
59
60
        auto sum1 = p2.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p2.add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, sum2);
Paul's avatar
Paul committed
61
62
63
64
65
        p2.add_instruction(pass_op{}, sum3);
    }
    EXPECT(p1 == p2);
}

Paul's avatar
Paul committed
66
TEST_CASE(cse_test3)
Paul's avatar
Paul committed
67
{
Paul's avatar
Paul committed
68
    migraphx::program p1;
Paul's avatar
Paul committed
69
    {
Paul's avatar
Paul committed
70
71
        auto one  = p1.add_literal(1);
        auto two  = p1.add_literal(1);
Paul's avatar
Paul committed
72
73
74
        auto sum1 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p1.add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = p1.add_instruction(migraphx::op::add{}, sum1, sum2);
Paul's avatar
Paul committed
75
76
77
78
        p1.add_instruction(pass_op{}, sum3);
    }
    p1.compile(cse_target{});

Paul's avatar
Paul committed
79
    migraphx::program p2;
Paul's avatar
Paul committed
80
    {
Paul's avatar
Paul committed
81
        auto one  = p2.add_literal(1);
Paul's avatar
Paul committed
82
83
        auto sum1 = p2.add_instruction(migraphx::op::add{}, one, one);
        auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, sum1);
Paul's avatar
Paul committed
84
85
86
87
88
        p2.add_instruction(pass_op{}, sum3);
    }
    EXPECT(p1 == p2);
}

Paul's avatar
Paul committed
89
TEST_CASE(cse_test4)
Paul's avatar
Paul committed
90
{
Paul's avatar
Paul committed
91
    migraphx::program p1;
Paul's avatar
Paul committed
92
    {
Paul's avatar
Paul committed
93
94
        auto one  = p1.add_literal(1);
        auto two  = p1.add_literal(1);
Paul's avatar
Paul committed
95
96
97
98
99
        auto sum1 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p1.add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = p1.add_instruction(migraphx::op::add{}, sum1, one);
        auto sum4 = p1.add_instruction(migraphx::op::add{}, sum2, two);
        auto sum5 = p1.add_instruction(migraphx::op::add{}, sum4, sum3);
Paul's avatar
Paul committed
100
101
102
103
        p1.add_instruction(pass_op{}, sum5);
    }
    p1.compile(cse_target{});

Paul's avatar
Paul committed
104
    migraphx::program p2;
Paul's avatar
Paul committed
105
    {
Paul's avatar
Paul committed
106
        auto one  = p2.add_literal(1);
Paul's avatar
Paul committed
107
108
109
        auto sum1 = p2.add_instruction(migraphx::op::add{}, one, one);
        auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, one);
        auto sum5 = p2.add_instruction(migraphx::op::add{}, sum3, sum3);
Paul's avatar
Paul committed
110
111
112
113
114
        p2.add_instruction(pass_op{}, sum5);
    }
    EXPECT(p1 == p2);
}

Paul's avatar
Paul committed
115
int main(int argc, const char* argv[]) { test::run(argc, argv); }