Skip to content

Commit 0f4584c

Browse files
committed
add template matrix tests in ast and codegen
1 parent 97bd5ee commit 0f4584c

File tree

3 files changed

+101
-0
lines changed

3 files changed

+101
-0
lines changed

clang/test/AST/HLSL/matrix-single-subscript-getter.hlsl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,15 @@ export int4 AddIntMatrixConstant(int4x4 M) {
7575
// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3
7676
return M[0] + M[1] + M[2] + M[3];
7777
}
78+
79+
export vector<bool, 3> getBoolVecFromTemplateMat(matrix<bool, 2, 3> M) {
80+
// CHECK: FunctionDecl {{.*}} used getBoolVecFromTemplateMat 'vector<bool, 3> (matrix<bool, 2, 3>)'
81+
// CHECK-NEXT: ParmVarDecl {{.*}} used M 'matrix<bool, 2, 3>'
82+
// CHECK-NEXT: CompoundStmt {{.*}}
83+
// CHECK-NEXT: ReturnStmt {{.*}}
84+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector<bool, 3>' <LValueToRValue>
85+
// CHECK-NEXT: MatrixSingleSubscriptExpr {{.*}} 'vector<bool, 3>' lvalue matrixcomponent
86+
// CHECK-NEXT: DeclRefExpr {{.*}} 'matrix<bool, 2, 3>' lvalue ParmVar {{.*}} 'M' 'matrix<bool, 2, 3>'
87+
// CHECK-NEXT: IntegerLiteral {{.*}}'int' 0
88+
return M[0];
89+
}

