dead_code_elimination_test.cpp 5.42 KB
Newer Older
Paul's avatar
Paul committed
1
#include <migraphx/dead_code_elimination.hpp>
Paul's avatar
Paul committed
2
#include <basic_ops.hpp>
Paul's avatar
Paul committed
3
#include <migraphx/operators.hpp>
Paul's avatar
Paul committed
4
5
6
7
8
#include <test.hpp>

struct dce_target
{
    std::string name() const { return "dce"; }
Paul's avatar
Paul committed
9
    std::vector<migraphx::pass> get_passes(migraphx::context&) const
Paul's avatar
Paul committed
10
    {
Paul's avatar
Paul committed
11
        return {migraphx::dead_code_elimination{}};
Paul's avatar
Paul committed
12
    }
Paul's avatar
Paul committed
13
    migraphx::context get_context() const { return {}; }
Paul's avatar
Paul committed
14
15
};

Paul's avatar
Paul committed
16
TEST_CASE(simple_test)
Paul's avatar
Paul committed
17
{
Paul's avatar
Paul committed
18
    migraphx::program p;
Paul's avatar
Paul committed
19
20
21
22
23
24
25
26

    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());
    p.compile(dce_target{});
    EXPECT(std::distance(p.begin(), p.end()) == count);
    auto result = p.eval({});
Paul's avatar
Paul committed
27
28
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
29
30
}

Paul's avatar
Paul committed
31
TEST_CASE(simple_test_nop)
32
{
Paul's avatar
Paul committed
33
    migraphx::program p;
34
35
36
37
38
39
40
41
42

    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());
    p.compile(dce_target{});
    EXPECT(std::distance(p.begin(), p.end()) == count);
    auto result = p.eval({});
Paul's avatar
Paul committed
43
44
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
45
46
}

Paul's avatar
Paul committed
47
TEST_CASE(simple_test_nop2)
Paul's avatar
Paul committed
48
{
Paul's avatar
Paul committed
49
    migraphx::program p;
Paul's avatar
Paul committed
50
51
52
53
54
55
56
57
58

    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{});
    p.compile(dce_target{});
    EXPECT(std::distance(p.begin(), p.end()) == 2);
    auto result = p.eval({});
Paul's avatar
Paul committed
59
60
    EXPECT(result == migraphx::literal{});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
61
62
}

Paul's avatar
Paul committed
63
TEST_CASE(duplicate_test1)
Paul's avatar
Paul committed
64
{
Paul's avatar
Paul committed
65
    migraphx::program p;
Paul's avatar
Paul committed
66
67
68
69
70
71
72

    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());
    p.compile(dce_target{});
Paul's avatar
Paul committed
73
    EXPECT(std::distance(p.begin(), p.end()) == (count - 1));
Paul's avatar
Paul committed
74
    auto result = p.eval({});
Paul's avatar
Paul committed
75
76
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
77
78
}

Paul's avatar
Paul committed
79
TEST_CASE(duplicate_test2)
80
{
Paul's avatar
Paul committed
81
    migraphx::program p;
82
83
84
85
86
87
88
89
90
91

    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());
    p.compile(dce_target{});
    EXPECT(std::distance(p.begin(), p.end()) == (count - 2));
    auto result = p.eval({});
Paul's avatar
Paul committed
92
93
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
94
95
}

Paul's avatar
Paul committed
96
TEST_CASE(depth_test)
Paul's avatar
Paul committed
97
{
Paul's avatar
Paul committed
98
    migraphx::program p;
Paul's avatar
Paul committed
99
100
101

    auto one = p.add_literal(1);
    auto two = p.add_literal(2);
Paul's avatar
Paul committed
102
103
    auto x1  = p.add_instruction(sum_op{}, one, two);
    auto x2  = p.add_instruction(sum_op{}, one, two);
Paul's avatar
Paul committed
104
105
106
107
108
109
110
    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());
    p.compile(dce_target{});
    EXPECT(std::distance(p.begin(), p.end()) == (count - 4));
    auto result = p.eval({});
Paul's avatar
Paul committed
111
112
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
Paul's avatar
Paul committed
113
114
}

Paul's avatar
Paul committed
115
116
117
118
TEST_CASE(undefined_test)
{
    migraphx::program p;

Paul's avatar
Paul committed
119
120
    auto one   = p.add_literal(1);
    auto two   = p.add_literal(2);
Paul's avatar
Paul committed
121
122
123
124
125
126
127
128
129
130
131
    auto undef = p.add_instruction(migraphx::op::undefined{});
    p.add_instruction(sum_op{}, one, two);
    auto count = std::distance(p.begin(), p.end());
    p.compile(dce_target{});
    EXPECT(std::distance(p.begin(), p.end()) == count - 1);
    EXPECT(not p.has_instruction(undef));
    auto result = p.eval({});
    EXPECT(result == migraphx::literal{3});
    EXPECT(result != migraphx::literal{4});
}

132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
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());
    p.compile(dce_target{});
    EXPECT(std::distance(p.begin(), p.end()) != count);
    EXPECT(std::distance(p.begin(), p.end()) == 2);
    auto result = p.eval({});
    EXPECT(result == migraphx::literal{0});
}

TEST_CASE(duplicate_args2)
{
    migraphx::program p;

    auto l0 = p.add_literal(0);
    auto l3 = p.add_literal(3);
    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());
    p.compile(dce_target{});
    EXPECT(std::distance(p.begin(), p.end()) != count);
    EXPECT(std::distance(p.begin(), p.end()) == 2);
    auto result = p.eval({});
    EXPECT(result == migraphx::literal{0});
}

TEST_CASE(duplicate_args3)
{
    migraphx::program p;

    auto l0 = p.add_literal(0);
    auto l3 = p.add_literal(3);
    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());
    p.compile(dce_target{});
    EXPECT(std::distance(p.begin(), p.end()) != count);
    EXPECT(std::distance(p.begin(), p.end()) == 2);
    auto result = p.eval({});
    EXPECT(result == migraphx::literal{0});
}

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