eliminate_common_subexpression_test.cpp 4.67 KB
Newer Older
Paul's avatar
Paul committed
1
#include <migraphx/eliminate_common_subexpression.hpp>
2
#include <migraphx/pass_manager.hpp>
Paul's avatar
Paul committed
3
#include <migraphx/dead_code_elimination.hpp>
4
#include <migraphx/op/add.hpp>
Paul's avatar
Paul committed
5
6
7
#include <basic_ops.hpp>
#include <test.hpp>

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

Paul's avatar
Paul committed
14
TEST_CASE(cse_test1)
Paul's avatar
Paul committed
15
{
Paul's avatar
Paul committed
16
    migraphx::program p1;
Paul's avatar
Paul committed
17
    {
Paul's avatar
Paul committed
18
19
        auto one  = p1.add_literal(1);
        auto two  = p1.add_literal(2);
Paul's avatar
Paul committed
20
21
22
        auto sum1 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum3 = p1.add_instruction(migraphx::op::add{}, sum1, sum2);
Paul's avatar
Paul committed
23
24
        p1.add_instruction(pass_op{}, sum3);
    }
25
    run_pass(p1);
Paul's avatar
Paul committed
26

Paul's avatar
Paul committed
27
    migraphx::program p2;
Paul's avatar
Paul committed
28
    {
Paul's avatar
Paul committed
29
30
        auto one  = p2.add_literal(1);
        auto two  = p2.add_literal(2);
Paul's avatar
Paul committed
31
32
        auto sum1 = p2.add_instruction(migraphx::op::add{}, one, two);
        auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, sum1);
Paul's avatar
Paul committed
33
34
35
36
37
        p2.add_instruction(pass_op{}, sum3);
    }
    EXPECT(p1 == p2);
}

Paul's avatar
Paul committed
38
TEST_CASE(cse_test2)
Paul's avatar
Paul committed
39
{
Paul's avatar
Paul committed
40
    migraphx::program p1;
Paul's avatar
Paul committed
41
    {
Paul's avatar
Paul committed
42
43
        auto one  = p1.add_literal(1);
        auto two  = p1.add_literal(2);
Paul's avatar
Paul committed
44
45
46
        auto sum1 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p1.add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = p1.add_instruction(migraphx::op::add{}, sum1, sum2);
Paul's avatar
Paul committed
47
48
        p1.add_instruction(pass_op{}, sum3);
    }
49
    run_pass(p1);
Paul's avatar
Paul committed
50

Paul's avatar
Paul committed
51
    migraphx::program p2;
Paul's avatar
Paul committed
52
    {
Paul's avatar
Paul committed
53
54
        auto one  = p2.add_literal(1);
        auto two  = p2.add_literal(2);
Paul's avatar
Paul committed
55
56
57
        auto sum1 = p2.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p2.add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, sum2);
Paul's avatar
Paul committed
58
59
60
61
62
        p2.add_instruction(pass_op{}, sum3);
    }
    EXPECT(p1 == p2);
}

Paul's avatar
Paul committed
63
TEST_CASE(cse_test3)
Paul's avatar
Paul committed
64
{
Paul's avatar
Paul committed
65
    migraphx::program p1;
Paul's avatar
Paul committed
66
    {
Paul's avatar
Paul committed
67
68
        auto one  = p1.add_literal(1);
        auto two  = p1.add_literal(1);
Paul's avatar
Paul committed
69
70
71
        auto sum1 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p1.add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = p1.add_instruction(migraphx::op::add{}, sum1, sum2);
Paul's avatar
Paul committed
72
73
        p1.add_instruction(pass_op{}, sum3);
    }
74
    run_pass(p1);
Paul's avatar
Paul committed
75

Paul's avatar
Paul committed
76
    migraphx::program p2;
Paul's avatar
Paul committed
77
    {
Paul's avatar
Paul committed
78
        auto one  = p2.add_literal(1);
Paul's avatar
Paul committed
79
80
        auto sum1 = p2.add_instruction(migraphx::op::add{}, one, one);
        auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, sum1);
Paul's avatar
Paul committed
81
82
83
84
85
        p2.add_instruction(pass_op{}, sum3);
    }
    EXPECT(p1 == p2);
}

Paul's avatar
Paul committed
86
TEST_CASE(cse_test4)
Paul's avatar
Paul committed
87
{
Paul's avatar
Paul committed
88
    migraphx::program p1;
Paul's avatar
Paul committed
89
    {
Paul's avatar
Paul committed
90
91
        auto one  = p1.add_literal(1);
        auto two  = p1.add_literal(1);
Paul's avatar
Paul committed
92
93
94
95
96
        auto sum1 = p1.add_instruction(migraphx::op::add{}, one, two);
        auto sum2 = p1.add_instruction(migraphx::op::add{}, two, one);
        auto sum3 = p1.add_instruction(migraphx::op::add{}, sum1, one);
        auto sum4 = p1.add_instruction(migraphx::op::add{}, sum2, two);
        auto sum5 = p1.add_instruction(migraphx::op::add{}, sum4, sum3);
Paul's avatar
Paul committed
97
98
        p1.add_instruction(pass_op{}, sum5);
    }
99
    run_pass(p1);
Paul's avatar
Paul committed
100

Paul's avatar
Paul committed
101
    migraphx::program p2;
Paul's avatar
Paul committed
102
    {
Paul's avatar
Paul committed
103
        auto one  = p2.add_literal(1);
Paul's avatar
Paul committed
104
105
106
        auto sum1 = p2.add_instruction(migraphx::op::add{}, one, one);
        auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, one);
        auto sum5 = p2.add_instruction(migraphx::op::add{}, sum3, sum3);
Paul's avatar
Paul committed
107
108
109
110
111
        p2.add_instruction(pass_op{}, sum5);
    }
    EXPECT(p1 == p2);
}

kahmed10's avatar
kahmed10 committed
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
TEST_CASE(cse_test_literal)
{
    migraphx::program p1;
    {
        auto six1  = p1.add_literal(6);
        auto zero1 = p1.add_literal(0);
        auto six2  = p1.add_literal(6);
        auto zero2 = p1.add_literal(0);
        auto six3  = p1.add_literal(6);
        auto zero3 = p1.add_literal(0);

        auto sum1 = p1.add_instruction(migraphx::op::add{}, six1, zero1);
        auto sum2 = p1.add_instruction(migraphx::op::add{}, six2, zero2);
        auto sum3 = p1.add_instruction(migraphx::op::add{}, six3, zero3);
        auto sum4 = p1.add_instruction(migraphx::op::add{}, sum1, sum2);
        auto sum5 = p1.add_instruction(migraphx::op::add{}, sum3, sum4);
        p1.add_instruction(pass_op{}, sum5);
    }
    run_pass(p1);

    migraphx::program p2;
    {
        auto six  = p2.add_literal(6);
        auto zero = p2.add_literal(0);
        auto sum1 = p2.add_instruction(migraphx::op::add{}, six, zero);
        auto sum2 = p2.add_instruction(migraphx::op::add{}, sum1, sum1);
        auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, sum2);
        p2.add_instruction(pass_op{}, sum3);
    }
    EXPECT(p1 == p2);
}

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