Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1672,12 +1672,9 @@ static Instruction *reassociateFCmps(BinaryOperator &BO,

// and (fcmp ord X, 0), (and (fcmp ord Y, 0), Z) --> and (fcmp ord X, Y), Z
// or (fcmp uno X, 0), (or (fcmp uno Y, 0), Z) --> or (fcmp uno X, Y), Z
Value *NewFCmp = Builder.CreateFCmp(NanPred, X, Y);
if (auto *NewFCmpInst = dyn_cast<FCmpInst>(NewFCmp)) {
// Intersect FMF from the 2 source fcmps.
NewFCmpInst->copyIRFlags(Op0);
NewFCmpInst->andIRFlags(BO10);
}
// Intersect FMF from the 2 source fcmps.
Value *NewFCmp =
Builder.CreateFCmpFMF(NanPred, X, Y, FMFSource::intersect(Op0, BO10));
return BinaryOperator::Create(Opcode, NewFCmp, BO11);
}

Expand Down
34 changes: 13 additions & 21 deletions llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2500,13 +2500,12 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
default:
llvm_unreachable("unexpected intrinsic ID");
}
Value *V = Builder.CreateBinaryIntrinsic(
IID, X, ConstantFP::get(Arg0->getType(), Res), II);
// TODO: Conservatively intersecting FMF. If Res == C2, the transform
// was a simplification (so Arg0 and its original flags could
// propagate?)
if (auto *CI = dyn_cast<CallInst>(V))
CI->andIRFlags(M);
Value *V = Builder.CreateBinaryIntrinsic(
IID, X, ConstantFP::get(Arg0->getType(), Res),
FMFSource::intersect(II, M));
return replaceInstUsesWith(*II, V);
}
}
Expand Down Expand Up @@ -2601,13 +2600,11 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
}
case Intrinsic::fmuladd: {
// Try to simplify the underlying FMul.
if (Value *V = simplifyFMulInst(II->getArgOperand(0), II->getArgOperand(1),
II->getFastMathFlags(),
SQ.getWithInstruction(II))) {
auto *FAdd = BinaryOperator::CreateFAdd(V, II->getArgOperand(2));
FAdd->copyFastMathFlags(II);
return FAdd;
}
if (Value *V =
simplifyFMulInst(II->getArgOperand(0), II->getArgOperand(1),
II->getFastMathFlags(), SQ.getWithInstruction(II)))
return BinaryOperator::CreateFAddFMF(V, II->getArgOperand(2),
II->getFastMathFlags());

[[fallthrough]];
}
Expand All @@ -2634,11 +2631,8 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
// Try to simplify the underlying FMul. We can only apply simplifications
// that do not require rounding.
if (Value *V = simplifyFMAFMul(Src0, Src1, II->getFastMathFlags(),
SQ.getWithInstruction(II))) {
auto *FAdd = BinaryOperator::CreateFAdd(V, Src2);
FAdd->copyFastMathFlags(II);
return FAdd;
}
SQ.getWithInstruction(II)))
return BinaryOperator::CreateFAddFMF(V, Src2, II->getFastMathFlags());

// fma x, y, 0 -> fmul x, y
// This is always valid for -0.0, but requires nsz for +0.0 as
Expand Down Expand Up @@ -2732,8 +2726,7 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
m_CopySign(m_Value(Magnitude), m_Value(Sign)))) {
// fabs (copysign x, y) -> (fabs x)
CallInst *AbsSign =
Builder.CreateCall(II->getCalledFunction(), {Magnitude});
AbsSign->copyFastMathFlags(II);
Builder.CreateUnaryIntrinsic(Intrinsic::fabs, Magnitude, II);
return replaceInstUsesWith(*II, AbsSign);
}

Expand Down Expand Up @@ -2840,16 +2833,15 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
Value *NewLdexp = nullptr;
Value *Select = nullptr;
if (match(SelectRHS, m_ZeroInt())) {
NewLdexp = Builder.CreateLdexp(Src, SelectLHS);
NewLdexp = Builder.CreateLdexp(Src, SelectLHS, II);
Select = Builder.CreateSelect(SelectCond, NewLdexp, Src);
} else if (match(SelectLHS, m_ZeroInt())) {
NewLdexp = Builder.CreateLdexp(Src, SelectRHS);
NewLdexp = Builder.CreateLdexp(Src, SelectRHS, II);
Select = Builder.CreateSelect(SelectCond, Src, NewLdexp);
}

if (NewLdexp) {
Select->takeName(II);
cast<Instruction>(NewLdexp)->copyFastMathFlags(II);
return replaceInstUsesWith(*II, Select);
}
}
Expand Down
Loading