From 92826def593df7a422c7b07f09342febce81ddd3 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Sun, 7 Nov 2010 16:46:25 +0000 Subject: [PATCH] Add simplification of floating point comparisons with the result of a select instruction, the same as already exists for integer comparisons. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118379 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/InstructionSimplify.cpp | 20 ++++++++++++++++++++ test/Transforms/InstCombine/select.ll | 8 ++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 1955802cc6e..66452a5d986 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(LHS) || isa(RHS)) { + // Make sure the select is on the LHS. + if (!isa(LHS)) { + std::swap(LHS, RHS); + Pred = CmpInst::getSwappedPredicate(Pred); + } + SelectInst *SI = cast(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; } diff --git a/test/Transforms/InstCombine/select.ll b/test/Transforms/InstCombine/select.ll index c641339cbb6..6738abc4680 100644 --- a/test/Transforms/InstCombine/select.ll +++ b/test/Transforms/InstCombine/select.ll @@ -480,3 +480,11 @@ define i1 @test38(i1 %cond) { ; CHECK: @test38 ; CHECK: ret i1 false } + +define i1 @test39(i1 %cond, double %x) { + %s = select i1 %cond, double %x, double 0x7FF0000000000000 ; RHS = +infty + %cmp = fcmp ule double %x, %s + ret i1 %cmp +; CHECK: @test39 +; CHECK: ret i1 true +} -- 2.34.1