Fix constant folding of nonsquare mat * vec and vec * mat

Bug: b/116263076
Change-Id: Id8657fdefb988827f0d78556884c4f55eb096ca3
Reviewed-on: https://swiftshader-review.googlesource.com/20808
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/OpenGL/compiler/Intermediate.cpp b/src/OpenGL/compiler/Intermediate.cpp
index 4016b11..ee77a2f 100644
--- a/src/OpenGL/compiler/Intermediate.cpp
+++ b/src/OpenGL/compiler/Intermediate.cpp
@@ -1600,18 +1600,18 @@
 					infoSink.info.message(EPrefixInternalError, "Constant Folding cannot be done for matrix times vector", getLine());
 					return 0;
 				}
-				tempConstArray = new ConstantUnion[getNominalSize()];
+				tempConstArray = new ConstantUnion[getSecondarySize()];
 
 				{// support MSVC++6.0
-					for (int size = getNominalSize(), i = 0; i < size; i++) {
+					for (int rows = getSecondarySize(), i = 0; i < rows; i++) {
 						tempConstArray[i].setFConst(0.0f);
-						for (int j = 0; j < size; j++) {
-							tempConstArray[i].setFConst(tempConstArray[i].getFConst() + ((unionArray[j*size + i].getFConst()) * rightUnionArray[j].getFConst()));
+						for (int cols = getNominalSize(), j = 0; j < cols; j++) {
+							tempConstArray[i].setFConst(tempConstArray[i].getFConst() + ((unionArray[j*rows + i].getFConst()) * rightUnionArray[j].getFConst()));
 						}
 					}
 				}
 
-				tempNode = new TIntermConstantUnion(tempConstArray, node->getType());
+				tempNode = new TIntermConstantUnion(tempConstArray, TType(EbtFloat, EbpUndefined, EvqConstExpr, getSecondarySize()));
 				tempNode->setLine(getLine());
 
 				return tempNode;
@@ -1622,16 +1622,19 @@
 					return 0;
 				}
 
-				tempConstArray = new ConstantUnion[getNominalSize()];
+				tempConstArray = new ConstantUnion[node->getNominalSize()];
 				{// support MSVC++6.0
-					for (int size = getNominalSize(), i = 0; i < size; i++) {
+					for (int cols = node->getNominalSize(), i = 0; i < cols; i++) {
 						tempConstArray[i].setFConst(0.0f);
-						for (int j = 0; j < size; j++) {
-							tempConstArray[i].setFConst(tempConstArray[i].getFConst() + ((unionArray[j].getFConst()) * rightUnionArray[i*size + j].getFConst()));
+						for (int rows = node->getSecondarySize(), j = 0; j < rows; j++) {
+							tempConstArray[i].setFConst(tempConstArray[i].getFConst() + ((unionArray[j].getFConst()) * rightUnionArray[i*rows + j].getFConst()));
 						}
 					}
 				}
-				break;
+
+				tempNode = new TIntermConstantUnion(tempConstArray, TType(EbtFloat, EbpUndefined, EvqConstExpr, node->getNominalSize()));
+				tempNode->setLine(getLine());
+				return tempNode;
 
 			case EOpLogicalAnd: // this code is written for possible future use, will not get executed currently
 				tempConstArray = new ConstantUnion[objectSize];