clang/test/CodeGenHLSL/BasicFeatures/MatrixSingleSubscriptGetter.hlsl

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,45 @@ float4 AddFloatMatrixConstant(float4x4 M) {
203203
int4 AddIntMatrixConstant(int4x4 M) {
204204
return M[0] + M[1] + M[2] + M[3];
205205
}
206+
207+
// CHECK-LABEL: define hidden noundef nofpclass(nan inf) <3 x double> @_Z27getDoubleVecFromTemplateMatu11matrix_typeILm2ELm3EdEi(
208+
// CHECK-SAME: <6 x double> noundef nofpclass(nan inf) [[M:%.*]], i32 noundef [[INDEX:%.*]]) #[[ATTR0]] {
209+
// CHECK-NEXT: [[ENTRY:.*:]]
210+
// CHECK-NEXT: [[M_ADDR:%.*]] = alloca [6 x double], align 8
211+
// CHECK-NEXT: [[INDEX_ADDR:%.*]] = alloca i32, align 4
212+
// CHECK-NEXT: store <6 x double> [[M]], ptr [[M_ADDR]], align 8
213+
// CHECK-NEXT: store i32 [[INDEX]], ptr [[INDEX_ADDR]], align 4
214+
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[INDEX_ADDR]], align 4
215+
// CHECK-NEXT: [[TMP1:%.*]] = load <6 x double>, ptr [[M_ADDR]], align 8
216+
// CHECK-NEXT: [[TMP2:%.*]] = add i32 0, [[TMP0]]
217+
// CHECK-NEXT: [[MATRIX_ELEM:%.*]] = extractelement <6 x double> [[TMP1]], i32 [[TMP2]]
218+
// CHECK-NEXT: [[MATRIX_ROW_INS:%.*]] = insertelement <3 x double> poison, double [[MATRIX_ELEM]], i32 0
219+
// CHECK-NEXT: [[TMP3:%.*]] = add i32 2, [[TMP0]]
220+
// CHECK-NEXT: [[MATRIX_ELEM1:%.*]] = extractelement <6 x double> [[TMP1]], i32 [[TMP3]]
221+
// CHECK-NEXT: [[MATRIX_ROW_INS2:%.*]] = insertelement <3 x double> [[MATRIX_ROW_INS]], double [[MATRIX_ELEM1]], i32 1
222+
// CHECK-NEXT: [[TMP4:%.*]] = add i32 4, [[TMP0]]
223+
// CHECK-NEXT: [[MATRIX_ELEM3:%.*]] = extractelement <6 x double> [[TMP1]], i32 [[TMP4]]
224+
// CHECK-NEXT: [[MATRIX_ROW_INS4:%.*]] = insertelement <3 x double> [[MATRIX_ROW_INS2]], double [[MATRIX_ELEM3]], i32 2
225+
// CHECK-NEXT: ret <3 x double> [[MATRIX_ROW_INS4]]
226+
//
227+
double3 getDoubleVecFromTemplateMat(matrix<double, 2, 3> M, int index) {
228+
return M[index];
229+
}
230+
231+
// CHECK-LABEL: define hidden noundef nofpclass(nan inf) <3 x double> @_Z31getDoubleVecFromTemplateMatRow0u11matrix_typeILm2ELm3EdE(
232+
// CHECK-SAME: <6 x double> noundef nofpclass(nan inf) [[M:%.*]]) #[[ATTR0]] {
233+
// CHECK-NEXT: [[ENTRY:.*:]]
234+
// CHECK-NEXT: [[M_ADDR:%.*]] = alloca [6 x double], align 8
235+
// CHECK-NEXT: store <6 x double> [[M]], ptr [[M_ADDR]], align 8
236+
// CHECK-NEXT: [[TMP0:%.*]] = load <6 x double>, ptr [[M_ADDR]], align 8
237+
// CHECK-NEXT: [[MATRIX_ELEM:%.*]] = extractelement <6 x double> [[TMP0]], i32 0
238+
// CHECK-NEXT: [[MATRIX_ROW_INS:%.*]] = insertelement <3 x double> poison, double [[MATRIX_ELEM]], i32 0
239+
// CHECK-NEXT: [[MATRIX_ELEM1:%.*]] = extractelement <6 x double> [[TMP0]], i32 2
240+
// CHECK-NEXT: [[MATRIX_ROW_INS2:%.*]] = insertelement <3 x double> [[MATRIX_ROW_INS]], double [[MATRIX_ELEM1]], i32 1
241+
// CHECK-NEXT: [[MATRIX_ELEM3:%.*]] = extractelement <6 x double> [[TMP0]], i32 4
242+
// CHECK-NEXT: [[MATRIX_ROW_INS4:%.*]] = insertelement <3 x double> [[MATRIX_ROW_INS2]], double [[MATRIX_ELEM3]], i32 2
243+
// CHECK-NEXT: ret <3 x double> [[MATRIX_ROW_INS4]]
244+
//
245+
double3 getDoubleVecFromTemplateMatRow0(matrix<double, 2, 3> M) {
246+
return M[0];
247+
}

clang/test/CodeGenHLSL/BasicFeatures/MatrixSingleSubscriptSetter.hlsl

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,54 @@ void setMatrixConstIndex(out int4x4 M, int4x4 N ) {
120120
M[2] = N[1];
121121
M[3] = N[0];
122122
}
123+
124+
// CHECK-LABEL: define hidden void @_Z27getDoubleVecFromTemplateMatRu11matrix_typeILm2ELm3EdEiDv3_d(
125+
// CHECK-SAME: ptr noalias noundef nonnull align 8 dereferenceable(48) [[M:%.*]], i32 noundef [[INDEX:%.*]], <3 x double> noundef nofpclass(nan inf) [[V:%.*]]) #[[ATTR0]] {
126+
// CHECK-NEXT: [[ENTRY:.*:]]
127+
// CHECK-NEXT: [[M_ADDR:%.*]] = alloca ptr, align 4
128+
// CHECK-NEXT: [[INDEX_ADDR:%.*]] = alloca i32, align 4
129+
// CHECK-NEXT: [[V_ADDR:%.*]] = alloca <3 x double>, align 32
130+
// CHECK-NEXT: store ptr [[M]], ptr [[M_ADDR]], align 4
131+
// CHECK-NEXT: store i32 [[INDEX]], ptr [[INDEX_ADDR]], align 4
132+
// CHECK-NEXT: store <3 x double> [[V]], ptr [[V_ADDR]], align 32
133+
// CHECK-NEXT: [[TMP0:%.*]] = load <3 x double>, ptr [[V_ADDR]], align 32
134+
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[M_ADDR]], align 4, !nonnull [[META3]], !align [[META5:![0-9]+]]
135+
// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[INDEX_ADDR]], align 4
136+
// CHECK-NEXT: [[MATRIX_LOAD:%.*]] = load <6 x double>, ptr [[TMP1]], align 8
137+
// CHECK-NEXT: [[TMP3:%.*]] = add i32 0, [[TMP2]]
138+
// CHECK-NEXT: [[TMP4:%.*]] = extractelement <3 x double> [[TMP0]], i32 0
139+
// CHECK-NEXT: [[TMP5:%.*]] = insertelement <6 x double> [[MATRIX_LOAD]], double [[TMP4]], i32 [[TMP3]]
140+
// CHECK-NEXT: [[TMP6:%.*]] = add i32 2, [[TMP2]]
141+
// CHECK-NEXT: [[TMP7:%.*]] = extractelement <3 x double> [[TMP0]], i32 1
142+
// CHECK-NEXT: [[TMP8:%.*]] = insertelement <6 x double> [[TMP5]], double [[TMP7]], i32 [[TMP6]]
143+
// CHECK-NEXT: [[TMP9:%.*]] = add i32 4, [[TMP2]]
144+
// CHECK-NEXT: [[TMP10:%.*]] = extractelement <3 x double> [[TMP0]], i32 2
145+
// CHECK-NEXT: [[TMP11:%.*]] = insertelement <6 x double> [[TMP8]], double [[TMP10]], i32 [[TMP9]]
146+
// CHECK-NEXT: store <6 x double> [[TMP11]], ptr [[TMP1]], align 8
147+
// CHECK-NEXT: ret void
148+
//
149+
void getDoubleVecFromTemplateMat(out matrix<double, 2, 3> M, int index, double3 V) {
150+
M[index] = V;
151+
}
152+
153+
// CHECK-LABEL: define hidden void @_Z27getDoubleVecFromTemplateMatRu11matrix_typeILm2ELm3EdEDv3_d(
154+
// CHECK-SAME: ptr noalias noundef nonnull align 8 dereferenceable(48) [[M:%.*]], <3 x double> noundef nofpclass(nan inf) [[V:%.*]]) #[[ATTR0]] {
155+
// CHECK-NEXT: [[ENTRY:.*:]]
156+
// CHECK-NEXT: [[M_ADDR:%.*]] = alloca ptr, align 4
157+
// CHECK-NEXT: [[V_ADDR:%.*]] = alloca <3 x double>, align 32
158+
// CHECK-NEXT: store ptr [[M]], ptr [[M_ADDR]], align 4
159+
// CHECK-NEXT: store <3 x double> [[V]], ptr [[V_ADDR]], align 32
160+
// CHECK-NEXT: [[TMP0:%.*]] = load <3 x double>, ptr [[V_ADDR]], align 32
161+
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[M_ADDR]], align 4, !nonnull [[META3]], !align [[META5]]
162+
// CHECK-NEXT: store <3 x double> [[TMP0]], ptr [[TMP1]], align 8
163+
// CHECK-NEXT: ret void
164+
//
165+
void getDoubleVecFromTemplateMat(out matrix<double, 2, 3> M, double3 V) {
166+
M[0] = V;
167+
}
168+
123169
//.
124170
// CHECK: [[META3]] = !{}
125171
// CHECK: [[META4]] = !{i64 4}
172+
// CHECK: [[META5]] = !{i64 8}
126173
//.

0 commit comments

Comments
 (0)