mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
minor cleanups, teach instcombine that sitofp/uitofp cannot
produce a negative zero. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51272 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0c7a9a04e7
commit
0a2d74bd53
@ -834,10 +834,11 @@ void InstCombiner::ComputeMaskedBits(Value *V, const APInt &Mask,
|
|||||||
case Instruction::IntToPtr:
|
case Instruction::IntToPtr:
|
||||||
// We can't handle these if we don't know the pointer size.
|
// We can't handle these if we don't know the pointer size.
|
||||||
if (!TD) return;
|
if (!TD) return;
|
||||||
// Fall through and handle them the same as zext/trunc.
|
// FALL THROUGH and handle them the same as zext/trunc.
|
||||||
case Instruction::ZExt:
|
case Instruction::ZExt:
|
||||||
case Instruction::Trunc: {
|
case Instruction::Trunc: {
|
||||||
// All these have integer operands
|
// Note that we handle pointer operands here because of inttoptr/ptrtoint
|
||||||
|
// which fall through here.
|
||||||
const Type *SrcTy = I->getOperand(0)->getType();
|
const Type *SrcTy = I->getOperand(0)->getType();
|
||||||
uint32_t SrcBitWidth = TD ?
|
uint32_t SrcBitWidth = TD ?
|
||||||
TD->getTypeSizeInBits(SrcTy) :
|
TD->getTypeSizeInBits(SrcTy) :
|
||||||
@ -2339,13 +2340,17 @@ static bool CannotBeNegativeZero(const Value *V) {
|
|||||||
if (const ConstantFP *CFP = dyn_cast<ConstantFP>(V))
|
if (const ConstantFP *CFP = dyn_cast<ConstantFP>(V))
|
||||||
return !CFP->getValueAPF().isNegZero();
|
return !CFP->getValueAPF().isNegZero();
|
||||||
|
|
||||||
// (add x, 0.0) is guaranteed to return +0.0, not -0.0.
|
|
||||||
if (const Instruction *I = dyn_cast<Instruction>(V)) {
|
if (const Instruction *I = dyn_cast<Instruction>(V)) {
|
||||||
|
// (add x, 0.0) is guaranteed to return +0.0, not -0.0.
|
||||||
if (I->getOpcode() == Instruction::Add &&
|
if (I->getOpcode() == Instruction::Add &&
|
||||||
isa<ConstantFP>(I->getOperand(1)) &&
|
isa<ConstantFP>(I->getOperand(1)) &&
|
||||||
cast<ConstantFP>(I->getOperand(1))->isNullValue())
|
cast<ConstantFP>(I->getOperand(1))->isNullValue())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// sitofp and uitofp turn into +0.0 for zero.
|
||||||
|
if (isa<SIToFPInst>(I) || isa<UIToFPInst>(I))
|
||||||
|
return true;
|
||||||
|
|
||||||
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I))
|
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I))
|
||||||
if (II->getIntrinsicID() == Intrinsic::sqrt)
|
if (II->getIntrinsicID() == Intrinsic::sqrt)
|
||||||
return CannotBeNegativeZero(II->getOperand(1));
|
return CannotBeNegativeZero(II->getOperand(1));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user