From 850168c370bd6cb18a13f88e32e7ec9c1d0abf04 Mon Sep 17 00:00:00 2001
From: Bob Wilson <bob.wilson@apple.com>
Date: Wed, 7 Jan 2009 23:44:27 +0000
Subject: [PATCH] Assert that VectorType::getTruncatedElementVectorType is not
 used with odd bit-width vector elements.  Add a check in the verifier for
 this also.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61899 91177308-0d34-0410-b5e6-96231b3b80d8
---
 include/llvm/DerivedTypes.h |  2 ++
 lib/VMCore/Verifier.cpp     | 14 ++++++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/include/llvm/DerivedTypes.h b/include/llvm/DerivedTypes.h
index 3bc00e9bb25..24681a51f84 100644
--- a/include/llvm/DerivedTypes.h
+++ b/include/llvm/DerivedTypes.h
@@ -385,6 +385,8 @@ public:
   ///
   static VectorType *getTruncatedElementVectorType(const VectorType *VTy) {
     unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
+    assert((EltBits & 1) == 0 &&
+           "Cannot truncate vector element with odd bit-width");
     const Type *EltTy = IntegerType::get(EltBits / 2);
     return VectorType::get(EltTy, VTy->getNumElements());
   }
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index 4a7915430ee..f9ad41b2c42 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -1395,16 +1395,22 @@ bool Verifier::PerformTypeCheck(Intrinsic::ID ID, Function *F, const Type *Ty,
     // type.
     if ((Match & (ExtendedElementVectorType |
                   TruncatedElementVectorType)) != 0) {
-      if (!VTy) {
+      const IntegerType *IEltTy = dyn_cast<IntegerType>(EltTy);
+      if (!VTy || !IEltTy) {
         CheckFailed("Intrinsic parameter #" + utostr(ArgNo - 1) + " is not "
-                    "a vector type.", F);
+                    "an integral vector type.", F);
         return false;
       }
       // Adjust the current Ty (in the opposite direction) rather than
       // the type being matched against.
-      if ((Match & ExtendedElementVectorType) != 0)
+      if ((Match & ExtendedElementVectorType) != 0) {
+        if ((IEltTy->getBitWidth() & 1) != 0) {
+          CheckFailed("Intrinsic parameter #" + utostr(ArgNo - 1) + " vector "
+                      "element bit-width is odd.", F);
+          return false;
+        }
         Ty = VectorType::getTruncatedElementVectorType(VTy);
-      else
+      } else
         Ty = VectorType::getExtendedElementVectorType(VTy);
       Match &= ~(ExtendedElementVectorType | TruncatedElementVectorType);
     }