mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 16:29:20 +00:00
InstCombine: Replace manual fast math flag copying with the new IRBuilder RAII helper.
Defines away the issue where cast<Instruction> would fail because constant folding happened. Also slightly cleaner. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191674 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
adb412daa4
commit
6dc5c6b879
@ -463,10 +463,9 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {
|
||||
if (Swap && FAddSub->getOpcode() == Instruction::FSub)
|
||||
std::swap(M0, M1);
|
||||
|
||||
Value *R = (FAddSub->getOpcode() == Instruction::FAdd) ?
|
||||
BinaryOperator::CreateFAdd(M0, M1) :
|
||||
BinaryOperator::CreateFSub(M0, M1);
|
||||
Instruction *RI = cast<Instruction>(R);
|
||||
Instruction *RI = (FAddSub->getOpcode() == Instruction::FAdd)
|
||||
? BinaryOperator::CreateFAdd(M0, M1)
|
||||
: BinaryOperator::CreateFSub(M0, M1);
|
||||
RI->copyFastMathFlags(&I);
|
||||
return RI;
|
||||
}
|
||||
@ -493,13 +492,13 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {
|
||||
}
|
||||
// if pattern detected emit alternate sequence
|
||||
if (OpX && OpY) {
|
||||
BuilderTy::FastMathFlagGuard Guard(*Builder);
|
||||
Builder->SetFastMathFlags(Log2->getFastMathFlags());
|
||||
Log2->setArgOperand(0, OpY);
|
||||
Value *FMulVal = Builder->CreateFMul(OpX, Log2);
|
||||
Instruction *FMul = cast<Instruction>(FMulVal);
|
||||
FMul->copyFastMathFlags(Log2);
|
||||
Instruction *FSub = BinaryOperator::CreateFSub(FMulVal, OpX);
|
||||
FSub->copyFastMathFlags(Log2);
|
||||
return FSub;
|
||||
Value *FSub = Builder->CreateFSub(FMulVal, OpX);
|
||||
FSub->takeName(&I);
|
||||
return ReplaceInstUsesWith(I, FSub);
|
||||
}
|
||||
}
|
||||
|
||||
@ -509,6 +508,9 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {
|
||||
for (int i = 0; i < 2; i++) {
|
||||
bool IgnoreZeroSign = I.hasNoSignedZeros();
|
||||
if (BinaryOperator::isFNeg(Opnd0, IgnoreZeroSign)) {
|
||||
BuilderTy::FastMathFlagGuard Guard(*Builder);
|
||||
Builder->SetFastMathFlags(I.getFastMathFlags());
|
||||
|
||||
Value *N0 = dyn_castFNegVal(Opnd0, IgnoreZeroSign);
|
||||
Value *N1 = dyn_castFNegVal(Opnd1, IgnoreZeroSign);
|
||||
|
||||
@ -519,13 +521,9 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {
|
||||
if (Opnd0->hasOneUse()) {
|
||||
// -X * Y => -(X*Y) (Promote negation as high as possible)
|
||||
Value *T = Builder->CreateFMul(N0, Opnd1);
|
||||
Instruction *Neg = BinaryOperator::CreateFNeg(T);
|
||||
if (I.getFastMathFlags().any()) {
|
||||
if (Instruction *TI = dyn_cast<Instruction>(T))
|
||||
TI->copyFastMathFlags(&I);
|
||||
Neg->copyFastMathFlags(&I);
|
||||
}
|
||||
return Neg;
|
||||
Value *Neg = Builder->CreateFNeg(T);
|
||||
Neg->takeName(&I);
|
||||
return ReplaceInstUsesWith(I, Neg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -548,13 +546,13 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {
|
||||
Y = Opnd0_0;
|
||||
|
||||
if (Y) {
|
||||
Instruction *T = cast<Instruction>(Builder->CreateFMul(Opnd1, Opnd1));
|
||||
T->copyFastMathFlags(&I);
|
||||
T->setDebugLoc(I.getDebugLoc());
|
||||
BuilderTy::FastMathFlagGuard Guard(*Builder);
|
||||
Builder->SetFastMathFlags(I.getFastMathFlags());
|
||||
Value *T = Builder->CreateFMul(Opnd1, Opnd1);
|
||||
|
||||
Instruction *R = BinaryOperator::CreateFMul(T, Y);
|
||||
R->copyFastMathFlags(&I);
|
||||
return R;
|
||||
Value *R = Builder->CreateFMul(T, Y);
|
||||
R->takeName(&I);
|
||||
return ReplaceInstUsesWith(I, R);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user