[llvm-commits] [vector_llvm] CVS: llvm/lib/Transforms/Vector/SSE.cpp

Robert Bocchino bocchino at cs.uiuc.edu
Wed Jan 4 12:28:17 PST 2006



Changes in directory llvm/lib/Transforms/Vector:

SSE.cpp updated: 1.1.2.3 -> 1.1.2.4
---
Log message:

Fixed a bug in SSE code generation for unpack.


---
Diffs of the changes:  (+49 -25)

 SSE.cpp |   74 ++++++++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 49 insertions(+), 25 deletions(-)


Index: llvm/lib/Transforms/Vector/SSE.cpp
diff -u llvm/lib/Transforms/Vector/SSE.cpp:1.1.2.3 llvm/lib/Transforms/Vector/SSE.cpp:1.1.2.4
--- llvm/lib/Transforms/Vector/SSE.cpp:1.1.2.3	Wed Nov 16 12:32:56 2005
+++ llvm/lib/Transforms/Vector/SSE.cpp	Wed Jan  4 14:28:05 2006
@@ -147,6 +147,31 @@
     return false;
   }
 
+  static const Type *getSignedType(const Type *Ty) {
+    if (Ty->isSigned())
+      return Ty;
+    switch(Ty->getTypeID()) {
+    case Type::UIntTyID:
+      return Type::IntTy;
+    default:
+      std::cerr << "Can't handle type " << Ty->getDescription() << "\n";
+      exit(1);
+    }
+  }
+
+  static const Type *promoteType(const Type *Ty) {
+    if (const FixedVectorType *VT = dyn_cast<FixedVectorType>(Ty))
+      return FixedVectorType::get(promoteType(VT->getElementType()),
+				  VT->getNumElements());
+    switch(Ty->getTypeID()) {
+    case Type::ShortTyID:
+      return Type::IntTy;
+    default:
+      std::cerr << "Can't promote type " << Ty->getDescription() << "\n";
+      exit(1);
+    }
+  }
+
 
   //===----------------------------------------------------------------------===//
   //                     SSE implementation
@@ -274,12 +299,19 @@
       ExtractInst *extract0 = dyn_cast<ExtractInst>(*I++);
       ExtractInst *extract1 = dyn_cast<ExtractInst>(*I);
       assert(extract0 && extract1);
-      CallInst *unpackhi = VectorUtils::getCallInst(VT2, getSSEName("unpackhi", VT2),
-						  combine1->getOperand(1), combine2->getOperand(1),
-						  "unpackhi", extract0);
-      CallInst *unpacklo = VectorUtils::getCallInst(VT2, getSSEName("unpacklo", VT2),
-						  combine1->getOperand(1), combine2->getOperand(1),
-						  "unpacklo", extract0);
+      const FixedVectorType *HalfVT = 
+	FixedVectorType::get(promoteType(VT2->getElementType()),
+			     VT2->getNumElements() / 2);
+      CallInst *tmp = 
+	VectorUtils::getCallInst(HalfVT, getSSEName("unpackhi", VT2),
+				 combine1->getOperand(1), combine2->getOperand(1),
+				 "unpackhi", extract0);
+      CastInst *unpackhi = new CastInst(tmp, VT2, "cast", extract0);
+      tmp = 
+	VectorUtils::getCallInst(HalfVT, getSSEName("unpacklo", VT2),
+				 combine1->getOperand(1), combine2->getOperand(1),
+				 "unpacklo", extract0);
+      CastInst *unpacklo = new CastInst(tmp, VT2, "cast", extract0);
       if (cast<ConstantUInt>(extract0->getOperand(1))->getValue() == 1) {
 	extract0->replaceAllUsesWith(unpackhi);
 	extract1->replaceAllUsesWith(unpacklo);
@@ -371,18 +403,6 @@
     }
   }
 
-  static const Type *getSignedType(const Type *Ty) {
-    if (Ty->isSigned())
-      return Ty;
-    switch(Ty->getTypeID()) {
-    case Type::UIntTyID:
-      return Type::IntTy;
-    default:
-      std::cerr << "Can't handle type " << Ty->getDescription() << "\n";
-    }
-    return 0;
-  }
-
   void SSE::addComposeConstant(BinaryOperator &Add,
 			      Value *arg1, Value *arg2) {
     CallInst *compose = dyn_cast<CallInst>(arg1);//Add.getOperand(0));
@@ -398,14 +418,18 @@
     const FixedVectorType *LongVT = dyn_cast<FixedVectorType>(Add.getType());
     const FixedVectorType *ShortVT = dyn_cast<FixedVectorType>(op1->getType());
     if (!LongVT || !ShortVT) return;
-    const FixedVectorType *HalfVT = FixedVectorType::get(getSignedType(LongVT->getElementType()), 
-							 LongVT->getNumElements() / 2);
-    CallInst *splat2 = VectorUtils::getCallInst(HalfVT, getSSEName("splat", HalfVT),
-						C, "splat", &Add);
-    CallInst *unpackLo = VectorUtils::getCallInst(HalfVT, getSSEName("unpacklo", ShortVT),
+    const FixedVectorType *HalfVT = 
+      FixedVectorType::get(getSignedType(LongVT->getElementType()), 
+			   LongVT->getNumElements() / 2);
+    CallInst *splat2 = 
+      VectorUtils::getCallInst(HalfVT, getSSEName("splat", HalfVT),
+			       C, "splat", &Add);
+    CallInst *unpackLo =
+      VectorUtils::getCallInst(HalfVT, getSSEName("unpacklo", ShortVT),
 						  op1, op2, "unpackLo", &Add);
-    CallInst *unpackHi = VectorUtils::getCallInst(HalfVT, getSSEName("unpackhi", ShortVT),
-						  op1, op2, "unpackHi", &Add);
+    CallInst *unpackHi = 
+      VectorUtils::getCallInst(HalfVT, getSSEName("unpackhi", ShortVT),
+			       op1, op2, "unpackHi", &Add);
     CallInst *addLo = VectorUtils::getCallInst(HalfVT, getSSEName("add", HalfVT),
 					       unpackLo, splat2, "addLo", &Add);
     CallInst *addHi = VectorUtils::getCallInst(HalfVT, getSSEName("add", HalfVT),






More information about the llvm-commits mailing list