================ @@ -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, ---------------- farzonl wrote:
Right now, you have `@llvm.spv.clip()` maps to `OpDemoteToHelperInvocation` or `OpKill` depending on some extension availability. What I'm suggesting is twofold. First make your intrinsic map to the same number of arguments as your clang alias. Second that will mean that means register 1 to `selectClip` is what you will be used by `selectAny` Then do your branch invocations only in the spirv backend. In summary the instruction selection will be everything you need for this intrinsic not just OpDemoteToHelperInvocation` or `OpKill`. https://hlsl.godbolt.org/z/ose5EGWEx ``` %21 = OpFOrdLessThan %v4bool %20 %11 %22 = OpAny %bool %21 OpSelectionMerge %23 None OpBranchConditional %22 %24 %23 %24 = OpLabel OpKill | OpDemoteToHelperInvocation %23 = OpLabel ``` https://github.com/llvm/llvm-project/pull/114588 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits