From 774cec5748bf34c7c0571c1f3c730f9990220a44 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Sat, 18 Jan 2014 00:48:14 +0000 Subject: Fix more instances of dropped fast math flags when optimizing FADD instructions. All found by inspection (aka grep). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199528 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineCasts.cpp | 21 +++++++++++++++++---- lib/Transforms/InstCombine/InstCombineSelect.cpp | 17 ++++++++++++++--- lib/Transforms/InstCombine/InstCombineVectorOps.cpp | 2 ++ 3 files changed, 33 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/Transforms/InstCombine/InstCombineCasts.cpp b/lib/Transforms/InstCombine/InstCombineCasts.cpp index 71990a27ac..29ab6c0623 100644 --- a/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -1232,7 +1232,10 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) { LHSOrig = Builder->CreateFPExt(LHSOrig, CI.getType()); if (RHSOrig->getType() != CI.getType()) RHSOrig = Builder->CreateFPExt(RHSOrig, CI.getType()); - return BinaryOperator::Create(OpI->getOpcode(), LHSOrig, RHSOrig); + Instruction *RI = + BinaryOperator::Create(OpI->getOpcode(), LHSOrig, RHSOrig); + RI->copyFastMathFlags(OpI); + return RI; } break; case Instruction::FMul: @@ -1246,7 +1249,10 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) { LHSOrig = Builder->CreateFPExt(LHSOrig, CI.getType()); if (RHSOrig->getType() != CI.getType()) RHSOrig = Builder->CreateFPExt(RHSOrig, CI.getType()); - return BinaryOperator::CreateFMul(LHSOrig, RHSOrig); + Instruction *RI = + BinaryOperator::CreateFMul(LHSOrig, RHSOrig); + RI->copyFastMathFlags(OpI); + return RI; } break; case Instruction::FDiv: @@ -1261,7 +1267,10 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) { LHSOrig = Builder->CreateFPExt(LHSOrig, CI.getType()); if (RHSOrig->getType() != CI.getType()) RHSOrig = Builder->CreateFPExt(RHSOrig, CI.getType()); - return BinaryOperator::CreateFDiv(LHSOrig, RHSOrig); + Instruction *RI = + BinaryOperator::CreateFDiv(LHSOrig, RHSOrig); + RI->copyFastMathFlags(OpI); + return RI; } break; case Instruction::FRem: @@ -1274,6 +1283,8 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) { else if (RHSWidth <= SrcWidth) RHSOrig = Builder->CreateFPExt(RHSOrig, LHSOrig->getType()); Value *ExactResult = Builder->CreateFRem(LHSOrig, RHSOrig); + if (Instruction *RI = dyn_cast(ExactResult)) + RI->copyFastMathFlags(OpI); return CastInst::CreateFPCast(ExactResult, CI.getType()); } @@ -1281,7 +1292,9 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) { if (BinaryOperator::isFNeg(OpI)) { Value *InnerTrunc = Builder->CreateFPTrunc(OpI->getOperand(1), CI.getType()); - return BinaryOperator::CreateFNeg(InnerTrunc); + Instruction *RI = BinaryOperator::CreateFNeg(InnerTrunc); + RI->copyFastMathFlags(OpI); + return RI; } } diff --git a/lib/Transforms/InstCombine/InstCombineSelect.cpp b/lib/Transforms/InstCombine/InstCombineSelect.cpp index 283bec2881..555ffc7752 100644 --- a/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -901,6 +901,11 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { Value *NegVal; // Compute -Z if (SI.getType()->isFPOrFPVectorTy()) { NegVal = Builder->CreateFNeg(SubOp->getOperand(1)); + if (Instruction *NegInst = dyn_cast(NegVal)) { + FastMathFlags Flags = AddOp->getFastMathFlags(); + Flags &= SubOp->getFastMathFlags(); + NegInst->setFastMathFlags(Flags); + } } else { NegVal = Builder->CreateNeg(SubOp->getOperand(1)); } @@ -913,9 +918,15 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { Builder->CreateSelect(CondVal, NewTrueOp, NewFalseOp, SI.getName() + ".p"); - if (SI.getType()->isFPOrFPVectorTy()) - return BinaryOperator::CreateFAdd(SubOp->getOperand(0), NewSel); - else + if (SI.getType()->isFPOrFPVectorTy()) { + Instruction *RI = + BinaryOperator::CreateFAdd(SubOp->getOperand(0), NewSel); + + FastMathFlags Flags = AddOp->getFastMathFlags(); + Flags &= SubOp->getFastMathFlags(); + RI->setFastMathFlags(Flags); + return RI; + } else return BinaryOperator::CreateAdd(SubOp->getOperand(0), NewSel); } } diff --git a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index c0b9b2fc3e..178be61b43 100644 --- a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -638,6 +638,8 @@ static Value *BuildNew(Instruction *I, ArrayRef NewOps) { if (isa(BO)) { New->setIsExact(BO->isExact()); } + if (isa(BO)) + New->copyFastMathFlags(I); return New; } case Instruction::ICmp: -- cgit v1.2.3