diff options
| author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-10-07 20:53:08 +0000 | 
|---|---|---|
| committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-10-07 20:53:08 +0000 | 
| commit | 0c73be590e67af0bab088483f167c44538ff449d (patch) | |
| tree | 53476fa4b37b62a77cafc0ce39348c9aed7bfff3 /llvm/lib/Transforms/InstCombine | |
| parent | cb6d851bb65dbba3e4fc6a82226e9b308b11f89c (diff) | |
| download | bcm5719-llvm-0c73be590e67af0bab088483f167c44538ff449d.tar.gz bcm5719-llvm-0c73be590e67af0bab088483f167c44538ff449d.zip  | |
[InstCombine] Move isSignBitCheck(), handle rest of the predicates
True, no test coverage is being added here. But those non-canonical
predicates that are already handled here already have no test coverage
as far as i can tell. I tried to add tests for them, but all the patterns
already get handled elsewhere.
llvm-svn: 373962
Diffstat (limited to 'llvm/lib/Transforms/InstCombine')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 28 | ||||
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineInternal.h | 39 | 
2 files changed, 39 insertions, 28 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index f07f64e3f02..ee51bc03312 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -69,34 +69,6 @@ static bool hasBranchUse(ICmpInst &I) {    return false;  } -/// Given an exploded icmp instruction, return true if the comparison only -/// checks the sign bit. If it only checks the sign bit, set TrueIfSigned if the -/// result of the comparison is true when the input value is signed. -static bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, -                           bool &TrueIfSigned) { -  switch (Pred) { -  case ICmpInst::ICMP_SLT:   // True if LHS s< 0 -    TrueIfSigned = true; -    return RHS.isNullValue(); -  case ICmpInst::ICMP_SLE:   // True if LHS s<= RHS and RHS == -1 -    TrueIfSigned = true; -    return RHS.isAllOnesValue(); -  case ICmpInst::ICMP_SGT:   // True if LHS s> -1 -    TrueIfSigned = false; -    return RHS.isAllOnesValue(); -  case ICmpInst::ICMP_UGT: -    // True if LHS u> RHS and RHS == high-bit-mask - 1 -    TrueIfSigned = true; -    return RHS.isMaxSignedValue(); -  case ICmpInst::ICMP_UGE: -    // True if LHS u>= RHS and RHS == high-bit-mask (2^7, 2^15, 2^31, etc) -    TrueIfSigned = true; -    return RHS.isSignMask(); -  default: -    return false; -  } -} -  /// Returns true if the exploded icmp can be expressed as a signed comparison  /// to zero and updates the predicate accordingly.  /// The signedness of the comparison is preserved. diff --git a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h index dcdbee15fe5..e04cd346b6f 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h +++ b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h @@ -113,6 +113,45 @@ static inline bool isCanonicalPredicate(CmpInst::Predicate Pred) {    }  } +/// Given an exploded icmp instruction, return true if the comparison only +/// checks the sign bit. If it only checks the sign bit, set TrueIfSigned if the +/// result of the comparison is true when the input value is signed. +inline bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, +                           bool &TrueIfSigned) { +  switch (Pred) { +  case ICmpInst::ICMP_SLT: // True if LHS s< 0 +    TrueIfSigned = true; +    return RHS.isNullValue(); +  case ICmpInst::ICMP_SLE: // True if LHS s<= -1 +    TrueIfSigned = true; +    return RHS.isAllOnesValue(); +  case ICmpInst::ICMP_SGT: // True if LHS s> -1 +    TrueIfSigned = false; +    return RHS.isAllOnesValue(); +  case ICmpInst::ICMP_SGE: // True if LHS s>= 0 +    TrueIfSigned = false; +    return RHS.isNullValue(); +  case ICmpInst::ICMP_UGT: +    // True if LHS u> RHS and RHS == sign-bit-mask - 1 +    TrueIfSigned = true; +    return RHS.isMaxSignedValue(); +  case ICmpInst::ICMP_UGE: +    // True if LHS u>= RHS and RHS == sign-bit-mask (2^7, 2^15, 2^31, etc) +    TrueIfSigned = true; +    return RHS.isMinSignedValue(); +  case ICmpInst::ICMP_ULT: +    // True if LHS u< RHS and RHS == sign-bit-mask (2^7, 2^15, 2^31, etc) +    TrueIfSigned = false; +    return RHS.isMinSignedValue(); +  case ICmpInst::ICMP_ULE: +    // True if LHS u<= RHS and RHS == sign-bit-mask - 1 +    TrueIfSigned = false; +    return RHS.isMaxSignedValue(); +  default: +    return false; +  } +} +  llvm::Optional<std::pair<CmpInst::Predicate, Constant *>>  getFlippedStrictnessPredicateAndConstant(CmpInst::Predicate Pred, Constant *C);  | 

