[llvm-commits] [llvm] r44850 - /llvm/trunk/lib/VMCore/ConstantFold.cpp
Chris Lattner
sabre at nondot.org
Mon Dec 10 22:07:40 PST 2007
Author: lattner
Date: Tue Dec 11 00:07:39 2007
New Revision: 44850
URL: http://llvm.org/viewvc/llvm-project?rev=44850&view=rev
Log:
significantly simplify some code, no functionality change.
Modified:
llvm/trunk/lib/VMCore/ConstantFold.cpp
Modified: llvm/trunk/lib/VMCore/ConstantFold.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/ConstantFold.cpp?rev=44850&r1=44849&r2=44850&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/ConstantFold.cpp (original)
+++ llvm/trunk/lib/VMCore/ConstantFold.cpp Tue Dec 11 00:07:39 2007
@@ -36,81 +36,31 @@
// ConstantFold*Instruction Implementations
//===----------------------------------------------------------------------===//
-/// CastConstantVector - Convert the specified ConstantVector node to the
+/// BitCastConstantVector - Convert the specified ConstantVector node to the
/// specified vector type. At this point, we know that the elements of the
/// input vector constant are all simple integer or FP values.
-static Constant *CastConstantVector(ConstantVector *CV,
- const VectorType *DstTy) {
- unsigned SrcNumElts = CV->getType()->getNumElements();
- unsigned DstNumElts = DstTy->getNumElements();
- const Type *SrcEltTy = CV->getType()->getElementType();
- const Type *DstEltTy = DstTy->getElementType();
+static Constant *BitCastConstantVector(ConstantVector *CV,
+ const VectorType *DstTy) {
+ // If this cast changes element count then we can't handle it here:
+ // doing so requires endianness information. This should be handled by
+ // Analysis/ConstantFolding.cpp
+ unsigned NumElts = DstTy->getNumElements();
+ if (NumElts != CV->getNumOperands())
+ return 0;
- // If both vectors have the same number of elements (thus, the elements
- // are the same size), perform the conversion now.
- if (SrcNumElts == DstNumElts) {
- std::vector<Constant*> Result;
-
- // If the src and dest elements are both integers, or both floats, we can
- // just BitCast each element because the elements are the same size.
- if ((SrcEltTy->isInteger() && DstEltTy->isInteger()) ||
- (SrcEltTy->isFloatingPoint() && DstEltTy->isFloatingPoint())) {
- for (unsigned i = 0; i != SrcNumElts; ++i)
- Result.push_back(
- ConstantExpr::getBitCast(CV->getOperand(i), DstEltTy));
- return ConstantVector::get(Result);
- }
-
- // If this is an int-to-fp cast ..
- if (SrcEltTy->isInteger()) {
- // Ensure that it is int-to-fp cast
- assert(DstEltTy->isFloatingPoint());
- if (DstEltTy->getTypeID() == Type::DoubleTyID) {
- for (unsigned i = 0; i != SrcNumElts; ++i) {
- ConstantInt *CI = cast<ConstantInt>(CV->getOperand(i));
- double V = CI->getValue().bitsToDouble();
- Result.push_back(ConstantFP::get(Type::DoubleTy, APFloat(V)));
- }
- return ConstantVector::get(Result);
- }
- assert(DstEltTy == Type::FloatTy && "Unknown fp type!");
- for (unsigned i = 0; i != SrcNumElts; ++i) {
- ConstantInt *CI = cast<ConstantInt>(CV->getOperand(i));
- float V = CI->getValue().bitsToFloat();
- Result.push_back(ConstantFP::get(Type::FloatTy, APFloat(V)));
- }
- return ConstantVector::get(Result);
- }
-
- // Otherwise, this is an fp-to-int cast.
- assert(SrcEltTy->isFloatingPoint() && DstEltTy->isInteger());
-
- if (SrcEltTy->getTypeID() == Type::DoubleTyID) {
- for (unsigned i = 0; i != SrcNumElts; ++i) {
- uint64_t V = cast<ConstantFP>(CV->getOperand(i))->
- getValueAPF().convertToAPInt().getZExtValue();
- Constant *C = ConstantInt::get(Type::Int64Ty, V);
- Result.push_back(ConstantExpr::getBitCast(C, DstEltTy ));
- }
- return ConstantVector::get(Result);
- }
-
- assert(SrcEltTy->getTypeID() == Type::FloatTyID);
- for (unsigned i = 0; i != SrcNumElts; ++i) {
- uint32_t V = (uint32_t)cast<ConstantFP>(CV->getOperand(i))->
- getValueAPF().convertToAPInt().getZExtValue();
- Constant *C = ConstantInt::get(Type::Int32Ty, V);
- Result.push_back(ConstantExpr::getBitCast(C, DstEltTy));
- }
- return ConstantVector::get(Result);
+ // Check to verify that all elements of the input are simple.
+ for (unsigned i = 0; i != NumElts; ++i) {
+ if (!isa<ConstantInt>(CV->getOperand(i)) &&
+ !isa<ConstantFP>(CV->getOperand(i)))
+ return 0;
}
-
- // Otherwise, this is a cast that changes element count and size. Handle
- // casts which shrink the elements here.
-
- // FIXME: We need to know endianness to do this!
-
- return 0;
+
+ // Bitcast each element now.
+ std::vector<Constant*> Result;
+ const Type *DstEltTy = DstTy->getElementType();
+ for (unsigned i = 0; i != NumElts; ++i)
+ Result.push_back(ConstantExpr::getBitCast(CV->getOperand(i), DstEltTy));
+ return ConstantVector::get(Result);
}
/// This function determines which opcode to use to fold two constant cast
@@ -178,23 +128,8 @@
if (isa<ConstantAggregateZero>(V))
return Constant::getNullValue(DestTy);
- if (const ConstantVector *CV = dyn_cast<ConstantVector>(V)) {
- // This is a cast from a ConstantVector of one type to a
- // ConstantVector of another type. Check to see if all elements of
- // the input are simple.
- bool AllSimpleConstants = true;
- for (unsigned i = 0, e = CV->getNumOperands(); i != e; ++i) {
- if (!isa<ConstantInt>(CV->getOperand(i)) &&
- !isa<ConstantFP>(CV->getOperand(i))) {
- AllSimpleConstants = false;
- break;
- }
- }
-
- // If all of the elements are simple constants, we can fold this.
- if (AllSimpleConstants)
- return CastConstantVector(const_cast<ConstantVector*>(CV), DestPTy);
- }
+ if (ConstantVector *CV = dyn_cast<ConstantVector>(V))
+ return BitCastConstantVector(CV, DestPTy);
}
}
More information about the llvm-commits
mailing list