[cfe-commits] r128250 - /cfe/trunk/lib/AST/ExprConstant.cpp
Daniel Dunbar
daniel at zuster.org
Fri Mar 25 09:27:50 PDT 2011
Hi Eli,
Clang is crashing on this code:
--
typedef int V2SI __attribute__ ((vector_size (8)));
int test1(void) { return (long long) (V2SI) 0LL; }
--
now, can you take a look?
- Daniel
On Thu, Mar 24, 2011 at 5:43 PM, Eli Friedman <eli.friedman at gmail.com> wrote:
> Author: efriedma
> Date: Thu Mar 24 19:43:55 2011
> New Revision: 128250
>
> URL: http://llvm.org/viewvc/llvm-project?rev=128250&view=rev
> Log:
> Cleanup integral and vector constant evaluation of casts to use cast kinds.
>
>
> Modified:
> cfe/trunk/lib/AST/ExprConstant.cpp
>
> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=128250&r1=128249&r2=128250&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
> +++ cfe/trunk/lib/AST/ExprConstant.cpp Thu Mar 24 19:43:55 2011
> @@ -590,7 +590,6 @@
>
> case CK_NoOp:
> case CK_BitCast:
> - case CK_LValueBitCast:
> case CK_AnyPointerToObjCPointerCast:
> case CK_AnyPointerToBlockPointerCast:
> return Visit(SubExpr);
> @@ -756,68 +755,61 @@
>
> const Expr* SE = E->getSubExpr();
> QualType SETy = SE->getType();
> - APValue Result = APValue();
>
> - // Check for vector->vector bitcast and scalar->vector splat.
> - if (SETy->isVectorType()) {
> - return this->Visit(const_cast<Expr*>(SE));
> - } else if (SETy->isIntegerType()) {
> - APSInt IntResult;
> - if (!EvaluateInteger(SE, IntResult, Info))
> - return APValue();
> - Result = APValue(IntResult);
> - } else if (SETy->isRealFloatingType()) {
> - APFloat F(0.0);
> - if (!EvaluateFloat(SE, F, Info))
> - return APValue();
> - Result = APValue(F);
> - } else
> - return APValue();
> -
> - // For casts of a scalar to ExtVector, convert the scalar to the element type
> - // and splat it to all elements.
> - if (E->getType()->isExtVectorType()) {
> - if (EltTy->isIntegerType() && Result.isInt())
> - Result = APValue(HandleIntToIntCast(EltTy, SETy, Result.getInt(),
> - Info.Ctx));
> - else if (EltTy->isIntegerType())
> - Result = APValue(HandleFloatToIntCast(EltTy, SETy, Result.getFloat(),
> - Info.Ctx));
> - else if (EltTy->isRealFloatingType() && Result.isInt())
> - Result = APValue(HandleIntToFloatCast(EltTy, SETy, Result.getInt(),
> - Info.Ctx));
> - else if (EltTy->isRealFloatingType())
> - Result = APValue(HandleFloatToFloatCast(EltTy, SETy, Result.getFloat(),
> - Info.Ctx));
> - else
> - return APValue();
> + switch (E->getCastKind()) {
> + case CK_VectorSplat: {
> + APValue Result = APValue();
> + if (SETy->isIntegerType()) {
> + APSInt IntResult;
> + if (!EvaluateInteger(SE, IntResult, Info))
> + return APValue();
> + Result = APValue(IntResult);
> + } else if (SETy->isRealFloatingType()) {
> + APFloat F(0.0);
> + if (!EvaluateFloat(SE, F, Info))
> + return APValue();
> + Result = APValue(F);
> + } else {
> + return false;
> + }
>
> // Splat and create vector APValue.
> llvm::SmallVector<APValue, 4> Elts(NElts, Result);
> return APValue(&Elts[0], Elts.size());
> }
> + case CK_BitCast: {
> + if (SETy->isVectorType())
> + return Visit(const_cast<Expr*>(SE));
>
> - // For casts of a scalar to regular gcc-style vector type, bitcast the scalar
> - // to the vector. To construct the APValue vector initializer, bitcast the
> - // initializing value to an APInt, and shift out the bits pertaining to each
> - // element.
> - APSInt Init;
> - Init = Result.isInt() ? Result.getInt() : Result.getFloat().bitcastToAPInt();
> -
> - llvm::SmallVector<APValue, 4> Elts;
> - for (unsigned i = 0; i != NElts; ++i) {
> - APSInt Tmp = Init.extOrTrunc(EltWidth);
> -
> - if (EltTy->isIntegerType())
> - Elts.push_back(APValue(Tmp));
> - else if (EltTy->isRealFloatingType())
> - Elts.push_back(APValue(APFloat(Tmp)));
> - else
> + if (!SETy->isIntegerType())
> + return false;
> +
> + APSInt Init;
> + if (!EvaluateInteger(SE, Init, Info))
> return APValue();
>
> - Init >>= EltWidth;
> + assert((EltTy->isIntegerType() || EltTy->isRealFloatingType()) &&
> + "Vectors must be composed of ints or floats");
> +
> + llvm::SmallVector<APValue, 4> Elts;
> + for (unsigned i = 0; i != NElts; ++i) {
> + APSInt Tmp = Init.extOrTrunc(EltWidth);
> +
> + if (EltTy->isIntegerType())
> + Elts.push_back(APValue(Tmp));
> + else
> + Elts.push_back(APValue(APFloat(Tmp)));
> +
> + Init >>= EltWidth;
> + }
> + return APValue(&Elts[0], Elts.size());
> + }
> + case CK_LValueToRValue:
> + case CK_NoOp:
> + return Visit(const_cast<Expr*>(SE));
> + default:
> + return false;
> }
> - return APValue(&Elts[0], Elts.size());
> }
>
> APValue
> @@ -1771,15 +1763,60 @@
> QualType DestType = E->getType();
> QualType SrcType = SubExpr->getType();
>
> - if (DestType->isBooleanType()) {
> + switch (E->getCastKind()) {
> + case CK_BitCast:
> + case CK_BaseToDerived:
> + case CK_DerivedToBase:
> + case CK_UncheckedDerivedToBase:
> + case CK_Dynamic:
> + case CK_ToUnion:
> + case CK_ArrayToPointerDecay:
> + case CK_FunctionToPointerDecay:
> + case CK_NullToPointer:
> + case CK_NullToMemberPointer:
> + case CK_BaseToDerivedMemberPointer:
> + case CK_DerivedToBaseMemberPointer:
> + case CK_ConstructorConversion:
> + case CK_IntegralToPointer:
> + case CK_ToVoid:
> + case CK_VectorSplat:
> + case CK_IntegralToFloating:
> + case CK_FloatingCast:
> + case CK_AnyPointerToObjCPointerCast:
> + case CK_AnyPointerToBlockPointerCast:
> + case CK_ObjCObjectLValueCast:
> + case CK_FloatingRealToComplex:
> + case CK_FloatingComplexToReal:
> + case CK_FloatingComplexCast:
> + case CK_FloatingComplexToIntegralComplex:
> + case CK_IntegralRealToComplex:
> + case CK_IntegralComplexCast:
> + case CK_IntegralComplexToFloatingComplex:
> + llvm_unreachable("invalid cast kind for integral value");
> +
> + case CK_Dependent:
> + case CK_GetObjCProperty:
> + case CK_LValueBitCast:
> + case CK_UserDefinedConversion:
> + return false;
> +
> + case CK_LValueToRValue:
> + case CK_NoOp:
> + return Visit(E->getSubExpr());
> +
> + case CK_MemberPointerToBoolean:
> + case CK_PointerToBoolean:
> + case CK_IntegralToBoolean:
> + case CK_FloatingToBoolean:
> + case CK_FloatingComplexToBoolean:
> + case CK_IntegralComplexToBoolean: {
> bool BoolResult;
> if (!HandleConversionToBool(SubExpr, BoolResult, Info))
> return false;
> return Success(BoolResult, E);
> }
>
> - // Handle simple integer->integer casts.
> - if (SrcType->isIntegralOrEnumerationType()) {
> + case CK_IntegralCast: {
> if (!Visit(SubExpr))
> return false;
>
> @@ -1792,8 +1829,7 @@
> Result.getInt(), Info.Ctx), E);
> }
>
> - // FIXME: Clean this up!
> - if (SrcType->isPointerType()) {
> + case CK_PointerToIntegral: {
> LValue LV;
> if (!EvaluatePointer(SubExpr, LV, Info))
> return false;
> @@ -1812,42 +1848,24 @@
> return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E);
> }
>
> - if (SrcType->isArrayType() || SrcType->isFunctionType()) {
> - // This handles double-conversion cases, where there's both
> - // an l-value promotion and an implicit conversion to int.
> - LValue LV;
> - if (!EvaluateLValue(SubExpr, LV, Info))
> - return false;
> -
> - if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy))
> - return false;
> -
> - LV.moveInto(Result);
> - return true;
> - }
> -
> - if (SrcType->isAnyComplexType()) {
> + case CK_IntegralComplexToReal: {
> ComplexValue C;
> if (!EvaluateComplex(SubExpr, C, Info))
> return false;
> - if (C.isComplexFloat())
> - return Success(HandleFloatToIntCast(DestType, SrcType,
> - C.getComplexFloatReal(), Info.Ctx),
> - E);
> - else
> - return Success(HandleIntToIntCast(DestType, SrcType,
> - C.getComplexIntReal(), Info.Ctx), E);
> + return Success(C.getComplexIntReal(), E);
> }
> - // FIXME: Handle vectors
>
> - if (!SrcType->isRealFloatingType())
> - return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
> + case CK_FloatingToIntegral: {
> + APFloat F(0.0);
> + if (!EvaluateFloat(SubExpr, F, Info))
> + return false;
>
> - APFloat F(0.0);
> - if (!EvaluateFloat(SubExpr, F, Info))
> - return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
> + return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E);
> + }
> + }
>
> - return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E);
> + llvm_unreachable("unknown cast resulting in integral value");
> + return false;
> }
>
> bool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
> @@ -2282,7 +2300,6 @@
>
> switch (E->getCastKind()) {
> case CK_BitCast:
> - case CK_LValueBitCast:
> case CK_BaseToDerived:
> case CK_DerivedToBase:
> case CK_UncheckedDerivedToBase:
> @@ -2322,6 +2339,7 @@
>
> case CK_Dependent:
> case CK_GetObjCProperty:
> + case CK_LValueBitCast:
> case CK_UserDefinedConversion:
> return false;
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list