================ @@ -2414,9 +2420,41 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) { return EmitScalarConversion(Visit(E), E->getType(), DestTy, CE->getExprLoc(), Opts); } - case CK_IntegralToFloating: - case CK_FloatingToIntegral: - case CK_FloatingCast: + case CK_IntegralToFloating: { + if (E->getType()->isExtVectorType() && DestTy->isExtVectorType()) { + QualType SrcElTy = E->getType()->castAs<VectorType>()->getElementType(); + if (SrcElTy->isSignedIntegerOrEnumerationType()) + return Builder.CreateSIToFP(Visit(E), ConvertType(DestTy), "conv"); + return Builder.CreateUIToFP(Visit(E), ConvertType(DestTy), "conv"); + } + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, CE); + return EmitScalarConversion(Visit(E), E->getType(), DestTy, + CE->getExprLoc()); + } + case CK_FloatingToIntegral: { + if (E->getType()->isExtVectorType() && DestTy->isExtVectorType()) { + QualType DstElTy = DestTy->castAs<VectorType>()->getElementType(); + if (DstElTy->isSignedIntegerOrEnumerationType()) + return Builder.CreateFPToSI(Visit(E), ConvertType(DestTy), "conv"); + return Builder.CreateFPToUI(Visit(E), ConvertType(DestTy), "conv"); + } + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, CE); + return EmitScalarConversion(Visit(E), E->getType(), DestTy, + CE->getExprLoc()); + } + case CK_FloatingCast: { + if (E->getType()->isExtVectorType() && DestTy->isExtVectorType()) { + QualType SrcElTy = E->getType()->castAs<VectorType>()->getElementType(); + QualType DstElTy = DestTy->castAs<VectorType>()->getElementType(); + if (DstElTy->castAs<BuiltinType>()->getKind() < + SrcElTy->castAs<BuiltinType>()->getKind()) + return Builder.CreateFPTrunc(Visit(E), ConvertType(DestTy), "conv"); + return Builder.CreateFPExt(Visit(E), ConvertType(DestTy), "conv"); + } + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, CE); + return EmitScalarConversion(Visit(E), E->getType(), DestTy, + CE->getExprLoc()); + } ---------------- rjmccall wrote:
Interesting. I guess we would've had a miscompile here except that Sema currently never emits these cast kinds for vector types? Given that, I feel like this code shouldn't check for `ExtVectorType` specifically. If Sema in its wisdom tells us to emit one of these conversions, we should do it the right way for any vector type. I guess HLSL probably doesn't care about any of the contextual things from the FP options. Do the constrained FP intrinsics even support vectors? Please at least leave a TODO about handling these properly. https://github.com/llvm/llvm-project/pull/71098 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits