[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