X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FConstantFold.cpp;h=ff4d897e54a8b945d1d49ff959a424f49452b943;hb=b5bd026a756d8650f2a94607c9b1dc34cf1c024a;hp=9fa41b373cd7ee65a3c4873d39fe59255c064bc9;hpb=aeb06d246254e4829a49164a11eacced9a43d9d4;p=oota-llvm.git diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 9fa41b373cd..ff4d897e54a 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -153,26 +153,20 @@ static Constant *FoldBitCast(Constant *V, const Type *DestTy) { // Integral -> Integral. This is a no-op because the bit widths must // be the same. Consequently, we just fold to V. return V; - - if (DestTy->isFloatingPoint()) { - assert((DestTy == Type::DoubleTy || DestTy == Type::FloatTy) && - "Unknown FP type!"); - return ConstantFP::get(APFloat(CI->getValue())); - } + + if (DestTy->isFloatingPoint()) + return ConstantFP::get(APFloat(CI->getValue(), + DestTy != Type::PPC_FP128Ty)); + // Otherwise, can't fold this (vector?) return 0; } - + // Handle ConstantFP input. - if (const ConstantFP *FP = dyn_cast(V)) { + if (const ConstantFP *FP = dyn_cast(V)) // FP -> Integral. - if (DestTy == Type::Int32Ty) { - return ConstantInt::get(FP->getValueAPF().bitcastToAPInt()); - } else { - assert(DestTy == Type::Int64Ty && "only support f32/f64 for now!"); - return ConstantInt::get(FP->getValueAPF().bitcastToAPInt()); - } - } + return ConstantInt::get(FP->getValueAPF().bitcastToAPInt()); + return 0; } @@ -655,11 +649,15 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, case Instruction::SDiv: if (CI2->equalsInt(1)) return const_cast(C1); // X / 1 == X + if (CI2->equalsInt(0)) + return UndefValue::get(CI2->getType()); // X / 0 == undef break; case Instruction::URem: case Instruction::SRem: if (CI2->equalsInt(1)) return Constant::getNullValue(CI2->getType()); // X % 1 == 0 + if (CI2->equalsInt(0)) + return UndefValue::get(CI2->getType()); // X % 0 == undef break; case Instruction::And: if (CI2->isZero()) return const_cast(C2); // X & 0 == 0 @@ -733,24 +731,20 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, case Instruction::Mul: return ConstantInt::get(C1V * C2V); case Instruction::UDiv: - if (CI2->isNullValue()) - return 0; // X / 0 -> can't fold + assert(!CI2->isNullValue() && "Div by zero handled above"); return ConstantInt::get(C1V.udiv(C2V)); case Instruction::SDiv: - if (CI2->isNullValue()) - return 0; // X / 0 -> can't fold + assert(!CI2->isNullValue() && "Div by zero handled above"); if (C2V.isAllOnesValue() && C1V.isMinSignedValue()) - return 0; // MIN_INT / -1 -> overflow + return UndefValue::get(CI1->getType()); // MIN_INT / -1 -> undef return ConstantInt::get(C1V.sdiv(C2V)); case Instruction::URem: - if (C2->isNullValue()) - return 0; // X / 0 -> can't fold + assert(!CI2->isNullValue() && "Div by zero handled above"); return ConstantInt::get(C1V.urem(C2V)); - case Instruction::SRem: - if (CI2->isNullValue()) - return 0; // X % 0 -> can't fold + case Instruction::SRem: + assert(!CI2->isNullValue() && "Div by zero handled above"); if (C2V.isAllOnesValue() && C1V.isMinSignedValue()) - return 0; // MIN_INT % -1 -> overflow + return UndefValue::get(CI1->getType()); // MIN_INT % -1 -> undef return ConstantInt::get(C1V.srem(C2V)); case Instruction::And: return ConstantInt::get(C1V & C2V); @@ -802,16 +796,6 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, (void)C3V.divide(C2V, APFloat::rmNearestTiesToEven); return ConstantFP::get(C3V); case Instruction::FRem: - if (C2V.isZero()) { - // IEEE 754, Section 7.1, #5 - 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(C3V); }