"vscode:/vscode.git/clone" did not exist on "c0f818a07a6ee18105855aafa29e9d8178ed1733"
dead_code_elimination_test.cpp 5.8 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/op/undefined.hpp>
5
6
#include <migraphx/op/add.hpp>
#include <migraphx/op/identity.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(*p.get_main_module(), {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);
Paul's avatar
Paul committed
21
    auto count = std::distance(p.begin(), p.end());
22
    run_pass(p);
Paul's avatar
Paul committed
23
    EXPECT(std::distance(p.begin(), p.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);
37
    auto count = std::distance(p.begin(), p.end());
38
    run_pass(p);
39
    EXPECT(std::distance(p.begin(), p.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);
Paul's avatar
Paul committed
55
    EXPECT(std::distance(p.begin(), p.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);
Paul's avatar
Paul committed
69
    auto count = std::distance(p.begin(), p.end());
70
    run_pass(p);
Paul's avatar
Paul committed
71
    EXPECT(std::distance(p.begin(), p.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);
86
    auto count = std::distance(p.begin(), p.end());
87
    run_pass(p);
88
    EXPECT(std::distance(p.begin(), p.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);
Paul's avatar
Paul committed
105
    auto count = std::distance(p.begin(), p.end());
106
    run_pass(p);
Paul's avatar
Paul committed
107
    EXPECT(std::distance(p.begin(), p.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
119
120
    auto* mm   = p.get_main_module();
    auto one   = mm->add_literal(1);
    auto two   = mm->add_literal(2);
    auto undef = mm->add_instruction(migraphx::op::undefined{});
    mm->add_instruction(sum_op{}, one, two);
Paul's avatar
Paul committed
121
    auto count = std::distance(p.begin(), p.end());
122
    run_pass(p);
Paul's avatar
Paul committed
123
    EXPECT(std::distance(p.begin(), p.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
136
137
    auto* mm = p.get_main_module();
    auto l0  = mm->add_literal(0);
    auto l3  = mm->add_literal(3);
    mm->add_instruction(migraphx::op::add{}, l3, l3);
    mm->add_instruction(migraphx::op::identity{}, l0);
138
    auto count = std::distance(p.begin(), p.end());
139
    run_pass(p);
140
141
    EXPECT(std::distance(p.begin(), p.end()) != count);
    EXPECT(std::distance(p.begin(), p.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
152
153
154
    auto* mm  = p.get_main_module();
    auto l0   = mm->add_literal(0);
    auto l3   = mm->add_literal(3);
    auto sum1 = mm->add_instruction(migraphx::op::add{}, l0, l3);
    mm->add_instruction(migraphx::op::add{}, sum1, l3);
    mm->add_instruction(migraphx::op::identity{}, l0);
155
    auto count = std::distance(p.begin(), p.end());
156
    run_pass(p);
157
158
    EXPECT(std::distance(p.begin(), p.end()) != count);
    EXPECT(std::distance(p.begin(), p.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
169
170
171
172
    auto* mm  = p.get_main_module();
    auto l0   = mm->add_literal(0);
    auto l3   = mm->add_literal(3);
    auto sum1 = mm->add_instruction(migraphx::op::add{}, l0, l3);
    auto sum2 = mm->add_instruction(migraphx::op::add{}, l0, sum1);
    mm->add_instruction(migraphx::op::add{}, sum2, l3);
    mm->add_instruction(migraphx::op::identity{}, l0);
173
    auto count = std::distance(p.begin(), p.end());
174
    run_pass(p);
175
176
    EXPECT(std::distance(p.begin(), p.end()) != count);
    EXPECT(std::distance(p.begin(), p.end()) == 2);
177
    auto result = p.eval({}).back();
178
179
180
    EXPECT(result == migraphx::literal{0});
}

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