X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FConstantFold.cpp;h=069c99ac83f6c12fc0c6f78cac272d9666b4202c;hb=629c1a3f78494d0dd769fe82bd2bd17df0555843;hp=7b21817cda46d8b93fd7918ab6e88deb0d840397;hpb=26471c48b3d49bdbcfcc05cb9a575b5fa123fbbf;p=oota-llvm.git diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 7b21817cda4..069c99ac83f 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -96,27 +96,29 @@ static Constant *FoldBitCast(Constant *V, const Type *DestTy) { // Check to see if we are casting a pointer to an aggregate to a pointer to // the first element. If so, return the appropriate GEP instruction. if (const PointerType *PTy = dyn_cast(V->getType())) - if (const PointerType *DPTy = dyn_cast(DestTy)) { - SmallVector IdxList; - IdxList.push_back(Constant::getNullValue(Type::Int32Ty)); - const Type *ElTy = PTy->getElementType(); - while (ElTy != DPTy->getElementType()) { - if (const StructType *STy = dyn_cast(ElTy)) { - if (STy->getNumElements() == 0) break; - ElTy = STy->getElementType(0); - IdxList.push_back(Constant::getNullValue(Type::Int32Ty)); - } else if (const SequentialType *STy = dyn_cast(ElTy)) { - if (isa(ElTy)) break; // Can't index into pointers! - ElTy = STy->getElementType(); - IdxList.push_back(IdxList[0]); - } else { - break; + if (const PointerType *DPTy = dyn_cast(DestTy)) + if (PTy->getAddressSpace() == DPTy->getAddressSpace()) { + SmallVector IdxList; + IdxList.push_back(Constant::getNullValue(Type::Int32Ty)); + const Type *ElTy = PTy->getElementType(); + while (ElTy != DPTy->getElementType()) { + if (const StructType *STy = dyn_cast(ElTy)) { + if (STy->getNumElements() == 0) break; + ElTy = STy->getElementType(0); + IdxList.push_back(Constant::getNullValue(Type::Int32Ty)); + } else if (const SequentialType *STy = + dyn_cast(ElTy)) { + if (isa(ElTy)) break; // Can't index into pointers! + ElTy = STy->getElementType(); + IdxList.push_back(IdxList[0]); + } else { + break; + } } + + if (ElTy == DPTy->getElementType()) + return ConstantExpr::getGetElementPtr(V, &IdxList[0], IdxList.size()); } - - if (ElTy == DPTy->getElementType()) - return ConstantExpr::getGetElementPtr(V, &IdxList[0], IdxList.size()); - } // Handle casts from one vector constant to another. We know that the src // and dest type have the same size (otherwise its an illegal cast). @@ -148,7 +150,7 @@ static Constant *FoldBitCast(Constant *V, const Type *DestTy) { if (DestTy->isFloatingPoint()) { assert((DestTy == Type::DoubleTy || DestTy == Type::FloatTy) && "Unknown FP type!"); - return ConstantFP::get(DestTy, APFloat(CI->getValue())); + return ConstantFP::get(APFloat(CI->getValue())); } // Otherwise, can't fold this (vector?) return 0; @@ -218,7 +220,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V, DestTy == Type::FP128Ty ? APFloat::IEEEquad : APFloat::Bogus, APFloat::rmNearestTiesToEven); - return ConstantFP::get(DestTy, Val); + return ConstantFP::get(Val); } return 0; // Can't fold. case Instruction::FPToUI: @@ -260,7 +262,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V, (void)apf.convertFromAPInt(api, opc==Instruction::SIToFP, APFloat::rmNearestTiesToEven); - return ConstantFP::get(DestTy, apf); + return ConstantFP::get(apf); } if (const ConstantVector *CV = dyn_cast(V)) { std::vector res; @@ -330,10 +332,10 @@ Constant *llvm::ConstantFoldExtractElementInstruction(const Constant *Val, if (const ConstantVector *CVal = dyn_cast(Val)) { if (const ConstantInt *CIdx = dyn_cast(Idx)) { - return const_cast(CVal->getOperand(CIdx->getZExtValue())); + return CVal->getOperand(CIdx->getZExtValue()); } else if (isa(Idx)) { // ee({w,x,y,z}, undef) -> w (an arbitrary value). - return const_cast(CVal->getOperand(0)); + return CVal->getOperand(0); } } return 0; @@ -392,6 +394,7 @@ Constant *llvm::ConstantFoldInsertElementInstruction(const Constant *Val, } return ConstantVector::get(Ops); } + return 0; } @@ -399,7 +402,7 @@ Constant *llvm::ConstantFoldInsertElementInstruction(const Constant *Val, /// return the specified element value. Otherwise return null. static Constant *GetVectorElement(const Constant *C, unsigned EltNo) { if (const ConstantVector *CV = dyn_cast(C)) - return const_cast(CV->getOperand(EltNo)); + return CV->getOperand(EltNo); const Type *EltTy = cast(C->getType())->getElementType(); if (isa(C)) @@ -445,6 +448,115 @@ Constant *llvm::ConstantFoldShuffleVectorInstruction(const Constant *V1, return ConstantVector::get(&Result[0], Result.size()); } +Constant *llvm::ConstantFoldExtractValueInstruction(const Constant *Agg, + const unsigned *Idxs, + unsigned NumIdx) { + // Base case: no indices, so return the entire value. + if (NumIdx == 0) + return const_cast(Agg); + + if (isa(Agg)) // ev(undef, x) -> undef + return UndefValue::get(ExtractValueInst::getIndexedType(Agg->getType(), + Idxs, + Idxs + NumIdx)); + + if (isa(Agg)) // ev(0, x) -> 0 + return + Constant::getNullValue(ExtractValueInst::getIndexedType(Agg->getType(), + Idxs, + Idxs + NumIdx)); + + // Otherwise recurse. + return ConstantFoldExtractValueInstruction(Agg->getOperand(*Idxs), + Idxs+1, NumIdx-1); +} + +Constant *llvm::ConstantFoldInsertValueInstruction(const Constant *Agg, + const Constant *Val, + const unsigned *Idxs, + unsigned NumIdx) { + // Base case: no indices, so replace the entire value. + if (NumIdx == 0) + return const_cast(Val); + + if (isa(Agg)) { + // Insertion of constant into aggregate undef + // Optimize away insertion of undef + if (isa(Val)) + return const_cast(Agg); + // Otherwise break the aggregate undef into multiple undefs and do + // the insertion + const CompositeType *AggTy = cast(Agg->getType()); + unsigned numOps; + if (const ArrayType *AR = dyn_cast(AggTy)) + numOps = AR->getNumElements(); + else + numOps = cast(AggTy)->getNumElements(); + std::vector Ops(numOps); + for (unsigned i = 0; i < numOps; ++i) { + const Type *MemberTy = AggTy->getTypeAtIndex(i); + const Constant *Op = + (*Idxs == i) ? + ConstantFoldInsertValueInstruction(UndefValue::get(MemberTy), + Val, Idxs+1, NumIdx-1) : + UndefValue::get(MemberTy); + Ops[i] = const_cast(Op); + } + if (isa(AggTy)) + return ConstantStruct::get(Ops); + else + return ConstantArray::get(cast(AggTy), Ops); + } + if (isa(Agg)) { + // Insertion of constant into aggregate zero + // Optimize away insertion of zero + if (Val->isNullValue()) + return const_cast(Agg); + // Otherwise break the aggregate zero into multiple zeros and do + // the insertion + const CompositeType *AggTy = cast(Agg->getType()); + unsigned numOps; + if (const ArrayType *AR = dyn_cast(AggTy)) + numOps = AR->getNumElements(); + else + numOps = cast(AggTy)->getNumElements(); + std::vector Ops(numOps); + for (unsigned i = 0; i < numOps; ++i) { + const Type *MemberTy = AggTy->getTypeAtIndex(i); + const Constant *Op = + (*Idxs == i) ? + ConstantFoldInsertValueInstruction(Constant::getNullValue(MemberTy), + Val, Idxs+1, NumIdx-1) : + Constant::getNullValue(MemberTy); + Ops[i] = const_cast(Op); + } + if (isa(AggTy)) + return ConstantStruct::get(Ops); + else + return ConstantArray::get(cast(AggTy), Ops); + } + if (isa(Agg) || isa(Agg)) { + // Insertion of constant into aggregate constant + std::vector Ops(Agg->getNumOperands()); + for (unsigned i = 0; i < Agg->getNumOperands(); ++i) { + const Constant *Op = + (*Idxs == i) ? + ConstantFoldInsertValueInstruction(Agg->getOperand(i), + Val, Idxs+1, NumIdx-1) : + Agg->getOperand(i); + Ops[i] = const_cast(Op); + } + Constant *C; + if (isa(Agg->getType())) + C = ConstantStruct::get(Ops); + else + C = ConstantArray::get(cast(Agg->getType()), Ops); + return C; + } + + return 0; +} + /// EvalVectorOp - Given two vector constants and a function pointer, apply the /// function pointer to each element pair, producing a new ConstantVector /// constant. Either or both of V1 and V2 may be NULL, meaning a @@ -517,115 +629,92 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, } } - if (const ConstantExpr *CE1 = dyn_cast(C1)) { - if (isa(C2)) { - // There are many possible foldings we could do here. We should probably - // at least fold add of a pointer with an integer into the appropriate - // getelementptr. This will improve alias analysis a bit. - } else { - // Just implement a couple of simple identities. - switch (Opcode) { - case Instruction::Add: - if (C2->isNullValue()) return const_cast(C1); // X + 0 == X - break; - case Instruction::Sub: - if (C2->isNullValue()) return const_cast(C1); // X - 0 == X - break; - case Instruction::Mul: - if (C2->isNullValue()) return const_cast(C2); // X * 0 == 0 - if (const ConstantInt *CI = dyn_cast(C2)) - if (CI->equalsInt(1)) - return const_cast(C1); // X * 1 == X - break; - case Instruction::UDiv: - case Instruction::SDiv: - if (const ConstantInt *CI = dyn_cast(C2)) - if (CI->equalsInt(1)) - return const_cast(C1); // X / 1 == X - break; - case Instruction::URem: - case Instruction::SRem: - if (const ConstantInt *CI = dyn_cast(C2)) - if (CI->equalsInt(1)) - return Constant::getNullValue(CI->getType()); // X % 1 == 0 - break; - case Instruction::And: - if (const ConstantInt *CI = dyn_cast(C2)) { - if (CI->isZero()) return const_cast(C2); // X & 0 == 0 - if (CI->isAllOnesValue()) - return const_cast(C1); // X & -1 == X - - // (zext i32 to i64) & 4294967295 -> (zext i32 to i64) - if (CE1->getOpcode() == Instruction::ZExt) { - APInt PossiblySetBits - = cast(CE1->getOperand(0)->getType())->getMask(); - PossiblySetBits.zext(C1->getType()->getPrimitiveSizeInBits()); - if ((PossiblySetBits & CI->getValue()) == PossiblySetBits) - return const_cast(C1); - } - } - if (CE1->isCast() && isa(CE1->getOperand(0))) { - GlobalValue *CPR = cast(CE1->getOperand(0)); - - // Functions are at least 4-byte aligned. If and'ing the address of a - // function with a constant < 4, fold it to zero. - if (const ConstantInt *CI = dyn_cast(C2)) - if (CI->getValue().ult(APInt(CI->getType()->getBitWidth(),4)) && - isa(CPR)) - return Constant::getNullValue(CI->getType()); - } - break; - case Instruction::Or: - if (C2->isNullValue()) return const_cast(C1); // X | 0 == X - if (const ConstantInt *CI = dyn_cast(C2)) - if (CI->isAllOnesValue()) - return const_cast(C2); // X | -1 == -1 - break; - case Instruction::Xor: - if (C2->isNullValue()) return const_cast(C1); // X ^ 0 == X - break; - case Instruction::AShr: - // ashr (zext C to Ty), C2 -> lshr (zext C, CSA), C2 - if (CE1->getOpcode() == Instruction::ZExt) // Top bits known zero. - return ConstantExpr::getLShr(const_cast(C1), - const_cast(C2)); - break; - } - } - } else if (isa(C2)) { - // If C2 is a constant expr and C1 isn't, flop them around and fold the - // other way if possible. + // Handle simplifications of the RHS when a constant int. + if (const ConstantInt *CI2 = dyn_cast(C2)) { switch (Opcode) { case Instruction::Add: + if (CI2->equalsInt(0)) return const_cast(C1); // X + 0 == X + break; + case Instruction::Sub: + if (CI2->equalsInt(0)) return const_cast(C1); // X - 0 == X + break; case Instruction::Mul: + if (CI2->equalsInt(0)) return const_cast(C2); // X * 0 == 0 + if (CI2->equalsInt(1)) + return const_cast(C1); // X * 1 == X + break; + case Instruction::UDiv: + case Instruction::SDiv: + if (CI2->equalsInt(1)) + return const_cast(C1); // X / 1 == X + break; + case Instruction::URem: + case Instruction::SRem: + if (CI2->equalsInt(1)) + return Constant::getNullValue(CI2->getType()); // X % 1 == 0 + break; case Instruction::And: + if (CI2->isZero()) return const_cast(C2); // X & 0 == 0 + if (CI2->isAllOnesValue()) + return const_cast(C1); // X & -1 == X + + if (const ConstantExpr *CE1 = dyn_cast(C1)) { + // (zext i32 to i64) & 4294967295 -> (zext i32 to i64) + if (CE1->getOpcode() == Instruction::ZExt) { + unsigned DstWidth = CI2->getType()->getBitWidth(); + unsigned SrcWidth = + CE1->getOperand(0)->getType()->getPrimitiveSizeInBits(); + APInt PossiblySetBits(APInt::getLowBitsSet(DstWidth, SrcWidth)); + if ((PossiblySetBits & CI2->getValue()) == PossiblySetBits) + return const_cast(C1); + } + + // If and'ing the address of a global with a constant, fold it. + if (CE1->getOpcode() == Instruction::PtrToInt && + isa(CE1->getOperand(0))) { + GlobalValue *GV = cast(CE1->getOperand(0)); + + // Functions are at least 4-byte aligned. + unsigned GVAlign = GV->getAlignment(); + if (isa(GV)) + GVAlign = std::max(GVAlign, 4U); + + if (GVAlign > 1) { + unsigned DstWidth = CI2->getType()->getBitWidth(); + unsigned SrcWidth = std::min(DstWidth, Log2_32(GVAlign)); + APInt BitsNotSet(APInt::getLowBitsSet(DstWidth, SrcWidth)); + + // If checking bits we know are clear, return zero. + if ((CI2->getValue() & BitsNotSet) == CI2->getValue()) + return Constant::getNullValue(CI2->getType()); + } + } + } + break; case Instruction::Or: + if (CI2->equalsInt(0)) return const_cast(C1); // X | 0 == X + if (CI2->isAllOnesValue()) + return const_cast(C2); // X | -1 == -1 + break; case Instruction::Xor: - // No change of opcode required. - return ConstantFoldBinaryInstruction(Opcode, C2, C1); - - case Instruction::Shl: - case Instruction::LShr: + if (CI2->equalsInt(0)) return const_cast(C1); // X ^ 0 == X + break; case Instruction::AShr: - case Instruction::Sub: - case Instruction::SDiv: - case Instruction::UDiv: - case Instruction::FDiv: - case Instruction::URem: - case Instruction::SRem: - case Instruction::FRem: - default: // These instructions cannot be flopped around. - return 0; + // ashr (zext C to Ty), C2 -> lshr (zext C, CSA), C2 + if (const ConstantExpr *CE1 = dyn_cast(C1)) + if (CE1->getOpcode() == Instruction::ZExt) // Top bits known zero. + return ConstantExpr::getLShr(const_cast(C1), + const_cast(C2)); + break; } } - - // At this point we know neither constant is an UndefValue nor a ConstantExpr - // so look at directly computing the value. + + // At this point we know neither constant is an UndefValue. if (const ConstantInt *CI1 = dyn_cast(C1)) { if (const ConstantInt *CI2 = dyn_cast(C2)) { using namespace APIntOps; - APInt C1V = CI1->getValue(); - APInt C2V = CI2->getValue(); + const APInt &C1V = CI1->getValue(); + const APInt &C2V = CI2->getValue(); switch (Opcode) { default: break; @@ -661,30 +750,27 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, return ConstantInt::get(C1V | C2V); case Instruction::Xor: return ConstantInt::get(C1V ^ C2V); - case Instruction::Shl: - if (uint32_t shiftAmt = C2V.getZExtValue()) { - if (shiftAmt < C1V.getBitWidth()) - return ConstantInt::get(C1V.shl(shiftAmt)); - else - return UndefValue::get(C1->getType()); // too big shift is undef - } - return const_cast(CI1); // Zero shift is identity - case Instruction::LShr: - if (uint32_t shiftAmt = C2V.getZExtValue()) { - if (shiftAmt < C1V.getBitWidth()) - return ConstantInt::get(C1V.lshr(shiftAmt)); - else - return UndefValue::get(C1->getType()); // too big shift is undef - } - return const_cast(CI1); // Zero shift is identity - case Instruction::AShr: - if (uint32_t shiftAmt = C2V.getZExtValue()) { - if (shiftAmt < C1V.getBitWidth()) - return ConstantInt::get(C1V.ashr(shiftAmt)); - else - return UndefValue::get(C1->getType()); // too big shift is undef - } - return const_cast(CI1); // Zero shift is identity + case Instruction::Shl: { + uint32_t shiftAmt = C2V.getZExtValue(); + if (shiftAmt < C1V.getBitWidth()) + return ConstantInt::get(C1V.shl(shiftAmt)); + else + return UndefValue::get(C1->getType()); // too big shift is undef + } + case Instruction::LShr: { + uint32_t shiftAmt = C2V.getZExtValue(); + if (shiftAmt < C1V.getBitWidth()) + return ConstantInt::get(C1V.lshr(shiftAmt)); + else + return UndefValue::get(C1->getType()); // too big shift is undef + } + case Instruction::AShr: { + uint32_t shiftAmt = C2V.getZExtValue(); + if (shiftAmt < C1V.getBitWidth()) + return ConstantInt::get(C1V.ashr(shiftAmt)); + else + return UndefValue::get(C1->getType()); // too big shift is undef + } } } } else if (const ConstantFP *CFP1 = dyn_cast(C1)) { @@ -692,30 +778,34 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, APFloat C1V = CFP1->getValueAPF(); APFloat C2V = CFP2->getValueAPF(); APFloat C3V = C1V; // copy for modification - bool isDouble = CFP1->getType()==Type::DoubleTy; switch (Opcode) { default: break; case Instruction::Add: (void)C3V.add(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); case Instruction::Sub: (void)C3V.subtract(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); case Instruction::Mul: (void)C3V.multiply(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); case Instruction::FDiv: (void)C3V.divide(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); case Instruction::FRem: - if (C2V.isZero()) + if (C2V.isZero()) { // IEEE 754, Section 7.1, #5 - return ConstantFP::get(CFP1->getType(), isDouble ? - APFloat(std::numeric_limits::quiet_NaN()) : - APFloat(std::numeric_limits::quiet_NaN())); + if (CFP1->getType() == Type::DoubleTy) + return ConstantFP::get(APFloat(std::numeric_limits:: + quiet_NaN())); + if (CFP1->getType() == Type::FloatTy) + return ConstantFP::get(APFloat(std::numeric_limits:: + quiet_NaN())); + break; + } (void)C3V.mod(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); } } } else if (const VectorType *VTy = dyn_cast(C1->getType())) { @@ -724,37 +814,68 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, if ((CP1 != NULL || isa(C1)) && (CP2 != NULL || isa(C2))) { switch (Opcode) { - default: - break; - case Instruction::Add: + default: + break; + case Instruction::Add: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getAdd); - case Instruction::Sub: + case Instruction::Sub: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getSub); - case Instruction::Mul: + case Instruction::Mul: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getMul); - case Instruction::UDiv: + case Instruction::UDiv: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getUDiv); - case Instruction::SDiv: + case Instruction::SDiv: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getSDiv); - case Instruction::FDiv: + case Instruction::FDiv: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getFDiv); - case Instruction::URem: + case Instruction::URem: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getURem); - case Instruction::SRem: + case Instruction::SRem: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getSRem); - case Instruction::FRem: + case Instruction::FRem: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getFRem); - case Instruction::And: + case Instruction::And: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getAnd); - case Instruction::Or: + case Instruction::Or: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getOr); - case Instruction::Xor: + case Instruction::Xor: return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getXor); } } } - // We don't know how to fold this + if (isa(C1)) { + // There are many possible foldings we could do here. We should probably + // at least fold add of a pointer with an integer into the appropriate + // getelementptr. This will improve alias analysis a bit. + } else if (isa(C2)) { + // If C2 is a constant expr and C1 isn't, flop them around and fold the + // other way if possible. + switch (Opcode) { + case Instruction::Add: + case Instruction::Mul: + case Instruction::And: + case Instruction::Or: + case Instruction::Xor: + // No change of opcode required. + return ConstantFoldBinaryInstruction(Opcode, C2, C1); + + case Instruction::Shl: + case Instruction::LShr: + case Instruction::AShr: + case Instruction::Sub: + case Instruction::SDiv: + case Instruction::UDiv: + case Instruction::FDiv: + case Instruction::URem: + case Instruction::SRem: + case Instruction::FRem: + default: // These instructions cannot be flopped around. + break; + } + } + + // We don't know how to fold this. return 0; } @@ -1211,9 +1332,9 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred, if (const ConstantVector *CP2 = dyn_cast(C2)) { if (pred == FCmpInst::FCMP_OEQ || pred == FCmpInst::FCMP_UEQ) { for (unsigned i = 0, e = CP1->getNumOperands(); i != e; ++i) { - Constant *C= ConstantExpr::getFCmp(FCmpInst::FCMP_OEQ, - const_cast(CP1->getOperand(i)), - const_cast(CP2->getOperand(i))); + Constant *C = ConstantExpr::getFCmp(FCmpInst::FCMP_OEQ, + CP1->getOperand(i), + CP2->getOperand(i)); if (ConstantInt *CB = dyn_cast(C)) return CB; } @@ -1222,8 +1343,8 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred, } else if (pred == ICmpInst::ICMP_EQ) { for (unsigned i = 0, e = CP1->getNumOperands(); i != e; ++i) { Constant *C = ConstantExpr::getICmp(ICmpInst::ICMP_EQ, - const_cast(CP1->getOperand(i)), - const_cast(CP2->getOperand(i))); + CP1->getOperand(i), + CP2->getOperand(i)); if (ConstantInt *CB = dyn_cast(C)) return CB; } @@ -1397,8 +1518,7 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C, const PointerType *Ptr = cast(C->getType()); const Type *Ty = GetElementPtrInst::getIndexedType(Ptr, (Value **)Idxs, - (Value **)Idxs+NumIdx, - true); + (Value **)Idxs+NumIdx); assert(Ty != 0 && "Invalid indices for GEP!"); return UndefValue::get(PointerType::get(Ty, Ptr->getAddressSpace())); } @@ -1415,8 +1535,7 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C, const PointerType *Ptr = cast(C->getType()); const Type *Ty = GetElementPtrInst::getIndexedType(Ptr, (Value**)Idxs, - (Value**)Idxs+NumIdx, - true); + (Value**)Idxs+NumIdx); assert(Ty != 0 && "Invalid indices for GEP!"); return ConstantPointerNull::get(PointerType::get(Ty,Ptr->getAddressSpace()));