Skip to content

Commit b958512

Browse files
committed
Avoid falling into EmitScalarConversion
'beanz/cbieneman/hlsl-standard-conversions-trunc' by 1664 commits.
1 parent f86c51f commit b958512

File tree

1 file changed

+44
-15
lines changed

1 file changed

+44
-15
lines changed

clang/lib/CodeGen/CGExprScalar.cpp

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -610,8 +610,6 @@ class ScalarExprEmitter
610610
llvm::Value *EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
611611
bool isInc, bool isPre);
612612

613-
llvm::Value *EmitVectorElementConversion(QualType SrcType, QualType DstType,
614-
llvm::Value *Src);
615613

616614
Value *VisitUnaryAddrOf(const UnaryOperator *E) {
617615
if (isa<MemberPointerType>(E->getType())) // never sugared
@@ -1424,9 +1422,6 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
14241422
return Builder.CreateVectorSplat(NumElements, Src, "splat");
14251423
}
14261424

1427-
if (SrcType->isExtVectorType() && DstType->isExtVectorType())
1428-
return EmitVectorElementConversion(SrcType, DstType, Src);
1429-
14301425
if (SrcType->isMatrixType() && DstType->isMatrixType())
14311426
return EmitScalarCast(Src, SrcType, DstType, SrcTy, DstTy, Opts);
14321427

@@ -1706,14 +1701,10 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
17061701
}
17071702

17081703
Value *ScalarExprEmitter::VisitConvertVectorExpr(ConvertVectorExpr *E) {
1709-
QualType SrcType = E->getSrcExpr()->getType(), DstType = E->getType();
1710-
Value *Src = CGF.EmitScalarExpr(E->getSrcExpr());
1711-
return EmitVectorElementConversion(SrcType, DstType, Src);
1712-
}
1704+
QualType SrcType = E->getSrcExpr()->getType(),
1705+
DstType = E->getType();
17131706

1714-
llvm::Value *ScalarExprEmitter::EmitVectorElementConversion(QualType SrcType,
1715-
QualType DstType,
1716-
Value *Src) {
1707+
Value *Src = CGF.EmitScalarExpr(E->getSrcExpr());
17171708

17181709
SrcType = CGF.getContext().getCanonicalType(SrcType);
17191710
DstType = CGF.getContext().getCanonicalType(DstType);
@@ -2415,6 +2406,12 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
24152406
CE->getExprLoc());
24162407

24172408
case CK_IntegralCast: {
2409+
if (E->getType()->isExtVectorType() && DestTy->isExtVectorType()) {
2410+
QualType SrcElTy = E->getType()->castAs<VectorType>()->getElementType();
2411+
return Builder.CreateIntCast(Visit(E), ConvertType(DestTy),
2412+
SrcElTy->isSignedIntegerOrEnumerationType(),
2413+
"conv");
2414+
}
24182415
ScalarConversionOpts Opts;
24192416
if (auto *ICE = dyn_cast<ImplicitCastExpr>(CE)) {
24202417
if (!ICE->isPartOfExplicitCast())
@@ -2423,9 +2420,41 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
24232420
return EmitScalarConversion(Visit(E), E->getType(), DestTy,
24242421
CE->getExprLoc(), Opts);
24252422
}
2426-
case CK_IntegralToFloating:
2427-
case CK_FloatingToIntegral:
2428-
case CK_FloatingCast:
2423+
case CK_IntegralToFloating: {
2424+
if (E->getType()->isExtVectorType() && DestTy->isExtVectorType()) {
2425+
QualType SrcElTy = E->getType()->castAs<VectorType>()->getElementType();
2426+
if (SrcElTy->isSignedIntegerOrEnumerationType())
2427+
return Builder.CreateSIToFP(Visit(E), ConvertType(DestTy), "conv");
2428+
return Builder.CreateUIToFP(Visit(E), ConvertType(DestTy), "conv");
2429+
}
2430+
CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, CE);
2431+
return EmitScalarConversion(Visit(E), E->getType(), DestTy,
2432+
CE->getExprLoc());
2433+
}
2434+
case CK_FloatingToIntegral: {
2435+
if (E->getType()->isExtVectorType() && DestTy->isExtVectorType()) {
2436+
QualType DstElTy = DestTy->castAs<VectorType>()->getElementType();
2437+
if (DstElTy->isSignedIntegerOrEnumerationType())
2438+
return Builder.CreateFPToSI(Visit(E), ConvertType(DestTy), "conv");
2439+
return Builder.CreateFPToUI(Visit(E), ConvertType(DestTy), "conv");
2440+
}
2441+
CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, CE);
2442+
return EmitScalarConversion(Visit(E), E->getType(), DestTy,
2443+
CE->getExprLoc());
2444+
}
2445+
case CK_FloatingCast: {
2446+
if (E->getType()->isExtVectorType() && DestTy->isExtVectorType()) {
2447+
QualType SrcElTy = E->getType()->castAs<VectorType>()->getElementType();
2448+
QualType DstElTy = DestTy->castAs<VectorType>()->getElementType();
2449+
if (DstElTy->castAs<BuiltinType>()->getKind() <
2450+
SrcElTy->castAs<BuiltinType>()->getKind())
2451+
return Builder.CreateFPTrunc(Visit(E), ConvertType(DestTy), "conv");
2452+
return Builder.CreateFPExt(Visit(E), ConvertType(DestTy), "conv");
2453+
}
2454+
CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, CE);
2455+
return EmitScalarConversion(Visit(E), E->getType(), DestTy,
2456+
CE->getExprLoc());
2457+
}
24292458
case CK_FixedPointToFloating:
24302459
case CK_FloatingToFixedPoint: {
24312460
CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, CE);

0 commit comments

Comments
 (0)