dead_code_elimination_test.cpp 6.4 KB
Newer Older
Paul's avatar
Paul committed
1
#include <migraphx/dead_code_elimination.hpp>
2
#include <migraphx/pass_manager.hpp>
Paul's avatar
Paul committed
3
#include <basic_ops.hpp>
4
#include <migraphx/make_op.hpp>
5
#include <migraphx/ranges.hpp>
6

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(p, {migraphx::dead_code_elimination{}});
12
}
Paul's avatar
Paul committed
13

Paul's avatar
Paul committed
14
TEST_CASE(simple_test)
Paul's avatar
Paul committed
15
{
Paul's avatar
Paul committed
16
    migraphx::program p;
17
18
19
20
    auto* mm = p.get_main_module();
    auto one = mm->add_literal(1);
    auto two = mm->add_literal(2);
    mm->add_instruction(sum_op{}, one, two);
Shucai Xiao's avatar
Shucai Xiao committed
21
    auto count = std::distance(mm->begin(), mm->end());
22
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
23
    EXPECT(std::distance(mm->begin(), mm->end()) == count);
24
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
25
26
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
27
28
}

Paul's avatar
Paul committed
29
TEST_CASE(simple_test_nop)
30
{
Paul's avatar
Paul committed
31
    migraphx::program p;
32
33
34
35
36
    auto* mm = p.get_main_module();
    auto one = mm->add_literal(1);
    auto two = mm->add_literal(2);
    mm->add_instruction(nop{});
    mm->add_instruction(sum_op{}, one, two);
Shucai Xiao's avatar
Shucai Xiao committed
37
    auto count = std::distance(mm->begin(), mm->end());
38
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
39
    EXPECT(std::distance(mm->begin(), mm->end()) == count);
40
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
41
42
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
43
44
}

Paul's avatar
Paul committed
45
TEST_CASE(simple_test_nop2)
Paul's avatar
Paul committed
46
{
Paul's avatar
Paul committed
47
    migraphx::program p;
48
49
50
51
52
53
    auto* mm = p.get_main_module();
    auto one = mm->add_literal(1);
    auto two = mm->add_literal(2);
    mm->add_instruction(nop{});
    mm->add_instruction(sum_op{}, one, two);
    mm->add_instruction(nop{});
54
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
55
    EXPECT(std::distance(mm->begin(), mm->end()) == 2);
56
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
57
58
    EXPECT(result == migraphx::literal{});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
59
60
}

Paul's avatar
Paul committed
61
TEST_CASE(duplicate_test1)
Paul's avatar
Paul committed
62
{
Paul's avatar
Paul committed
63
    migraphx::program p;
64
65
66
67
68
    auto* mm = p.get_main_module();
    auto one = mm->add_literal(1);
    auto two = mm->add_literal(2);
    mm->add_instruction(sum_op{}, one, two);
    mm->add_instruction(sum_op{}, one, two);
Shucai Xiao's avatar
Shucai Xiao committed
69
    auto count = std::distance(mm->begin(), mm->end());
70
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
71
    EXPECT(std::distance(mm->begin(), mm->end()) == (count - 1));
72
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
73
74
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
75
76
}

Paul's avatar
Paul committed
77
TEST_CASE(duplicate_test2)
78
{
Paul's avatar
Paul committed
79
    migraphx::program p;
80
81
82
83
84
85
    auto* mm = p.get_main_module();
    auto one = mm->add_literal(1);
    auto two = mm->add_literal(2);
    mm->add_instruction(sum_op{}, one, two);
    mm->add_instruction(minus_op{}, one, two);
    mm->add_instruction(sum_op{}, one, two);
Shucai Xiao's avatar
Shucai Xiao committed
86
    auto count = std::distance(mm->begin(), mm->end());
87
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
88
    EXPECT(std::distance(mm->begin(), mm->end()) == (count - 2));
89
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
90
91
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
92
93
}

Paul's avatar
Paul committed
94
TEST_CASE(depth_test)
Paul's avatar
Paul committed
95
{
Paul's avatar
Paul committed
96
    migraphx::program p;
97
98
99
100
101
102
103
104
    auto* mm = p.get_main_module();
    auto one = mm->add_literal(1);
    auto two = mm->add_literal(2);
    auto x1  = mm->add_instruction(sum_op{}, one, two);
    auto x2  = mm->add_instruction(sum_op{}, one, two);
    mm->add_instruction(minus_op{}, x1, x2);
    mm->add_instruction(minus_op{}, x1, x2);
    mm->add_instruction(sum_op{}, one, two);
Shucai Xiao's avatar
Shucai Xiao committed
105
    auto count = std::distance(mm->begin(), mm->end());
106
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
107
    EXPECT(std::distance(mm->begin(), mm->end()) == (count - 4));
108
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
109
110
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
111
112
}

