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