From eead25c8a7aecca9b825701d5b446a0816994128 Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Mon, 3 Nov 2025 19:58:22 -0500 Subject: [PATCH 1/4] [HLSL] Layout Initalizer list in Column order via index conversion fixes #165663 The bug was that we were using the initalizer lists index to populate the matrix. This meant that [0..n] would coorelate to [0..n] indicies of the flattened matrix. Hence why we were seeing the Row-major order: [ 0 1 2 3 4 5 ]. To fix this we can simply converted these indicies to the Column-major order: [ 0 3 1 4 2 5 ]. The net effect of this is the layout of the matrix is now correct and we don't need to change the MatrixSubscriptExpr indexing scheme. --- clang/lib/Sema/SemaInit.cpp | 27 +++--- clang/test/AST/HLSL/matrix-constructors.hlsl | 91 +++++++++--------- .../AST/HLSL/matrix-general-initializer.hlsl | 86 ++++++++--------- .../BasicFeatures/MatrixConstructor.hlsl | 93 +++++++++++++++++++ 4 files changed, 196 insertions(+), 101 deletions(-) create mode 100644 clang/test/CodeGenHLSL/BasicFeatures/MatrixConstructor.hlsl diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 073010d16b428..2dcbd61ca13b6 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1897,26 +1897,29 @@ void InitListChecker::CheckMatrixType(const InitializedEntity &Entity, return; const ConstantMatrixType *MT = DeclType->castAs(); + + // For HLSL The error for this case is handled in SemaHLSL's initializer + // list diagnostics, That means the execution should require + // getNumElementsFlattened to equal getNumInits. In other words execution + // should never reach this point if this condition is not true". + assert(IList->getNumInits() == MT->getNumElementsFlattened() && + "Inits must equal Matrix element count"); + QualType ElemTy = MT->getElementType(); - const unsigned MaxElts = MT->getNumElementsFlattened(); - unsigned NumEltsInit = 0; + Index = 0; InitializedEntity ElemEnt = InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); - while (NumEltsInit < MaxElts && Index < IList->getNumInits()) { + while (Index < IList->getNumInits()) { // Not a sublist: just consume directly. - ElemEnt.setElementIndex(Index); - CheckSubElementType(ElemEnt, IList, ElemTy, Index, StructuredList, + unsigned ColMajorIndex = (Index % MT->getNumRows()) * MT->getNumColumns() + + (Index / MT->getNumRows()); + ElemEnt.setElementIndex(ColMajorIndex); + CheckSubElementType(ElemEnt, IList, ElemTy, ColMajorIndex, StructuredList, StructuredIndex); - ++NumEltsInit; + ++Index; } - - // For HLSL The error for this case is handled in SemaHLSL's initializer - // list diagnostics, That means the execution should require NumEltsInit - // to equal Max initializers. In other words execution should never - // reach this point if this condition is not true". - assert(NumEltsInit == MaxElts && "NumEltsInit must equal MaxElts"); } void InitListChecker::CheckVectorType(const InitializedEntity &Entity, diff --git a/clang/test/AST/HLSL/matrix-constructors.hlsl b/clang/test/AST/HLSL/matrix-constructors.hlsl index 0a2f03c7c0fac..e1a9c53e2c602 100644 --- a/clang/test/AST/HLSL/matrix-constructors.hlsl +++ b/clang/test/AST/HLSL/matrix-constructors.hlsl @@ -9,21 +9,20 @@ typedef float float4 __attribute__((ext_vector_type(4))); [numthreads(1,1,1)] void ok() { - // CHECK: VarDecl 0x{{[0-9a-fA-F]+}} col:{{[0-9]+}} A 'float2x3':'matrix' cinit // CHECK-NEXT: CXXFunctionalCastExpr 0x{{[0-9a-fA-F]+}} 'float2x3':'matrix' functional cast to float2x3 // CHECK-NEXT: InitListExpr 0x{{[0-9a-fA-F]+}} 'float2x3':'matrix' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 5 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 6 float2x3 A = float2x3(1,2,3,4,5,6); @@ -57,6 +56,8 @@ void ok() { // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 0 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' xvalue vectorcomponent // CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' xvalue @@ -68,12 +69,10 @@ void ok() { // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 5 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 6 float2x3 D = float2x3(float2(1,2), 3, 4, 5, 6); @@ -97,9 +96,9 @@ void ok() { // CHECK-NEXT: CXXFunctionalCastExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' functional cast to float2 // CHECK-NEXT: InitListExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' xvalue vectorcomponent @@ -107,10 +106,12 @@ void ok() { // CHECK-NEXT: CXXFunctionalCastExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' functional cast to float2 // CHECK-NEXT: InitListExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 5 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' xvalue vectorcomponent // CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' xvalue @@ -120,9 +121,7 @@ void ok() { // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 5 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 6 float2x3 E = float2x3(float2(1,2), float2(3,4), 5, 6); @@ -158,7 +157,7 @@ void ok() { // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' xvalue vectorcomponent // CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'float4':'vector' xvalue @@ -172,7 +171,9 @@ void ok() { // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 2 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 5 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' xvalue vectorcomponent // CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'float4':'vector' xvalue @@ -186,9 +187,7 @@ void ok() { // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 3 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 5 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 2 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 6 float2x3 F = float2x3(float4(1,2,3,4), 5, 6); @@ -202,10 +201,10 @@ void ok() { // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 @@ -215,41 +214,41 @@ void ok() { // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' matrixcomponent // CHECK-NEXT: CXXFunctionalCastExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' functional cast to float2x2 // CHECK-NEXT: InitListExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 5 // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' matrixcomponent // CHECK-NEXT: CXXFunctionalCastExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' functional cast to float2x2 // CHECK-NEXT: InitListExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 5 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 6 float2x3 G = float2x3(float2x2(1,2,3,4), 5, 6); @@ -262,13 +261,13 @@ float2x3 G = float2x3(float2x2(1,2,3,4), 5, 6); // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue vectorcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' lvalue Var 0x{{[0-9a-fA-F]+}} 'Vec2' 'float2':'vector' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 0 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue vectorcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' lvalue Var 0x{{[0-9a-fA-F]+}} 'Vec2' 'float2':'vector' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 float2 Vec2 = float2(1.0, 2.0); float2x2 H = float2x2(Vec2,3,4); @@ -281,10 +280,10 @@ float2x3 G = float2x3(float2x2(1,2,3,4), 5, 6); // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'int' lvalue Var 0x{{[0-9a-fA-F]+}} 'i' 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' -// CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'int' lvalue Var 0x{{[0-9a-fA-F]+}} 'j' 'int' +// CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'int' lvalue Var 0x{{[0-9a-fA-F]+}} 'k' 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' -// CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'int' lvalue Var 0x{{[0-9a-fA-F]+}} 'k' 'int' +// CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'int' lvalue Var 0x{{[0-9a-fA-F]+}} 'j' 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'int' lvalue Var 0x{{[0-9a-fA-F]+}} 'l' 'int' @@ -300,15 +299,15 @@ float2x3 G = float2x3(float2x2(1,2,3,4), 5, 6); // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'struct S' lvalue Var 0x{{[0-9a-fA-F]+}} 's' 'struct S' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: MemberExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue .a 0x{{[0-9a-fA-F]+}} +// CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'struct S' lvalue Var 0x{{[0-9a-fA-F]+}} 's' 'struct S' +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue vectorcomponent // CHECK-NEXT: MemberExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' lvalue .f 0x{{[0-9a-fA-F]+}} // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'struct S' lvalue Var 0x{{[0-9a-fA-F]+}} 's' 'struct S' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MemberExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue .a 0x{{[0-9a-fA-F]+}} -// CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'struct S' lvalue Var 0x{{[0-9a-fA-F]+}} 's' 'struct S' -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: MemberExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue .a 0x{{[0-9a-fA-F]+}} // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'struct S' lvalue Var 0x{{[0-9a-fA-F]+}} 's' 'struct S' struct S { float2 f; float a;} s; float2x2 J = float2x2(s.f, s.a, s.a); @@ -317,8 +316,8 @@ float2x3 G = float2x3(float2x2(1,2,3,4), 5, 6); // CHECK-NEXT: CXXFunctionalCastExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' functional cast to float2x2 // CHECK-NEXT: InitListExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' // CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 1.000000e+00 -// CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 2.000000e+00 // CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 3.000000e+00 +// CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 2.000000e+00 // CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 4.000000e+00 typedef float2x2 second_level_of_typedefs; second_level_of_typedefs L = float2x2(1.0f, 2.0f, 3.0f, 4.0f); @@ -327,8 +326,8 @@ float2x3 G = float2x3(float2x2(1,2,3,4), 5, 6); // CHECK-NEXT: CXXFunctionalCastExpr 0x{{[0-9a-fA-F]+}} 'second_level_of_typedefs':'matrix' functional cast to second_level_of_typedefs // CHECK-NEXT: InitListExpr 0x{{[0-9a-fA-F]+}} 'second_level_of_typedefs':'matrix' // CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 1.000000e+00 -// CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 2.000000e+00 // CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 3.000000e+00 +// CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 2.000000e+00 // CHECK-NEXT: FloatingLiteral 0x{{[0-9a-fA-F]+}} 'float' 4.000000e+00 float2x2 M = second_level_of_typedefs(1.0f, 2.0f, 3.0f, 4.0f); @@ -367,12 +366,12 @@ float2x1 GettingStrange = float2x1(s2, s2); // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue vectorcomponent // CHECK-NEXT: MemberExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' lvalue .f 0x{{[0-9a-fA-F]+}} // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'S3' lvalue Var 0x{{[0-9a-fA-F]+}} 's3' 'S3' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue vectorcomponent // CHECK-NEXT: MemberExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' lvalue .f 0x{{[0-9a-fA-F]+}} // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'S3' lvalue Var 0x{{[0-9a-fA-F]+}} 's3' 'S3' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue vectorcomponent // CHECK-NEXT: MemberExpr 0x{{[0-9a-fA-F]+}} 'float2':'vector' lvalue .f 0x{{[0-9a-fA-F]+}} diff --git a/clang/test/AST/HLSL/matrix-general-initializer.hlsl b/clang/test/AST/HLSL/matrix-general-initializer.hlsl index 14c950acb7baf..1a631113eb0f0 100644 --- a/clang/test/AST/HLSL/matrix-general-initializer.hlsl +++ b/clang/test/AST/HLSL/matrix-general-initializer.hlsl @@ -26,14 +26,6 @@ void ok() { // CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xxx // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' -// CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'int' xvalue vectorcomponent -// CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'vector' xvalue -// CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xxx -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 2 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' @@ -42,20 +34,8 @@ void ok() { // CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xx // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 0 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' -// CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'int' xvalue vectorcomponent -// CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'vector' xvalue -// CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xx -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' -// CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'int' x -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 -// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'int' xvalue vectorcomponent // CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'vector' xvalue @@ -66,10 +46,30 @@ void ok() { // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'int' xvalue vectorcomponent -// CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'vector' xvalue -// CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xx +// CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'vector' xvalue +// CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xxx // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' +// CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'int' xvalue vectorcomponent +// CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'vector' xvalue +// CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xx +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 0 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'int' x +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 3 +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' +// CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'int' xvalue vectorcomponent +// CHECK-NEXT: MaterializeTemporaryExpr 0x{{[0-9a-fA-F]+}} 'vector' xvalue +// CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xx +// CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 4 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 float4x2 m = {1.xxx, 2.xx, 3.x, 4.xx}; @@ -84,12 +84,12 @@ float4x2 m = {1.xxx, 2.xx, 3.x, 4.xx}; // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float4x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm' 'float4x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float4x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm' 'float4x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent @@ -105,12 +105,12 @@ float4x2 m = {1.xxx, 2.xx, 3.x, 4.xx}; // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float4x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm' 'float4x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float4x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm' 'float4x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 2 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent @@ -138,7 +138,7 @@ S s = {m}; // CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xxxx // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 2 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'int' xvalue vectorcomponent @@ -146,7 +146,7 @@ S s = {m}; // CHECK-NEXT: ExtVectorElementExpr 0x{{[0-9a-fA-F]+}} 'vector' xxxx // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'vector' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 2 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} <> '__size_t':'unsigned long' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ArraySubscriptExpr 0x{{[0-9a-fA-F]+}} 'int' xvalue vectorcomponent @@ -169,25 +169,25 @@ float2x2 m2 = {0.xxxx}; // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' @@ -199,26 +199,26 @@ float2x2 m2 = {0.xxxx}; // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent @@ -229,25 +229,25 @@ float2x2 m2 = {0.xxxx}; // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' // CHECK-NEXT: MatrixSubscriptExpr 0x{{[0-9a-fA-F]+}} 'float' lvalue matrixcomponent // CHECK-NEXT: DeclRefExpr 0x{{[0-9a-fA-F]+}} 'float2x2':'matrix' lvalue Var 0x{{[0-9a-fA-F]+}} 'm2' 'float2x2':'matrix' -// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 0 +// CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: IntegerLiteral 0x{{[0-9a-fA-F]+}} 'int' 1 // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'int' // CHECK-NEXT: ImplicitCastExpr 0x{{[0-9a-fA-F]+}} 'float' diff --git a/clang/test/CodeGenHLSL/BasicFeatures/MatrixConstructor.hlsl b/clang/test/CodeGenHLSL/BasicFeatures/MatrixConstructor.hlsl new file mode 100644 index 0000000000000..3f16a927e74d0 --- /dev/null +++ b/clang/test/CodeGenHLSL/BasicFeatures/MatrixConstructor.hlsl @@ -0,0 +1,93 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6 +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -disable-llvm-passes -emit-llvm -finclude-default-header -o - %s | FileCheck %s + +// CHECK-LABEL: define hidden noundef nofpclass(nan inf) <6 x float> @_Z5case1v( +// CHECK-SAME: ) #[[ATTR0:[0-9]+]] { +// CHECK-NEXT: [[ENTRY:.*:]] +// CHECK-NEXT: ret <6 x float> +// +float3x2 case1() { + // vec[0] = 0 + // vec[1] = 2 + // vec[2] = 4 + // vec[3] = 1 + // vec[4] = 3 + // vec[5] = 5 + return float3x2(0, 1, 2, + 3, 4, 5); +} + + +RWStructuredBuffer In; + +// CHECK-LABEL: define hidden noundef nofpclass(nan inf) <6 x float> @_Z5case2v( +// CHECK-SAME: ) #[[ATTR0]] { +// CHECK-NEXT: [[ENTRY:.*:]] +// CHECK-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 0) #[[ATTR3:[0-9]+]] +// CHECK-NEXT: [[CALL1:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 1) #[[ATTR3]] +// CHECK-NEXT: [[CALL2:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 2) #[[ATTR3]] +// CHECK-NEXT: [[CALL3:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 3) #[[ATTR3]] +// CHECK-NEXT: [[CALL4:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 4) #[[ATTR3]] +// CHECK-NEXT: [[CALL5:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 5) #[[ATTR3]] +// CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[CALL]], align 4 +// CHECK-NEXT: [[VECINIT:%.*]] = insertelement <6 x float> poison, float [[TMP0]], i32 0 +// CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[CALL2]], align 4 +// CHECK-NEXT: [[VECINIT6:%.*]] = insertelement <6 x float> [[VECINIT]], float [[TMP1]], i32 1 +// CHECK-NEXT: [[TMP2:%.*]] = load float, ptr [[CALL4]], align 4 +// CHECK-NEXT: [[VECINIT7:%.*]] = insertelement <6 x float> [[VECINIT6]], float [[TMP2]], i32 2 +// CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[CALL1]], align 4 +// CHECK-NEXT: [[VECINIT8:%.*]] = insertelement <6 x float> [[VECINIT7]], float [[TMP3]], i32 3 +// CHECK-NEXT: [[TMP4:%.*]] = load float, ptr [[CALL3]], align 4 +// CHECK-NEXT: [[VECINIT9:%.*]] = insertelement <6 x float> [[VECINIT8]], float [[TMP4]], i32 4 +// CHECK-NEXT: [[TMP5:%.*]] = load float, ptr [[CALL5]], align 4 +// CHECK-NEXT: [[VECINIT10:%.*]] = insertelement <6 x float> [[VECINIT9]], float [[TMP5]], i32 5 +// CHECK-NEXT: ret <6 x float> [[VECINIT10]] +// +float3x2 case2() { + // vec[0] = Call + // vec[1] = Call2 + // vec[2] = Call4 + // vec[3] = Call1 + // vec[4] = Call3 + // vec[5] = Call5 + return float3x2(In[0], In[1], In[2], + In[3], In[4], In[5]); +} + + +// CHECK-LABEL: define hidden noundef nofpclass(nan inf) <6 x float> @_Z5case3Dv3_fS_( +// CHECK-SAME: <3 x float> noundef nofpclass(nan inf) [[A:%.*]], <3 x float> noundef nofpclass(nan inf) [[B:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: [[ENTRY:.*:]] +// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <3 x float>, align 16 +// CHECK-NEXT: [[B_ADDR:%.*]] = alloca <3 x float>, align 16 +// CHECK-NEXT: store <3 x float> [[A]], ptr [[A_ADDR]], align 16 +// CHECK-NEXT: store <3 x float> [[B]], ptr [[B_ADDR]], align 16 +// CHECK-NEXT: [[TMP0:%.*]] = load <3 x float>, ptr [[A_ADDR]], align 16 +// CHECK-NEXT: [[VECEXT:%.*]] = extractelement <3 x float> [[TMP0]], i64 0 +// CHECK-NEXT: [[VECINIT:%.*]] = insertelement <6 x float> poison, float [[VECEXT]], i32 0 +// CHECK-NEXT: [[TMP1:%.*]] = load <3 x float>, ptr [[A_ADDR]], align 16 +// CHECK-NEXT: [[VECEXT1:%.*]] = extractelement <3 x float> [[TMP1]], i64 2 +// CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <6 x float> [[VECINIT]], float [[VECEXT1]], i32 1 +// CHECK-NEXT: [[TMP2:%.*]] = load <3 x float>, ptr [[B_ADDR]], align 16 +// CHECK-NEXT: [[VECEXT3:%.*]] = extractelement <3 x float> [[TMP2]], i64 1 +// CHECK-NEXT: [[VECINIT4:%.*]] = insertelement <6 x float> [[VECINIT2]], float [[VECEXT3]], i32 2 +// CHECK-NEXT: [[TMP3:%.*]] = load <3 x float>, ptr [[A_ADDR]], align 16 +// CHECK-NEXT: [[VECEXT5:%.*]] = extractelement <3 x float> [[TMP3]], i64 1 +// CHECK-NEXT: [[VECINIT6:%.*]] = insertelement <6 x float> [[VECINIT4]], float [[VECEXT5]], i32 3 +// CHECK-NEXT: [[TMP4:%.*]] = load <3 x float>, ptr [[B_ADDR]], align 16 +// CHECK-NEXT: [[VECEXT7:%.*]] = extractelement <3 x float> [[TMP4]], i64 0 +// CHECK-NEXT: [[VECINIT8:%.*]] = insertelement <6 x float> [[VECINIT6]], float [[VECEXT7]], i32 4 +// CHECK-NEXT: [[TMP5:%.*]] = load <3 x float>, ptr [[B_ADDR]], align 16 +// CHECK-NEXT: [[VECEXT9:%.*]] = extractelement <3 x float> [[TMP5]], i64 2 +// CHECK-NEXT: [[VECINIT10:%.*]] = insertelement <6 x float> [[VECINIT8]], float [[VECEXT9]], i32 5 +// CHECK-NEXT: ret <6 x float> [[VECINIT10]] +// +float3x2 case3(float3 a, float3 b) { + // vec[0] = A[0] + // vec[1] = A[2] + // vec[2] = B[1] + // vec[3] = A[1] + // vec[4] = B[0] + // vec[5] = B[2] + return float3x2(a,b); +} From de3ec4d7e03909336e2fb53823a5813f3714a44f Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Mon, 3 Nov 2025 23:24:50 -0500 Subject: [PATCH 2/4] address pr comments Co-authored-by: Deric C. --- .../CodeGenHLSL/BasicFeatures/MatrixConstructor.hlsl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/clang/test/CodeGenHLSL/BasicFeatures/MatrixConstructor.hlsl b/clang/test/CodeGenHLSL/BasicFeatures/MatrixConstructor.hlsl index 3f16a927e74d0..a7c01015b2015 100644 --- a/clang/test/CodeGenHLSL/BasicFeatures/MatrixConstructor.hlsl +++ b/clang/test/CodeGenHLSL/BasicFeatures/MatrixConstructor.hlsl @@ -13,8 +13,9 @@ float3x2 case1() { // vec[3] = 1 // vec[4] = 3 // vec[5] = 5 - return float3x2(0, 1, 2, - 3, 4, 5); + return float3x2(0, 1, + 2, 3, + 4, 5); } @@ -50,8 +51,9 @@ float3x2 case2() { // vec[3] = Call1 // vec[4] = Call3 // vec[5] = Call5 - return float3x2(In[0], In[1], In[2], - In[3], In[4], In[5]); + return float3x2(In[0], In[1], + In[2], In[3], + In[4], In[5]); } From 8d5b716b0a9bda0bffc5829665e460deb37bdc93 Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Tue, 4 Nov 2025 14:39:22 -0500 Subject: [PATCH 3/4] Fix comment grammar Co-authored-by: Helena Kotas --- clang/lib/Sema/SemaInit.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 2dcbd61ca13b6..58df5fa42d187 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1898,9 +1898,9 @@ void InitListChecker::CheckMatrixType(const InitializedEntity &Entity, const ConstantMatrixType *MT = DeclType->castAs(); - // For HLSL The error for this case is handled in SemaHLSL's initializer - // list diagnostics, That means the execution should require - // getNumElementsFlattened to equal getNumInits. In other words execution + // For HLSL, the error reporting for this case is handled in SemaHLSL's initializer + // list diagnostics. That means the execution should require + // getNumElementsFlattened to equal getNumInits. In other words the execution // should never reach this point if this condition is not true". assert(IList->getNumInits() == MT->getNumElementsFlattened() && "Inits must equal Matrix element count"); From 33e255fbe5fba4a57475642371a8cc3b3439c97a Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Tue, 4 Nov 2025 14:43:45 -0500 Subject: [PATCH 4/4] fix formatting --- clang/lib/Sema/SemaInit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 58df5fa42d187..cc6ddf568d346 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1898,8 +1898,8 @@ void InitListChecker::CheckMatrixType(const InitializedEntity &Entity, const ConstantMatrixType *MT = DeclType->castAs(); - // For HLSL, the error reporting for this case is handled in SemaHLSL's initializer - // list diagnostics. That means the execution should require + // For HLSL, the error reporting for this case is handled in SemaHLSL's + // initializer list diagnostics. That means the execution should require // getNumElementsFlattened to equal getNumInits. In other words the execution // should never reach this point if this condition is not true". assert(IList->getNumInits() == MT->getNumElementsFlattened() &&