diff options
| author | Arnold Schwaighofer <aschwaighofer@apple.com> | 2014-03-05 21:10:47 +0000 | 
|---|---|---|
| committer | Arnold Schwaighofer <aschwaighofer@apple.com> | 2014-03-05 21:10:47 +0000 | 
| commit | ab12363c02376563fd70af2a2865d381109e2778 (patch) | |
| tree | 55a5e6008fcdadcb9d60f5e7761f53d040f01a92 /llvm/lib/Transforms | |
| parent | 191b95125a5638d3931094a98a658bd730ff1cbb (diff) | |
| download | bcm5719-llvm-ab12363c02376563fd70af2a2865d381109e2778.tar.gz bcm5719-llvm-ab12363c02376563fd70af2a2865d381109e2778.zip | |
LoopVectorizer: Preserve fast-math flags
Fixes PR19045.
llvm-svn: 203008
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 26 | 
1 files changed, 21 insertions, 5 deletions
| diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 573df567de9..77633a562a6 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2489,6 +2489,16 @@ static void cse(SmallVector<BasicBlock *, 4> &BBs) {    }  } +/// \brief Adds a 'fast' flag to floating point operations. +static Value *addFastMathFlag(Value *V) { +  if (isa<FPMathOperator>(V)){ +    FastMathFlags Flags; +    Flags.setUnsafeAlgebra(); +    cast<Instruction>(V)->setFastMathFlags(Flags); +  } +  return V; +} +  void InnerLoopVectorizer::vectorizeLoop() {    //===------------------------------------------------===//    // @@ -2632,9 +2642,10 @@ void InnerLoopVectorizer::vectorizeLoop() {      setDebugLocFromInst(Builder, ReducedPartRdx);      for (unsigned part = 1; part < UF; ++part) {        if (Op != Instruction::ICmp && Op != Instruction::FCmp) -        ReducedPartRdx = Builder.CreateBinOp((Instruction::BinaryOps)Op, -                                             RdxParts[part], ReducedPartRdx, -                                             "bin.rdx"); +        // Floating point operations had to be 'fast' to enable the reduction. +        ReducedPartRdx = addFastMathFlag( +            Builder.CreateBinOp((Instruction::BinaryOps)Op, RdxParts[part], +                                ReducedPartRdx, "bin.rdx"));        else          ReducedPartRdx = createMinMaxOp(Builder, RdxDesc.MinMaxKind,                                          ReducedPartRdx, RdxParts[part]); @@ -2664,8 +2675,9 @@ void InnerLoopVectorizer::vectorizeLoop() {                                      "rdx.shuf");          if (Op != Instruction::ICmp && Op != Instruction::FCmp) -          TmpVec = Builder.CreateBinOp((Instruction::BinaryOps)Op, TmpVec, Shuf, -                                       "bin.rdx"); +          // Floating point operations had to be 'fast' to enable the reduction. +          TmpVec = addFastMathFlag(Builder.CreateBinOp( +              (Instruction::BinaryOps)Op, TmpVec, Shuf, "bin.rdx"));          else            TmpVec = createMinMaxOp(Builder, RdxDesc.MinMaxKind, TmpVec, Shuf);        } @@ -2999,6 +3011,10 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {          if (VecOp && isa<PossiblyExactOperator>(VecOp))            VecOp->setIsExact(BinOp->isExact()); +        // Copy the fast-math flags. +        if (VecOp && isa<FPMathOperator>(V)) +          VecOp->setFastMathFlags(it->getFastMathFlags()); +          Entry[Part] = V;        }        break; | 

