diff options
Diffstat (limited to 'lib/Analysis/InstructionSimplify.cpp')
-rw-r--r-- | lib/Analysis/InstructionSimplify.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 1955802cc6..66452a5d98 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/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; } |