Skip to content

Commit

Permalink
Simplify code a bit. No functional change intended.
Browse files Browse the repository at this point in the history
We don't need to call `GetCompareTy(LHS)' every single time true or false is
returned from function SimplifyFCmpInst as suggested by Sanjay in review D24142.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280491 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
adibiagio committed Sep 2, 2016
1 parent 7fb6e6b commit 341f684
Showing 1 changed file with 16 additions and 15 deletions.
31 changes: 16 additions & 15 deletions lib/Analysis/InstructionSimplify.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3194,33 +3194,34 @@ static Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
}

// Fold trivial predicates.
Type *RetTy = GetCompareTy(LHS);
if (Pred == FCmpInst::FCMP_FALSE)
return ConstantInt::get(GetCompareTy(LHS), 0);
return getFalse(RetTy);
if (Pred == FCmpInst::FCMP_TRUE)
return ConstantInt::get(GetCompareTy(LHS), 1);
return getTrue(RetTy);

// UNO/ORD predicates can be trivially folded if NaNs are ignored.
if (FMF.noNaNs()) {
if (Pred == FCmpInst::FCMP_UNO)
return ConstantInt::get(GetCompareTy(LHS), 0);
return getFalse(RetTy);
if (Pred == FCmpInst::FCMP_ORD)
return ConstantInt::get(GetCompareTy(LHS), 1);
return getTrue(RetTy);
}

// fcmp pred x, undef and fcmp pred undef, x
// fold to true if unordered, false if ordered
if (isa<UndefValue>(LHS) || isa<UndefValue>(RHS)) {
// Choosing NaN for the undef will always make unordered comparison succeed
// and ordered comparison fail.
return ConstantInt::get(GetCompareTy(LHS), CmpInst::isUnordered(Pred));
return ConstantInt::get(RetTy, CmpInst::isUnordered(Pred));
}

// fcmp x,x -> true/false. Not all compares are foldable.
if (LHS == RHS) {
if (CmpInst::isTrueWhenEqual(Pred))
return ConstantInt::get(GetCompareTy(LHS), 1);
return getTrue(RetTy);
if (CmpInst::isFalseWhenEqual(Pred))
return ConstantInt::get(GetCompareTy(LHS), 0);
return getFalse(RetTy);
}

// Handle fcmp with constant RHS
Expand All @@ -3235,33 +3236,33 @@ static Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
// If the constant is a nan, see if we can fold the comparison based on it.
if (CFP->getValueAPF().isNaN()) {
if (FCmpInst::isOrdered(Pred)) // True "if ordered and foo"
return ConstantInt::get(GetCompareTy(LHS), 0);
return getFalse(RetTy);
assert(FCmpInst::isUnordered(Pred) &&
"Comparison must be either ordered or unordered!");
// True if unordered.
return ConstantInt::get(GetCompareTy(LHS), 1);
return getTrue(RetTy);
}
// Check whether the constant is an infinity.
if (CFP->getValueAPF().isInfinity()) {
if (CFP->getValueAPF().isNegative()) {
switch (Pred) {
case FCmpInst::FCMP_OLT:
// No value is ordered and less than negative infinity.
return ConstantInt::get(GetCompareTy(LHS), 0);
return getFalse(RetTy);
case FCmpInst::FCMP_UGE:
// All values are unordered with or at least negative infinity.
return ConstantInt::get(GetCompareTy(LHS), 1);
return getTrue(RetTy);
default:
break;
}
} else {
switch (Pred) {
case FCmpInst::FCMP_OGT:
// No value is ordered and greater than infinity.
return ConstantInt::get(GetCompareTy(LHS), 0);
return getFalse(RetTy);
case FCmpInst::FCMP_ULE:
// All values are unordered with and at most infinity.
return ConstantInt::get(GetCompareTy(LHS), 1);
return getTrue(RetTy);
default:
break;
}
Expand All @@ -3271,12 +3272,12 @@ static Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
switch (Pred) {
case FCmpInst::FCMP_UGE:
if (CannotBeOrderedLessThanZero(LHS, Q.TLI))
return ConstantInt::get(GetCompareTy(LHS), 1);
return getTrue(RetTy);
break;
case FCmpInst::FCMP_OLT:
// X < 0
if (CannotBeOrderedLessThanZero(LHS, Q.TLI))
return ConstantInt::get(GetCompareTy(LHS), 0);
return getFalse(RetTy);
break;
default:
break;
Expand Down

0 comments on commit 341f684

Please sign in to comment.