llvm/llvm-project

Refactor `CodeGenFunction::EmitStoreThroughLValue` in `CGExpr.cpp` to consolidate HLSL-specific behavior into helper functions

Open

#176,468 建立於 2026年1月16日

在 GitHub 查看
 (6 留言) (0 反應) (1 負責人)C++ (10,782 fork)batch import
HLSLclang:codegengood first issue

倉庫指標

Star
 (26,378 star)
PR 合併指標
 (平均合併 1天 2小時) (30 天內合併 1,000 個 PR)

描述

As pointed out by @farzonl in #176216 the CodeGenFunction::EmitStoreThroughLValue function in CGExpr.cpp has three significantly large HLSL-specific if-statements for handling stores through LValues of types Dst.isVectorElt(), Dst.isMatrixElt(), and Dst.isMatrixRow().

The HLSL-specific behaviors essentially boil down to:

  • Zero-extending the Src to its corresponding type for the given destination Address
        llvm::Value *Val = Src.getScalarVal();
        if (Val->getType()->getPrimitiveSizeInBits() <
            ElemTy->getScalarSizeInBits())
          Val = Builder.CreateZExt(Val, ElemTy->getScalarType());
  • Storing individual elements of vectors/matrices into memory via a vector GEP followed by a scalar store, as opposed to storing the entire vector/matrix as one unit
        llvm::Value *Idx = Dst.getVectorIdx();
        llvm::Value *Zero = llvm::ConstantInt::get(Int32Ty, 0);
        Address DstElemAddr =
            Builder.CreateGEP(DstAddr, {Zero, Idx}, DestAddrTy, ElemAlign);
        Builder.CreateStore(Val, DstElemAddr, Dst.isVolatileQualified());

It would be preferrable to have these behaviors consolidated into their own (HLSL-specific) helper functions, which should not only make the code easier to read by reducing code duplication, but also potentially make it easier for other language modes to adopt the use of one or both of these behaviors.

貢獻者指南