From: Chris Lattner Date: Wed, 4 Jan 2006 02:03:29 +0000 (+0000) Subject: don't crash when trying to constant fold packed expressions. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d15ed597349e611553f0eb72b7187844c7630acc;p=oota-llvm.git don't crash when trying to constant fold packed expressions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25072 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 802c9f4011e..4cbe919b839 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -328,6 +328,29 @@ struct NullPointerRules : public TemplateRules { +}; + + +//===----------------------------------------------------------------------===// +// GeneralPackedRules Class +//===----------------------------------------------------------------------===// + +/// GeneralPackedRules provides a concrete base class of ConstRules for +/// PackedType operands, where both operands are not ConstantPacked. The usual +/// cause for this is that one operand is a ConstantAggregateZero. +/// +struct GeneralPackedRules : public TemplateRules { +}; + //===----------------------------------------------------------------------===// // DirectRules Class @@ -487,6 +510,8 @@ ConstRules &ConstRules::get(const Constant *V1, const Constant *V2) { static EmptyRules EmptyR; static BoolRules BoolR; static NullPointerRules NullPointerR; + static ConstantPackedRules ConstantPackedR; + static GeneralPackedRules GeneralPackedR; static DirectIntRules SByteR; static DirectIntRules UByteR; static DirectIntRules ShortR; @@ -517,6 +542,10 @@ ConstRules &ConstRules::get(const Constant *V1, const Constant *V2) { case Type::ULongTyID: return ULongR; case Type::FloatTyID: return FloatR; case Type::DoubleTyID: return DoubleR; + case Type::PackedTyID: + if (isa(V1) && isa(V2)) + return ConstantPackedR; + return GeneralPackedR; // Constant folding rules for ConstantAggregateZero. } }