From: Chris Lattner Date: Mon, 19 May 2008 20:25:04 +0000 (+0000) Subject: convert fptosi(sitofp x) -> x if the fp value has enough bits in its mantissa X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0c7a9a04e7cdd764fca606383aa694f83f880abe;p=oota-llvm.git convert fptosi(sitofp x) -> x if the fp value has enough bits in its mantissa to accurately represent the integer. This triggers 9 times in 471.omnetpp, though 8 of those seem to be inlined from the same place. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51271 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index fff6dba7ee4..46dba398cfe 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -208,8 +208,8 @@ namespace { Instruction *visitSExt(SExtInst &CI); Instruction *visitFPTrunc(FPTruncInst &CI); Instruction *visitFPExt(CastInst &CI); - Instruction *visitFPToUI(CastInst &CI); - Instruction *visitFPToSI(CastInst &CI); + Instruction *visitFPToUI(FPToUIInst &FI); + Instruction *visitFPToSI(FPToSIInst &FI); Instruction *visitUIToFP(CastInst &CI); Instruction *visitSIToFP(CastInst &CI); Instruction *visitPtrToInt(CastInst &CI); @@ -2439,9 +2439,9 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) { } while (Size >= 1); // FIXME: This shouldn't be necessary. When the backends can handle types - // with funny bit widths then this whole cascade of if statements should - // be removed. It is just here to get the size of the "middle" type back - // up to something that the back ends can handle. + // with funny bit widths then this switch statement should be removed. It + // is just here to get the size of the "middle" type back up to something + // that the back ends can handle. const Type *MiddleType = 0; switch (Size) { default: break; @@ -7995,12 +7995,30 @@ Instruction *InstCombiner::visitFPExt(CastInst &CI) { return commonCastTransforms(CI); } -Instruction *InstCombiner::visitFPToUI(CastInst &CI) { - return commonCastTransforms(CI); +Instruction *InstCombiner::visitFPToUI(FPToUIInst &FI) { + // fptoui(uitofp(X)) --> X if the intermediate type has enough bits in its + // mantissa to accurately represent all values of X. For example, do not + // do this with i64->float->i64. + if (UIToFPInst *SrcI = dyn_cast(FI.getOperand(0))) + if (SrcI->getOperand(0)->getType() == FI.getType() && + (int)FI.getType()->getPrimitiveSizeInBits() < /*extra bit for sign */ + GetFPMantissaWidth(SrcI->getType())) + return ReplaceInstUsesWith(FI, SrcI->getOperand(0)); + + return commonCastTransforms(FI); } -Instruction *InstCombiner::visitFPToSI(CastInst &CI) { - return commonCastTransforms(CI); +Instruction *InstCombiner::visitFPToSI(FPToSIInst &FI) { + // fptosi(sitofp(X)) --> X if the intermediate type has enough bits in its + // mantissa to accurately represent all values of X. For example, do not + // do this with i64->float->i64. + if (SIToFPInst *SrcI = dyn_cast(FI.getOperand(0))) + if (SrcI->getOperand(0)->getType() == FI.getType() && + (int)FI.getType()->getPrimitiveSizeInBits() <= + GetFPMantissaWidth(SrcI->getType())) + return ReplaceInstUsesWith(FI, SrcI->getOperand(0)); + + return commonCastTransforms(FI); } Instruction *InstCombiner::visitUIToFP(CastInst &CI) { diff --git a/test/Transforms/InstCombine/sitofp.ll b/test/Transforms/InstCombine/sitofp.ll index fd06dea47bf..f7b1c915659 100644 --- a/test/Transforms/InstCombine/sitofp.ll +++ b/test/Transforms/InstCombine/sitofp.ll @@ -23,3 +23,11 @@ define i1 @test4(i8 %A) { ret i1 %C ; A != 127 } +define i32 @test5(i32 %A) { + %B = sitofp i32 %A to double + %C = fptosi double %B to i32 + %D = uitofp i32 %C to double + %E = fptoui double %D to i32 + ret i32 %E +} +