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

8
void run_pass(migraphx::program& p)
Paul's avatar
Paul committed
9
{
10
    migraphx::run_passes(
11
12
        *p.get_main_module(),
        {migraphx::eliminate_common_subexpression{}, migraphx::dead_code_elimination{}});
13
}
Paul's avatar
Paul committed
14

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

Paul's avatar
Paul committed
29
    migraphx::program p2;
Paul's avatar
Paul committed
30
    {
31
32
33
34
35
36
        auto* mm2 = p2.get_main_module();
        auto one  = mm2->add_literal(1);
        auto two  = mm2->add_literal(2);
        auto sum1 = mm2->add_instruction(migraphx::op::add{}, one, two);
        auto sum3 = mm2->add_instruction(migraphx::op::add{}, sum1, sum1);
        mm2->add_instruction(pass_op{}, sum3);
Paul's avatar
Paul committed
37
38
39
40
    }
    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
    {
45
46
47
48
49
50
51
        auto* mm1 = p1.get_main_module();
        auto one  = mm1->add_literal(1);
        auto two  = mm1->add_literal(2);
        auto sum1 = mm1->add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = mm1->add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = mm1->add_instruction(migraphx::op::add{}, sum1, sum2);
        mm1->add_instruction(pass_op{}, sum3);
Paul's avatar
Paul committed
52
    }
53
    run_pass(p1);
Paul's avatar
Paul committed
54

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

Paul's avatar
Paul committed
68
TEST_CASE(cse_test3)
Paul's avatar
Paul committed
69
{
Paul's avatar
Paul committed
70
    migraphx::program p1;
Paul's avatar
Paul committed
71
    {
72
73
74
75
76
77
78
        auto* mm1 = p1.get_main_module();
        auto one  = mm1->add_literal(1);
        auto two  = mm1->add_literal(1);
        auto sum1 = mm1->add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = mm1->add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = mm1->add_instruction(migraphx::op::add{}, sum1, sum2);
        mm1->add_instruction(pass_op{}, sum3);
Paul's avatar
Paul committed
79
    }
80
    run_pass(p1);
Paul's avatar
Paul committed
81

Paul's avatar
Paul committed
82
    migraphx::program p2;
Paul's avatar
Paul committed
83
    {
84
85
86
87
88
        auto* mm2 = p2.get_main_module();
        auto one  = mm2->add_literal(1);
        auto sum1 = mm2->add_instruction(migraphx::op::add{}, one, one);
        auto sum3 = mm2->add_instruction(migraphx::op::add{}, sum1, sum1);
        mm2->add_instruction(pass_op{}, sum3);
Paul's avatar
Paul committed
89
90
91
92
    }
    EXPECT(p1 == p2);
}

Paul's avatar
Paul committed
93
TEST_CASE(cse_test4)
Paul's avatar
Paul committed
94
{
Paul's avatar
Paul committed
95
    migraphx::program p1;
Paul's avatar
Paul committed
96
    {
97
98
99
100
101
102
103
104
105
        auto* mm1 = p1.get_main_module();
        auto one  = mm1->add_literal(1);
        auto two  = mm1->add_literal(1);
        auto sum1 = mm1->add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = mm1->add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = mm1->add_instruction(migraphx::op::add{}, sum1, one);
        auto sum4 = mm1->add_instruction(migraphx::op::add{}, sum2, two);
        auto sum5 = mm1->add_instruction(migraphx::op::add{}, sum4, sum3);
        mm1->add_instruction(pass_op{}, sum5);
Paul's avatar
Paul committed
106
    }
107
    run_pass(p1);
Paul's avatar
Paul committed
108

Paul's avatar
Paul committed
109
    migraphx::program p2;
Paul's avatar
Paul committed
110
    {
111
112
113
114
115
116
        auto* mm2 = p2.get_main_module();
        auto one  = mm2->add_literal(1);
        auto sum1 = mm2->add_instruction(migraphx::op::add{}, one, one);
        auto sum3 = mm2->add_instruction(migraphx::op::add{}, sum1, one);
        auto sum5 = mm2->add_instruction(migraphx::op::add{}, sum3, sum3);
        mm2->add_instruction(pass_op{}, sum5);
Paul's avatar
Paul committed
117
118
119
120
    }
    EXPECT(p1 == p2);
}

kahmed10's avatar
kahmed10 committed
121
122
123
124
TEST_CASE(cse_test_literal)
{
    migraphx::program p1;
    {
125
126
127
128
129
130
131
        auto* mm1  = p1.get_main_module();
        auto six1  = mm1->add_literal(6);
        auto zero1 = mm1->add_literal(0);
        auto six2  = mm1->add_literal(6);
        auto zero2 = mm1->add_literal(0);
        auto six3  = mm1->add_literal(6);
        auto zero3 = mm1->add_literal(0);
kahmed10's avatar
kahmed10 committed
132

133
134
135
136
137
138
        auto sum1 = mm1->add_instruction(migraphx::op::add{}, six1, zero1);
        auto sum2 = mm1->add_instruction(migraphx::op::add{}, six2, zero2);
        auto sum3 = mm1->add_instruction(migraphx::op::add{}, six3, zero3);
        auto sum4 = mm1->add_instruction(migraphx::op::add{}, sum1, sum2);
        auto sum5 = mm1->add_instruction(migraphx::op::add{}, sum3, sum4);
        mm1->add_instruction(pass_op{}, sum5);
kahmed10's avatar
kahmed10 committed
139
140
141
142
143
    }
    run_pass(p1);

    migraphx::program p2;
    {
144
145
146
147
148
149
150
        auto* mm2 = p2.get_main_module();
        auto six  = mm2->add_literal(6);
        auto zero = mm2->add_literal(0);
        auto sum1 = mm2->add_instruction(migraphx::op::add{}, six, zero);
        auto sum2 = mm2->add_instruction(migraphx::op::add{}, sum1, sum1);
        auto sum3 = mm2->add_instruction(migraphx::op::add{}, sum1, sum2);
        mm2->add_instruction(pass_op{}, sum3);
kahmed10's avatar
kahmed10 committed
151
152
153
154
    }
    EXPECT(p1 == p2);
}

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