eliminate_common_subexpression_test.cpp 5.4 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>
Paul's avatar
Paul committed
4
#include <basic_ops.hpp>
5
6
#include <migraphx/make_op.hpp>

Paul's avatar
Paul committed
7
8
#include <test.hpp>

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

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

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

Paul's avatar
Paul committed
42
TEST_CASE(cse_test2)
Paul's avatar
Paul committed
43
{
Paul's avatar
Paul committed
44
    migraphx::program p1;
Paul's avatar
Paul committed
45
    {
46
47
48
        auto* mm1 = p1.get_main_module();
        auto one  = mm1->add_literal(1);
        auto two  = mm1->add_literal(2);
49
50
51
        auto sum1 = mm1->add_instruction(migraphx::make_op("add"), one, two);
        auto sum2 = mm1->add_instruction(migraphx::make_op("add"), two, one);
        auto sum3 = mm1->add_instruction(migraphx::make_op("add"), sum1, sum2);
52
        mm1->add_instruction(pass_op{}, sum3);
Paul's avatar
Paul committed
53
    }
54
    run_pass(p1);
Paul's avatar
Paul committed
55

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

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

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

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

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

kahmed10's avatar
kahmed10 committed
122
123
124
125
TEST_CASE(cse_test_literal)
{
    migraphx::program p1;
    {
126
127
128
129
130
131
132
        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
133

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

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

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