Paul's avatar
Paul committed
113
114
115
TEST_CASE(undefined_test)
{
    migraphx::program p;
116
117
118
    auto* mm   = p.get_main_module();
    auto one   = mm->add_literal(1);
    auto two   = mm->add_literal(2);
119
    auto undef = mm->add_instruction(migraphx::make_op("undefined"));
120
    mm->add_instruction(sum_op{}, one, two);
Shucai Xiao's avatar
Shucai Xiao committed
121
    auto count = std::distance(mm->begin(), mm->end());
122
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
123
    EXPECT(std::distance(mm->begin(), mm->end()) == count - 1);
124
    EXPECT(not mm->has_instruction(undef));
125
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
126
127
128
129
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
}

130
131
132
TEST_CASE(duplicate_args1)
{
    migraphx::program p;
133
134
135
    auto* mm = p.get_main_module();
    auto l0  = mm->add_literal(0);
    auto l3  = mm->add_literal(3);
136
137
    mm->add_instruction(migraphx::make_op("add"), l3, l3);
    mm->add_instruction(migraphx::make_op("identity"), l0);
Shucai Xiao's avatar
Shucai Xiao committed
138
    auto count = std::distance(mm->begin(), mm->end());
139
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
140
141
    EXPECT(std::distance(mm->begin(), mm->end()) != count);
    EXPECT(std::distance(mm->begin(), mm->end()) == 2);
142
    auto result = p.eval({}).back();
143
144
145
146
147
148
    EXPECT(result == migraphx::literal{0});
}

TEST_CASE(duplicate_args2)
{
    migraphx::program p;
149
150
151
    auto* mm  = p.get_main_module();
    auto l0   = mm->add_literal(0);
    auto l3   = mm->add_literal(3);
152
153
154
    auto sum1 = mm->add_instruction(migraphx::make_op("add"), l0, l3);
    mm->add_instruction(migraphx::make_op("add"), sum1, l3);
    mm->add_instruction(migraphx::make_op("identity"), l0);
Shucai Xiao's avatar
Shucai Xiao committed
155
    auto count = std::distance(mm->begin(), mm->end());
156
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
157
158
    EXPECT(std::distance(mm->begin(), mm->end()) != count);
    EXPECT(std::distance(mm->begin(), mm->end()) == 2);
159
    auto result = p.eval({}).back();
160
161
162
163
164
165
    EXPECT(result == migraphx::literal{0});
}

TEST_CASE(duplicate_args3)
{
    migraphx::program p;
166
167
168
    auto* mm  = p.get_main_module();
    auto l0   = mm->add_literal(0);
    auto l3   = mm->add_literal(3);
169
170
171
172
    auto sum1 = mm->add_instruction(migraphx::make_op("add"), l0, l3);
    auto sum2 = mm->add_instruction(migraphx::make_op("add"), l0, sum1);
    mm->add_instruction(migraphx::make_op("add"), sum2, l3);
    mm->add_instruction(migraphx::make_op("identity"), l0);
Shucai Xiao's avatar
Shucai Xiao committed
173
    auto count = std::distance(mm->begin(), mm->end());
174
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
175
176
    EXPECT(std::distance(mm->begin(), mm->end()) != count);
    EXPECT(std::distance(mm->begin(), mm->end()) == 2);
177
    auto result = p.eval({}).back();
178
179
180
    EXPECT(result == migraphx::literal{0});
}

181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
TEST_CASE(unused_module)
{
    migraphx::program p;
    auto* mm = p.get_main_module();
    auto* m1 = p.create_module("unused");
    auto* m2 = p.create_module("used");
    auto l0  = mm->add_literal(0);
    m1->add_literal(0);
    m2->add_literal(0);
    mm->add_instruction(mod_pass_op{}, {l0}, {m2});
    EXPECT(migraphx::contains(p.get_modules(), m1));
    EXPECT(migraphx::contains(p.get_modules(), m2));
    run_pass(p);
    EXPECT(migraphx::contains(p.get_modules(), m2));
    EXPECT(not migraphx::contains(p.get_modules(), m1));
}

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