1 #include "../sfn_shader.h"
2 #include "../sfn_liverangeevaluator.h"
3 #include "sfn_test_shaders.h"
4
5 #include "gtest/gtest.h"
6 #include <sstream>
7
8 #include "../sfn_liverangeevaluator.h"
9
10 namespace r600 {
11
12 using std::ostringstream;
13
14 class LiveRangeTests : public TestShader {
15
16 protected:
17
18 void check(const char *shader, LiveRangeMap& expect);
19
20 };
21
22 using SimpleTest = testing::Test;
23
TEST_F(SimpleTest,SimpleLiveRangeMapTest)24 TEST_F(SimpleTest, SimpleLiveRangeMapTest)
25 {
26 LiveRangeMap a;
27 LiveRangeMap b;
28
29 EXPECT_EQ(a, b);
30
31 Register r1x(1, 0, pin_none);
32 a.append_register(&r1x);
33 r1x.set_index(0);
34 a.set_life_range(r1x, 0, 1);
35
36 EXPECT_NE(a, b);
37
38 b.append_register(&r1x);
39 b.set_life_range(r1x, 0, 1);
40 EXPECT_EQ(a, b);
41
42 Register r2x(2, 0, pin_none);
43 a.append_register(&r2x);
44 r2x.set_index(0);
45 a.set_life_range(r2x, 0, 2);
46
47 EXPECT_NE(a, b);
48
49 b.append_register(&r2x);
50 b.set_life_range(r2x, 0, 2);
51 EXPECT_EQ(a, b);
52
53 a.set_life_range(r2x, 1, 2);
54 EXPECT_NE(a, b);
55
56 b.set_life_range(r2x, 1, 2);
57 EXPECT_EQ(a, b);
58
59 a.set_life_range(r2x, 0, 1);
60 EXPECT_NE(a, b);
61 }
62
TEST_F(LiveRangeTests,SimpleAssignments)63 TEST_F(LiveRangeTests, SimpleAssignments)
64 {
65 RegisterVec4::Swizzle dummy;
66
67 ValueFactory vf;
68
69 Register *r1x = vf.dest_from_string("S1.x@free");
70 RegisterVec4 r0 = vf.dest_vec4_from_string("S0.xyzw", dummy, pin_group);
71
72 LiveRangeMap expect = vf.prepare_live_range_map();
73
74
75 expect.set_life_range(*r1x, 2, 3);
76 for (int i = 0; i < 4; ++i)
77 expect.set_life_range(*r0[i], 1, 3);
78
79 check(red_triangle_fs_expect_from_nir, expect);
80 }
81
TEST_F(LiveRangeTests,SimpleAdd)82 TEST_F(LiveRangeTests, SimpleAdd)
83 {
84 RegisterVec4::Swizzle dummy;
85
86 ValueFactory vf;
87 Register *r0x = vf.dest_from_string("S0.x@free");
88 Register *r1x = vf.dest_from_string("S1.x@free");
89 RegisterVec4 r2 = vf.dest_vec4_from_string("S2.xyzw", dummy, pin_none);
90 Register *r3x = vf.dest_from_string("S3.x@free");
91 RegisterVec4 r4 = vf.dest_vec4_from_string("S4.xyzw", dummy, pin_group);
92
93 LiveRangeMap expect = vf.prepare_live_range_map();
94
95 expect.set_life_range(*r0x, 1, 4);
96 expect.set_life_range(*r1x, 2, 3);
97 expect.set_life_range(*r3x, 4, 5);
98
99 expect.set_life_range(*r2[0], 3, 4);
100 for (int i = 1; i < 4; ++i)
101 expect.set_life_range(*r2[i], 3, 5);
102
103 for (int i = 0; i < 4; ++i)
104 expect.set_life_range(*r4[i], 5, 6);
105
106 check(add_add_1_expect_from_nir, expect);
107 }
108
TEST_F(LiveRangeTests,SimpleAInterpolation)109 TEST_F(LiveRangeTests, SimpleAInterpolation)
110 {
111 RegisterVec4::Swizzle dummy;
112
113 ValueFactory vf;
114 Register *r0x = vf.dest_from_string("R0.x@fully");
115 r0x->pin_live_range(true, false);
116 Register *r0y = vf.dest_from_string("R0.y@fully");
117 r0y->pin_live_range(true, false);
118
119 Register *r1x = vf.dest_from_string("S1.x@free");
120 RegisterVec4 r2 = vf.dest_vec4_from_string("S2.xyzw", dummy, pin_chan);
121
122 Register *r3x = vf.dest_from_string("S3.x");
123 Register *r3y = vf.dest_from_string("S3.y");
124 Register *r3z = vf.dest_from_string("S3.z");
125
126 Register *r4x = vf.dest_from_string("S4.x");
127 Register *r4y = vf.dest_from_string("S4.y");
128
129 RegisterVec4 r5 = vf.dest_vec4_from_string("S5.xy_w", dummy, pin_group);
130 RegisterVec4 r6 = vf.dest_vec4_from_string("S6.xyzw", dummy, pin_group);
131
132 LiveRangeMap expect = vf.prepare_live_range_map();
133
134 expect.set_life_range(*r0x, 0, 3);
135 expect.set_life_range(*r0y, 0, 3);
136
137 expect.set_life_range(*r1x, 1, 2);
138
139 expect.set_life_range(*r2[0], 3, 4);
140 expect.set_life_range(*r2[1], 3, 4);
141 expect.set_life_range(*r2[2], 2, 3);
142 expect.set_life_range(*r2[3], 2, 4);
143
144 expect.set_life_range(*r3x, 4, 5);
145 expect.set_life_range(*r3y, 4, 5);
146 expect.set_life_range(*r3z, 4, 6);
147
148 expect.set_life_range(*r4x, 5, 6);
149 expect.set_life_range(*r4y, 5, 6);
150
151 expect.set_life_range(*r5[0], 6, 7);
152 expect.set_life_range(*r5[1], 6, 7);
153 expect.set_life_range(*r5[3], 6, 7);
154
155
156 expect.set_life_range(*r6[0], 7, 8);
157 expect.set_life_range(*r6[1], 7, 8);
158 expect.set_life_range(*r6[2], 7, 8);
159 expect.set_life_range(*r6[3], 7, 8);
160
161 check(basic_interpolation_translated_1, expect);
162 }
163
TEST_F(LiveRangeTests,SimpleArrayAccess)164 TEST_F(LiveRangeTests, SimpleArrayAccess)
165 {
166 RegisterVec4::Swizzle dummy;
167
168 ValueFactory vf;
169
170 auto array = vf.array_from_string("A0[2].xy");
171
172 auto s1 = vf.dest_from_string("S1.x");
173 auto s2x = vf.dest_from_string("S2.x");
174 auto s2y = vf.dest_from_string("S2.y");
175
176 auto s3 = vf.dest_vec4_from_string("S3.xy01", dummy, pin_group);
177
178
179 LiveRangeMap expect = vf.prepare_live_range_map();
180
181 expect.set_life_range(*array->element(0, nullptr, 0), 0, 4);
182 expect.set_life_range(*array->element(0, nullptr, 1), 0, 4);
183 expect.set_life_range(*array->element(1, nullptr, 0), 0, 4);
184
185 expect.set_life_range(*array->element(1, nullptr, 1), 0, 4);
186
187 expect.set_life_range(*s1, 2, 3);
188
189 expect.set_life_range(*s2x, 4, 5);
190 expect.set_life_range(*s2y, 4, 5);
191
192 expect.set_life_range(*s3[0], 5, 6);
193 expect.set_life_range(*s3[1], 5, 6);
194
195 check(shader_with_dest_array2_scheduled, expect);
196 }
197
check(const char * shader,LiveRangeMap & expect)198 void LiveRangeTests::check(const char *shader, LiveRangeMap& expect)
199 {
200 auto sh = from_string(shader);
201 ASSERT_TRUE(sh);
202
203 LiveRangeEvaluator eval;
204
205 LiveRangeMap eval_map = eval.run(*sh);
206
207 ostringstream eval_str;
208 eval_str << eval_map;
209
210 ostringstream expect_str;
211 expect_str << expect;
212
213 EXPECT_EQ(eval_str.str(), expect_str.str());
214
215 }
216
217 }
218