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