diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2014-09-02 20:03:00 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2014-09-02 20:03:00 +0000 |
| commit | b2325b9ab36584c43b762295aa36db0a62413c93 (patch) | |
| tree | bcc7b1864a315e09569727011cbeb1ee3acec70f /llvm/lib | |
| parent | 0e893f53dd302f2af3550c058c2baef715204a30 (diff) | |
| download | bcm5719-llvm-b2325b9ab36584c43b762295aa36db0a62413c93.tar.gz bcm5719-llvm-b2325b9ab36584c43b762295aa36db0a62413c93.zip | |
Fix a logic bug when copying fast-math flags.
"Setting" does not equal "copying". This bug has sat dormant for 2 reasons:
1. The unit test was not adequate.
2. Every current user of the "copyFastMathFlags" API is operating on a new instruction.
(ie, all existing fast-math flags are off). If you copy flags to an existing
instruction that has some flags on already, you will not necessarily turn them off
as expected.
I uncovered this bug while trying to implement a fix for PR20802.
llvm-svn: 216939
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/IR/Instruction.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/IR/Instructions.cpp | 2 |
2 files changed, 7 insertions, 2 deletions
diff --git a/llvm/lib/IR/Instruction.cpp b/llvm/lib/IR/Instruction.cpp index 86421c4ae9f..50b1f04d41e 100644 --- a/llvm/lib/IR/Instruction.cpp +++ b/llvm/lib/IR/Instruction.cpp @@ -143,6 +143,11 @@ void Instruction::setFastMathFlags(FastMathFlags FMF) { cast<FPMathOperator>(this)->setFastMathFlags(FMF); } +void Instruction::copyFastMathFlags(FastMathFlags FMF) { + assert(isa<FPMathOperator>(this) && "copying fast-math flag on invalid op"); + cast<FPMathOperator>(this)->copyFastMathFlags(FMF); +} + /// Determine whether the unsafe-algebra flag is set. bool Instruction::hasUnsafeAlgebra() const { assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op"); @@ -183,7 +188,7 @@ FastMathFlags Instruction::getFastMathFlags() const { /// Copy I's fast-math flags void Instruction::copyFastMathFlags(const Instruction *I) { - setFastMathFlags(I->getFastMathFlags()); + copyFastMathFlags(I->getFastMathFlags()); } diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 16993f1bba5..b113d51d416 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -2043,7 +2043,7 @@ void BinaryOperator::copyFlags(const Value *V) { // Copy the fast-math flags. if (auto *FP = dyn_cast<FPMathOperator>(V)) - setFastMathFlags(FP->getFastMathFlags()); + copyFastMathFlags(FP->getFastMathFlags()); } //===----------------------------------------------------------------------===// |

