mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
[Reassociate] Don't reassociate when mixing regular and fast-math FP
instructions. Inlining might cause such cases and it's not valid to reassociate floating-point instructions without the unsafe algebra flag. Patch by Mehdi Amini <mehdi_amini@apple.com>! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221462 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -237,7 +237,9 @@ FunctionPass *llvm::createReassociatePass() { return new Reassociate(); }
|
||||
/// opcode and if it only has one use.
|
||||
static BinaryOperator *isReassociableOp(Value *V, unsigned Opcode) {
|
||||
if (V->hasOneUse() && isa<Instruction>(V) &&
|
||||
cast<Instruction>(V)->getOpcode() == Opcode)
|
||||
cast<Instruction>(V)->getOpcode() == Opcode &&
|
||||
(!isa<FPMathOperator>(V) ||
|
||||
cast<Instruction>(V)->hasUnsafeAlgebra()))
|
||||
return cast<BinaryOperator>(V);
|
||||
return nullptr;
|
||||
}
|
||||
@@ -246,7 +248,9 @@ static BinaryOperator *isReassociableOp(Value *V, unsigned Opcode1,
|
||||
unsigned Opcode2) {
|
||||
if (V->hasOneUse() && isa<Instruction>(V) &&
|
||||
(cast<Instruction>(V)->getOpcode() == Opcode1 ||
|
||||
cast<Instruction>(V)->getOpcode() == Opcode2))
|
||||
cast<Instruction>(V)->getOpcode() == Opcode2) &&
|
||||
(!isa<FPMathOperator>(V) ||
|
||||
cast<Instruction>(V)->hasUnsafeAlgebra()))
|
||||
return cast<BinaryOperator>(V);
|
||||
return nullptr;
|
||||
}
|
||||
@@ -662,7 +666,9 @@ static bool LinearizeExprTree(BinaryOperator *I,
|
||||
// expression. This means that it can safely be modified. See if we
|
||||
// can usefully morph it into an expression of the right kind.
|
||||
assert((!isa<Instruction>(Op) ||
|
||||
cast<Instruction>(Op)->getOpcode() != Opcode) &&
|
||||
cast<Instruction>(Op)->getOpcode() != Opcode
|
||||
|| (isa<FPMathOperator>(Op) &&
|
||||
!cast<Instruction>(Op)->hasUnsafeAlgebra())) &&
|
||||
"Should have been handled above!");
|
||||
assert(Op->hasOneUse() && "Has uses outside the expression tree!");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user