[clang] [llvm] [HLSL][DirectX] Implement HLSL `mul` function and DXIL lowering of `llvm.matrix.multiply` (PR #184882)

Steven Perron via cfe-commits cfe-commits at lists.llvm.org
Fri Mar 6 10:11:31 PST 2026


================
@@ -1054,6 +1055,40 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
     Value *Mul = Builder.CreateNUWMul(M, A);
     return Builder.CreateNUWAdd(Mul, B);
   }
+  case Builtin::BI__builtin_hlsl_mul: {
+    Value *Op0 = EmitScalarExpr(E->getArg(0));
+    Value *Op1 = EmitScalarExpr(E->getArg(1));
+    QualType QTy0 = E->getArg(0)->getType();
+    QualType QTy1 = E->getArg(1)->getType();
+
+    bool IsVec0 = QTy0->isVectorType();
+    bool IsMat0 = QTy0->isConstantMatrixType();
+    bool IsMat1 = QTy1->isConstantMatrixType();
+
+    // Only matrix-involved cases reach the builtin (cases 6, 8, 9).
+    llvm::MatrixBuilder MB(Builder);
+    if (IsVec0 && IsMat1) {
+      // Case 6: vector<N> * matrix<N,M> -> vector<M>
+      unsigned N = QTy0->castAs<VectorType>()->getNumElements();
+      auto *MatTy = QTy1->castAs<ConstantMatrixType>();
+      unsigned M = MatTy->getNumColumns();
+      return MB.CreateMatrixMultiply(Op0, Op1, 1, N, M, "hlsl.mul");
+    }
+    if (IsMat0 && !IsMat1) {
+      // Case 8: matrix<M,N> * vector<N> -> vector<M>
----------------
s-perron wrote:

Could you assert that it is a vector or make the check that it is a vector. You assuming that if it is not a matrix then it is a vector. Better to make it explicit.

https://github.com/llvm/llvm-project/pull/184882


More information about the cfe-commits mailing list