@@ -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