Now that we have reliable cast kinds, simplify scalar cast IR gen.

llvm-svn: 119332
This commit is contained in:
John McCall 2010-11-16 06:21:14 +00:00
parent d50a27111c
commit 3eba6e67ec
1 changed files with 3 additions and 36 deletions

View File

@ -1041,9 +1041,6 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
const CXXDynamicCastExpr *DCE = cast<CXXDynamicCastExpr>(CE);
return CGF.EmitDynamicCast(V, DCE);
}
case CK_ToUnion:
assert(0 && "Should be unreachable!");
break;
case CK_ArrayToPointerDecay: {
assert(E->getType()->isArrayType() &&
@ -1101,7 +1098,8 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
case CK_IntegralComplexToFloatingComplex:
case CK_FloatingComplexToIntegralComplex:
case CK_ConstructorConversion:
assert(0 && "Should be unreachable!");
case CK_ToUnion:
llvm_unreachable("scalar cast to non-scalar value");
break;
case CK_IntegralToPointer: {
@ -1191,38 +1189,7 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
}
// Handle cases where the source is an non-complex type.
if (!CGF.hasAggregateLLVMType(E->getType())) {
Value *Src = Visit(const_cast<Expr*>(E));
// Use EmitScalarConversion to perform the conversion.
return EmitScalarConversion(Src, E->getType(), DestTy);
}
// Handle cases where the source is a complex type.
// TODO: when we're certain about cast kinds, we should just be able
// to assert that no complexes make it here.
if (E->getType()->isAnyComplexType()) {
bool IgnoreImag = true;
bool IgnoreImagAssign = true;
bool IgnoreReal = IgnoreResultAssign;
bool IgnoreRealAssign = IgnoreResultAssign;
if (DestTy->isBooleanType())
IgnoreImagAssign = IgnoreImag = false;
else if (DestTy->isVoidType()) {
IgnoreReal = IgnoreImag = false;
IgnoreRealAssign = IgnoreImagAssign = true;
}
CodeGenFunction::ComplexPairTy V
= CGF.EmitComplexExpr(E, IgnoreReal, IgnoreImag, IgnoreRealAssign,
IgnoreImagAssign);
return EmitComplexToScalarConversion(V, E->getType(), DestTy);
}
// Okay, this is a cast from an aggregate. It must be a cast to void. Just
// evaluate the result and return.
CGF.EmitAggExpr(E, AggValueSlot::ignored(), true);
llvm_unreachable("unknown scalar cast");
return 0;
}