dead_code_elimination_test.cpp 5.34 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
5
6
#include <migraphx/op/abnormal_ops.hpp>
#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
12
    migraphx::run_passes(p, {migraphx::dead_code_elimination{}});
}
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;
Paul's avatar
Paul committed
17
18
19
20
21

    auto one = p.add_literal(1);
    auto two = p.add_literal(2);
    p.add_instruction(sum_op{}, one, two);
    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
37

    auto one = p.add_literal(1);
    auto two = p.add_literal(2);
    p.add_instruction(nop{});
    p.add_instruction(sum_op{}, one, two);
    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;
Paul's avatar
Paul committed
48
49
50
51
52
53

    auto one = p.add_literal(1);
    auto two = p.add_literal(2);
    p.add_instruction(nop{});
    p.add_instruction(sum_op{}, one, two);
    p.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;
Paul's avatar
Paul committed
64
65
66
67
68
69

    auto one = p.add_literal(1);
    auto two = p.add_literal(2);
    p.add_instruction(sum_op{}, one, two);
    p.add_instruction(sum_op{}, one, two);
    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
86

    auto one = p.add_literal(1);
    auto two = p.add_literal(2);
    p.add_instruction(sum_op{}, one, two);
    p.add_instruction(minus_op{}, one, two);
    p.add_instruction(sum_op{}, one, two);
    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;
Paul's avatar
Paul committed
97
98
99

    auto one = p.add_literal(1);
    auto two = p.add_literal(2);
Paul's avatar
Paul committed
100
101
    auto x1  = p.add_instruction(sum_op{}, one, two);
    auto x2  = p.add_instruction(sum_op{}, one, two);
Paul's avatar
Paul committed
102
103
104
105
    p.add_instruction(minus_op{}, x1, x2);
    p.add_instruction(minus_op{}, x1, x2);
    p.add_instruction(sum_op{}, one, two);
    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
116
TEST_CASE(undefined_test)
{
    migraphx::program p;

Paul's avatar
Paul committed
117
118
    auto one   = p.add_literal(1);
    auto two   = p.add_literal(2);
Paul's avatar
Paul committed
119
120
121
    auto undef = p.add_instruction(migraphx::op::undefined{});
    p.add_instruction(sum_op{}, one, two);
    auto count = std::distance(p.begin(), p.end());
122
    run_pass(p);
Paul's avatar
Paul committed
123
124
    EXPECT(std::distance(p.begin(), p.end()) == count - 1);
    EXPECT(not p.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
133
134
135
136
137
138
TEST_CASE(duplicate_args1)
{
    migraphx::program p;

    auto l0 = p.add_literal(0);
    auto l3 = p.add_literal(3);
    p.add_instruction(migraphx::op::add{}, l3, l3);
    p.add_instruction(migraphx::op::identity{}, l0);
    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
149
    EXPECT(result == migraphx::literal{0});
}

TEST_CASE(duplicate_args2)
{
    migraphx::program p;

Paul's avatar
Paul committed
150
151
    auto l0   = p.add_literal(0);
    auto l3   = p.add_literal(3);
152
153
154
155
    auto sum1 = p.add_instruction(migraphx::op::add{}, l0, l3);
    p.add_instruction(migraphx::op::add{}, sum1, l3);
    p.add_instruction(migraphx::op::identity{}, l0);
    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
166
    EXPECT(result == migraphx::literal{0});
}

TEST_CASE(duplicate_args3)
{
    migraphx::program p;

Paul's avatar
Paul committed
167
168
    auto l0   = p.add_literal(0);
    auto l3   = p.add_literal(3);
169
170
171
172
173
    auto sum1 = p.add_instruction(migraphx::op::add{}, l0, l3);
    auto sum2 = p.add_instruction(migraphx::op::add{}, l0, sum1);
    p.add_instruction(migraphx::op::add{}, sum2, l3);
    p.add_instruction(migraphx::op::identity{}, l0);
    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); }