diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 20 | 
1 files changed, 20 insertions, 0 deletions
| diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 1955802cc6e..66452a5d986 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -350,6 +350,26 @@ Value *llvm::SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,      }    } +  // If the comparison is with the result of a select instruction, check whether +  // comparing with either branch of the select always yields the same value. +  if (isa<SelectInst>(LHS) || isa<SelectInst>(RHS)) { +    // Make sure the select is on the LHS. +    if (!isa<SelectInst>(LHS)) { +      std::swap(LHS, RHS); +      Pred = CmpInst::getSwappedPredicate(Pred); +    } +    SelectInst *SI = cast<SelectInst>(LHS); +    // Now that we have "fcmp select(cond, TV, FV), RHS", analyse it. +    // Does "fcmp TV, RHS" simplify? +    if (Value *TCmp = SimplifyFCmpInst(Pred, SI->getTrueValue(), RHS, TD)) +      // It does!  Does "fcmp FV, RHS" simplify? +      if (Value *FCmp = SimplifyFCmpInst(Pred, SI->getFalseValue(), RHS, TD)) +        // It does!  If they simplified to the same value, then use it as the +        // result of the original comparison. +        if (TCmp == FCmp) +          return TCmp; +  } +    return 0;  } | 

