[clang] [llvm] [HLSL] Adding HLSL `clip` function. (PR #114588)

via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 6 13:46:09 PST 2024


================
@@ -99,6 +99,42 @@ static void initializeAlloca(CodeGenFunction &CGF, AllocaInst *AI, Value *Size,
   I->addAnnotationMetadata("auto-init");
 }
 
+static Value *handleHlslClip(const CallExpr *E, CodeGenFunction *CGF) {
+  Value *Op0 = CGF->EmitScalarExpr(E->getArg(0));
+
+  Constant *FZeroConst = ConstantFP::getZero(CGF->FloatTy);
+  Value *CMP;
+
+  if (const auto *VecTy = E->getArg(0)->getType()->getAs<clang::VectorType>()) {
+    FZeroConst = ConstantVector::getSplat(
+        ElementCount::getFixed(VecTy->getNumElements()), FZeroConst);
+    auto *FCompInst = CGF->Builder.CreateFCmpOLT(Op0, FZeroConst);
+    CMP = CGF->Builder.CreateIntrinsic(
+        CGF->Builder.getInt1Ty(), CGF->CGM.getHLSLRuntime().getAnyIntrinsic(),
+        {FCompInst}, nullptr);
+  } else
+    CMP = CGF->Builder.CreateFCmpOLT(Op0, FZeroConst);
+
+  if (CGF->CGM.getTarget().getTriple().isDXIL())
+    return CGF->Builder.CreateIntrinsic(CGF->VoidTy, llvm::Intrinsic::dx_clip,
----------------
joaosaffran wrote:

This process make sense, however generating basic blocks doesn't seem to be allowed in SPIRV backend yet, as I see this error when creating new MBBs in `llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp`.

```
LLVM ERROR: inserting blocks is not supported yet (in function: test_scalar)
```

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


More information about the cfe-commits mailing list