================
@@ -14604,6 +14643,125 @@ bool
VectorExprEvaluator::VisitShuffleVectorExpr(const ShuffleVectorExpr *E) {
return Success(APValue(ResultElements.data(), ResultElements.size()), E);
}
+//===----------------------------------------------------------------------===//
+// Matrix Evaluation
+//===----------------------------------------------------------------------===//
+
+namespace {
+class MatrixExprEvaluator : public ExprEvaluatorBase<MatrixExprEvaluator> {
+ APValue &Result;
+
+public:
+ MatrixExprEvaluator(EvalInfo &Info, APValue &Result)
+ : ExprEvaluatorBaseTy(Info), Result(Result) {}
+
+ bool Success(ArrayRef<APValue> M, unsigned NumRows, unsigned NumCols,
+ const Expr *E) {
+ assert(
+ M.size() ==
+ E->getType()->castAs<ConstantMatrixType>()->getNumElementsFlattened());
+ assert(M.size() == NumRows * NumCols);
+ // FIXME: remove this APValue copy.
+ Result = APValue(M.data(), NumRows, NumCols);
+ return true;
+ }
+ bool Success(const APValue &M, const Expr *E) {
+ assert(M.isMatrix() && "expected matrix");
+ Result = M;
+ return true;
+ }
+
+ bool VisitCastExpr(const CastExpr *E);
+ bool VisitInitListExpr(const InitListExpr *E);
+};
+} // end anonymous namespace
+
+static bool EvaluateMatrix(const Expr *E, APValue &Result, EvalInfo &Info) {
+ assert(E->isPRValue() && E->getType()->isConstantMatrixType() &&
+ "not a matrix prvalue");
+ return MatrixExprEvaluator(Info, Result).Visit(E);
+}
+
+bool MatrixExprEvaluator::VisitCastExpr(const CastExpr *E) {
+ const auto *MT = E->getType()->castAs<ConstantMatrixType>();
+ unsigned NumRows = MT->getNumRows();
+ unsigned NumCols = MT->getNumColumns();
+ unsigned NElts = NumRows * NumCols;
+ QualType EltTy = MT->getElementType();
+ const Expr *SE = E->getSubExpr();
+
+ switch (E->getCastKind()) {
+ case CK_HLSLAggregateSplatCast: {
+ APValue Val;
+ QualType ValTy;
+
+ if (!hlslAggSplatHelper(Info, SE, Val, ValTy))
+ return false;
+
+ APValue CastedVal;
+ const FPOptions FPO = E->getFPFeaturesInEffect(Info.Ctx.getLangOpts());
+ if (!handleScalarCast(Info, FPO, E, ValTy, EltTy, Val, CastedVal))
+ return false;
+
+ SmallVector<APValue, 16> SplatEls(NElts, CastedVal);
+ return Success(SplatEls, NumRows, NumCols, E);
+ }
+ case CK_HLSLElementwiseCast: {
+ SmallVector<APValue> SrcVals;
+ SmallVector<QualType> SrcTypes;
+
+ if (!hlslElementwiseCastHelper(Info, SE, E->getType(), SrcVals, SrcTypes))
+ return false;
+
+ const FPOptions FPO = E->getFPFeaturesInEffect(Info.Ctx.getLangOpts());
+ SmallVector<QualType, 16> DestTypes(NElts, EltTy);
+ SmallVector<APValue, 16> ResultEls(NElts);
+ if (!handleElementwiseCast(Info, E, FPO, SrcVals, SrcTypes, DestTypes,
+ ResultEls))
+ return false;
+ return Success(ResultEls, NumRows, NumCols, E);
+ }
+ default:
+ return ExprEvaluatorBaseTy::VisitCastExpr(E);
+ }
+}
+
+bool MatrixExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
+ const auto *MT = E->getType()->castAs<ConstantMatrixType>();
+ unsigned NumRows = MT->getNumRows();
+ unsigned NumCols = MT->getNumColumns();
+ QualType EltTy = MT->getElementType();
+
+ assert(E->getNumInits() == NumRows * NumCols &&
+ "Expected number of elements in initializer list to match the number "
+ "of matrix elements");
+
+ SmallVector<APValue, 16> Elements;
+ Elements.reserve(NumRows * NumCols);
+
+ // The initializer list elements are stored in column-major order, but
APValue
+ // stores matrix elements in row-major order. Convert by iterating in
----------------
farzonl wrote:
Actually this is maybe a bit more involved than I thought. I can do a partial
fix that should make the indexing order be row major without any impact on
offload tests. I start with that as its a pretty self contained change.
https://github.com/llvm/llvm-project/pull/178762
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits