[llvm] r266987 - Refactor implied condition logic from ValueTracking directly into CmpInst. NFC.

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 21 09:00:52 PDT 2016


SGTM.  Not perfect, but definitely better.  Sometimes that's all you can do.

On 04/21/2016 08:57 AM, Chad Rosier wrote:
> Hi Philip,
> I agree it's difficult to come up with a meaningful name.  How about isImpliedTrueByMatchingCmp/isImpliedFalseByMatchingCmp?
>
>   Chad
>
> -----Original Message-----
> From: Philip Reames [mailto:listmail at philipreames.com]
> Sent: Thursday, April 21, 2016 10:48 AM
> To: Chad Rosier <mcrosier at codeaurora.org>; llvm-commits at lists.llvm.org
> Subject: Re: [llvm] r266987 - Refactor implied condition logic from ValueTracking directly into CmpInst. NFC.
>
> The naming of isTrueWhenOperandsMatch and isFalseWhenOperandsMatch
> aren't exactly clear.  Reading through code, I'd have no idea what they
> do.  Possibly: isImpliedByMatchingCompare(Pred)?  I don't really like
> that either, but its better than what we have.
>
> Philip
>
>
> On 04/21/2016 07:04 AM, Chad Rosier via llvm-commits wrote:
>> Author: mcrosier
>> Date: Thu Apr 21 09:04:54 2016
>> New Revision: 266987
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=266987&view=rev
>> Log:
>> Refactor implied condition logic from ValueTracking directly into CmpInst. NFC.
>>
>> Differential Revision: http://reviews.llvm.org/D19330
>>
>> Modified:
>>       llvm/trunk/include/llvm/IR/InstrTypes.h
>>       llvm/trunk/lib/Analysis/ValueTracking.cpp
>>       llvm/trunk/lib/IR/Instructions.cpp
>>
>> Modified: llvm/trunk/include/llvm/IR/InstrTypes.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/InstrTypes.h?rev=266987&r1=266986&r2=266987&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/IR/InstrTypes.h (original)
>> +++ llvm/trunk/include/llvm/IR/InstrTypes.h Thu Apr 21 09:04:54 2016
>> @@ -1067,6 +1067,18 @@ public:
>>        return isFalseWhenEqual(getPredicate());
>>      }
>>    
>> +  /// @brief Determine if Pred1 implies Pred2 is true when two compares have
>> +  /// matching operands.
>> +  bool isTrueWhenOperandsMatch(Predicate Pred2) {
>> +    return isTrueWhenOperandsMatch(getPredicate(), Pred2);
>> +  }
>> +
>> +  /// @brief Determine if Pred1 implies Pred2 is false when two compares have
>> +  /// matching operands.
>> +  bool isFalseWhenOperandsMatch(Predicate Pred2) {
>> +    return isFalseWhenOperandsMatch(getPredicate(), Pred2);
>> +  }
>> +
>>      /// @returns true if the predicate is unsigned, false otherwise.
>>      /// @brief Determine if the predicate is an unsigned operation.
>>      static bool isUnsigned(Predicate predicate);
>> @@ -1087,6 +1099,14 @@ public:
>>      /// Determine if the predicate is false when comparing a value with itself.
>>      static bool isFalseWhenEqual(Predicate predicate);
>>    
>> +  /// Determine if Pred1 implies Pred2 is true when two compares have matching
>> +  /// operands.
>> +  static bool isTrueWhenOperandsMatch(Predicate Pred1, Predicate Pred2);
>> +
>> +  /// Determine if Pred1 implies Pred2 is false when two compares have matching
>> +  /// operands.
>> +  static bool isFalseWhenOperandsMatch(Predicate Pred1, Predicate Pred2);
>> +
>>      /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
>>      static inline bool classof(const Instruction *I) {
>>        return I->getOpcode() == Instruction::ICmp ||
>>
>> Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=266987&r1=266986&r2=266987&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Thu Apr 21 09:04:54 2016
>> @@ -3935,61 +3935,11 @@ static Optional<bool> isImpliedCondMatch
>>        std::swap(BLHS, BRHS);
>>        BPred = ICmpInst::getSwappedPredicate(BPred);
>>      }
>> -
>> -  // If the predicates match, then we know the first condition implies the
>> -  // second is true.
>> -  if (APred == BPred)
>> +  if (CmpInst::isTrueWhenOperandsMatch(APred, BPred))
>>        return true;
>> -
>> -  // If an inverted APred matches BPred, we can infer the second condition is
>> -  // false.
>> -  if (CmpInst::getInversePredicate(APred) == BPred)
>> +  if (CmpInst::isFalseWhenOperandsMatch(APred, BPred))
>>        return false;
>>    
>> -  // If a swapped APred matches BPred, we can infer the second condition is
>> -  // false in many cases.
>> -  if (CmpInst::getSwappedPredicate(APred) == BPred) {
>> -    switch (APred) {
>> -    default:
>> -      break;
>> -    case CmpInst::ICMP_UGT: // A >u B implies A <u B is false.
>> -    case CmpInst::ICMP_ULT: // A <u B implies A >u B is false.
>> -    case CmpInst::ICMP_SGT: // A >s B implies A <s B is false.
>> -    case CmpInst::ICMP_SLT: // A <s B implies A >s B is false.
>> -      return false;
>> -    }
>> -  }
>> -
>> -  // The predicates must match sign or at least one of them must be an equality
>> -  // comparison (which is signless).
>> -  if (ICmpInst::isSigned(APred) != ICmpInst::isSigned(BPred) &&
>> -      !ICmpInst::isEquality(APred) && !ICmpInst::isEquality(BPred))
>> -    return None;
>> -
>> -  switch (APred) {
>> -  default:
>> -    break;
>> -  case CmpInst::ICMP_EQ:
>> -    // A == B implies A > B and A < B are false.
>> -    if (CmpInst::isFalseWhenEqual(BPred))
>> -      return false;
>> -
>> -    break;
>> -  case CmpInst::ICMP_UGT:
>> -  case CmpInst::ICMP_ULT:
>> -  case CmpInst::ICMP_SGT:
>> -  case CmpInst::ICMP_SLT:
>> -    // A > B implies A == B is false.
>> -    // A < B implies A == B is false.
>> -    if (BPred == CmpInst::ICMP_EQ)
>> -      return false;
>> -
>> -    // A > B implies A != B is true.
>> -    // A < B implies A != B is true.
>> -    if (BPred == CmpInst::ICMP_NE)
>> -      return true;
>> -    break;
>> -  }
>>      return None;
>>    }
>>    
>>
>> Modified: llvm/trunk/lib/IR/Instructions.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Instructions.cpp?rev=266987&r1=266986&r2=266987&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/IR/Instructions.cpp (original)
>> +++ llvm/trunk/lib/IR/Instructions.cpp Thu Apr 21 09:04:54 2016
>> @@ -3597,6 +3597,58 @@ bool CmpInst::isFalseWhenEqual(Predicate
>>      }
>>    }
>>    
>> +bool CmpInst::isTrueWhenOperandsMatch(Predicate Pred1, Predicate Pred2) {
>> +  // If the predicates match, then we know the first condition implies the
>> +  // second is true.
>> +  if (Pred1 == Pred2)
>> +    return true;
>> +
>> +  switch (Pred1) {
>> +  default:
>> +    break;
>> +  case ICMP_UGT: // A >u B implies A != B is true.
>> +  case ICMP_ULT: // A <u B implies A != B is true.
>> +  case ICMP_SGT: // A >s B implies A != B is true.
>> +  case ICMP_SLT: // A <s B implies A != B is true.
>> +    return Pred2 == ICMP_NE;
>> +  }
>> +  return false;
>> +}
>> +
>> +bool CmpInst::isFalseWhenOperandsMatch(Predicate Pred1, Predicate Pred2) {
>> +  // If an inverted Pred1 matches Pred2, we can infer the second condition is
>> +  // false.
>> +  if (getInversePredicate(Pred1) == Pred2)
>> +    return true;
>> +
>> +  // If a swapped Pred1 matches Pred2, we can infer the second condition is
>> +  // false in many cases.
>> +  if (getSwappedPredicate(Pred1) == Pred2) {
>> +    switch (Pred1) {
>> +    default:
>> +      break;
>> +    case ICMP_UGT: // A >u B implies A <u B is false.
>> +    case ICMP_ULT: // A <u B implies A >u B is false.
>> +    case ICMP_SGT: // A >s B implies A <s B is false.
>> +    case ICMP_SLT: // A <s B implies A >s B is false.
>> +      return true;
>> +    }
>> +  }
>> +  // A == B implies A > B and A < B are false.
>> +  if (Pred1 == ICMP_EQ && isFalseWhenEqual(Pred2))
>> +    return true;
>> +
>> +  switch (Pred1) {
>> +  default:
>> +    break;
>> +  case ICMP_UGT: // A >u B implies A == B is false.
>> +  case ICMP_ULT: // A <u B implies A == B is false.
>> +  case ICMP_SGT: // A >s B implies A == B is false.
>> +  case ICMP_SLT: // A <s B implies A == B is false.
>> +    return Pred2 == ICMP_EQ;
>> +  }
>> +  return false;
>> +}
>>    
>>    //===----------------------------------------------------------------------===//
>>    //                        SwitchInst Implementation
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>



More information about the llvm-commits mailing list