• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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