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

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

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

Paul's avatar
Paul committed
15
TEST_CASE(simple_test)
Paul's avatar
Paul committed
16
{
Paul's avatar
Paul committed
17
    migraphx::program p;
18
19
20
21
    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
22
    auto count = std::distance(mm->begin(), mm->end());
23
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
24
    EXPECT(std::distance(mm->begin(), mm->end()) == count);
25
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
26
27
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
28
29
}

Paul's avatar
Paul committed
30
TEST_CASE(simple_test_nop)
31
{
Paul's avatar
Paul committed
32
    migraphx::program p;
33
34
35
36
37
    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
38
    auto count = std::distance(mm->begin(), mm->end());
39
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
40
    EXPECT(std::distance(mm->begin(), mm->end()) == count);
41
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
42
43
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
44
45
}

Paul's avatar
Paul committed
46
TEST_CASE(simple_test_nop2)
Paul's avatar
Paul committed
47
{
Paul's avatar
Paul committed
48
    migraphx::program p;
49
50
51
52
53
54
    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{});
55
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
56
    EXPECT(std::distance(mm->begin(), mm->end()) == 2);
57
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
58
59
    EXPECT(result == migraphx::literal{});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
60
61
}

Paul's avatar
Paul committed
62
TEST_CASE(duplicate_test1)
Paul's avatar
Paul committed
63
{
Paul's avatar
Paul committed
64
    migraphx::program p;
65
66
67
68
69
    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
70
    auto count = std::distance(mm->begin(), mm->end());
71
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
72
    EXPECT(std::distance(mm->begin(), mm->end()) == (count - 1));
73
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
74
75
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
76
77
}

Paul's avatar
Paul committed
78
TEST_CASE(duplicate_test2)
79
{
Paul's avatar
Paul committed
80
    migraphx::program p;
81
82
83
84
85
86
    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
87
    auto count = std::distance(mm->begin(), mm->end());
88
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
89
    EXPECT(std::distance(mm->begin(), mm->end()) == (count - 2));
90
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
91
92
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
93
94
}

Paul's avatar
Paul committed
95
TEST_CASE(depth_test)
Paul's avatar
Paul committed
96
{
Paul's avatar
Paul committed
97
    migraphx::program p;
98
99
100
101
102
103
104
105
    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
106
    auto count = std::distance(mm->begin(), mm->end());
107
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
108
    EXPECT(std::distance(mm->begin(), mm->end()) == (count - 4));
109
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
110
111
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
112
113
}

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

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

TEST_CASE(duplicate_args2)
{
    migraphx::program p;
151
152
153
    auto* mm  = p.get_main_module();
    auto l0   = mm->add_literal(0);
    auto l3   = mm->add_literal(3);
154
155
156
    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
157
    auto count = std::distance(mm->begin(), mm->end());
158
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
159
160
    EXPECT(std::distance(mm->begin(), mm->end()) != count);
    EXPECT(std::distance(mm->begin(), mm->end()) == 2);
161
    auto result = p.eval({}).back();
162
163
164
165
166
167
    EXPECT(result == migraphx::literal{0});
}

TEST_CASE(duplicate_args3)
{
    migraphx::program p;
168
169
170
    auto* mm  = p.get_main_module();
    auto l0   = mm->add_literal(0);
    auto l3   = mm->add_literal(3);
171
172
173
174
    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
175
    auto count = std::distance(mm->begin(), mm->end());
176
    run_pass(p);
Shucai Xiao's avatar
Shucai Xiao committed
177
178
    EXPECT(std::distance(mm->begin(), mm->end()) != count);
    EXPECT(std::distance(mm->begin(), mm->end()) == 2);
179
    auto result = p.eval({}).back();
180
181
182
    EXPECT(result == migraphx::literal{0});
}

183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
TEST_CASE(reused_twice)
{
    migraphx::program p;
    auto* mm                 = p.get_main_module();
    std::vector<size_t> dims = {1, 2, 2};
    auto x        = mm->add_parameter("x", migraphx::shape{migraphx::shape::float_type, dims});
    auto y        = mm->add_parameter("y", migraphx::shape{migraphx::shape::float_type, dims});
    auto z        = mm->add_parameter("z", migraphx::shape{migraphx::shape::float_type, dims});
    auto add1     = mm->add_instruction(migraphx::make_op("add"), x, y);
    auto add2     = mm->add_instruction(migraphx::make_op("add"), add1, z);
    auto epsilon  = mm->add_literal(1e-12f);
    auto exponent = mm->add_literal(2.0f);

    auto mean = mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", {2}}}), add2);
    auto mean_mbcast =
        mm->add_instruction(migraphx::make_op("multibroadcast", {{"out_lens", dims}}), mean);
    auto sub = mm->add_instruction(migraphx::make_op("sub"), add2, mean_mbcast);
    auto exponent_mbcast =
        mm->add_instruction(migraphx::make_op("multibroadcast", {{"out_lens", dims}}), exponent);
    auto pow = mm->add_instruction(migraphx::make_op("pow"), sub, exponent_mbcast);
    auto var = mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", {2}}}), pow);
    auto epsilon_mbcast = mm->add_instruction(
        migraphx::make_op("multibroadcast", {{"out_lens", {1, dims.at(1), 1}}}), epsilon);
    auto add_epsilon = mm->add_instruction(migraphx::make_op("add"), var, epsilon_mbcast);
    mm->add_instruction(migraphx::make_op("sqrt"), add_epsilon);
    mm->add_instruction(migraphx::make_op("add"), x, y);

    auto count = std::distance(mm->begin(), mm->end());
    run_pass(p);
    p.debug_print();
    EXPECT(std::distance(mm->begin(), mm->end()) != count);
    EXPECT(std::distance(mm->begin(), mm->end()) == 4);
}

217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
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));
}

234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
TEST_CASE(param_not_eliminated)
{
    auto create_program = [] {
        migraphx::program p;
        auto* mm = p.get_main_module();
        migraphx::shape s{migraphx::shape::int32_type, {2, 2}};
        auto x = mm->add_parameter("x", s);
        auto y = mm->add_parameter("y", s);
        mm->add_parameter("z", s);
        auto sum = mm->add_instruction(migraphx::make_op("add"), x, y);
        mm->add_return({sum});

        return p;
    };

    auto p = create_program();
    run_pass(p);
    EXPECT(p == create_program());
}

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