diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 14 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstSimplify/and-icmps-same-ops.ll | 26 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstSimplify/or-icmps-same-ops.ll | 26 | 
3 files changed, 56 insertions, 10 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index cc4a6ba9402..bbabf2af691 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -1523,11 +1523,8 @@ static Value *simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp,  static Value *simplifyAndOfICmpsWithSameOperands(ICmpInst *Op0, ICmpInst *Op1) {    ICmpInst::Predicate Pred0, Pred1;    Value *A ,*B; -  match(Op0, m_ICmp(Pred0, m_Value(A), m_Value(B))); -  if (match(Op1, m_ICmp(Pred1, m_Specific(B), m_Specific(A)))) -    Op1->swapOperands(); - -  if (!match(Op1, m_ICmp(Pred1, m_Specific(A), m_Specific(B)))) +  if (!match(Op0, m_ICmp(Pred0, m_Value(A), m_Value(B))) || +      !match(Op1, m_ICmp(Pred1, m_Specific(A), m_Specific(B))))      return nullptr;    // We have (icmp Pred0, A, B) & (icmp Pred1, A, B). @@ -1738,11 +1735,8 @@ Value *llvm::SimplifyAndInst(Value *Op0, Value *Op1, const DataLayout &DL,  static Value *simplifyOrOfICmpsWithSameOperands(ICmpInst *Op0, ICmpInst *Op1) {    ICmpInst::Predicate Pred0, Pred1;    Value *A ,*B; -  match(Op0, m_ICmp(Pred0, m_Value(A), m_Value(B))); -  if (match(Op1, m_ICmp(Pred1, m_Specific(B), m_Specific(A)))) -    Op1->swapOperands(); - -  if (!match(Op1, m_ICmp(Pred1, m_Specific(A), m_Specific(B)))) +  if (!match(Op0, m_ICmp(Pred0, m_Value(A), m_Value(B))) || +      !match(Op1, m_ICmp(Pred1, m_Specific(A), m_Specific(B))))      return nullptr;    // We have (icmp Pred0, A, B) | (icmp Pred1, A, B). diff --git a/llvm/test/Transforms/InstSimplify/and-icmps-same-ops.ll b/llvm/test/Transforms/InstSimplify/and-icmps-same-ops.ll index 8a665c33997..4da79388f72 100644 --- a/llvm/test/Transforms/InstSimplify/and-icmps-same-ops.ll +++ b/llvm/test/Transforms/InstSimplify/and-icmps-same-ops.ll @@ -1211,3 +1211,29 @@ define <2 x i1> @ult_ule_vec(<2 x i8> %a, <2 x i8> %b) {    ret <2 x i1> %and  } +define i1 @ult_uge_swap(i8 %a, i8 %b) { +; CHECK-LABEL: @ult_uge_swap( +; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b +; CHECK-NEXT:    [[CMP2:%.*]] = icmp uge i8 %b, %a +; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT:    ret i1 [[AND]] +; +  %cmp1 = icmp ult i8 %a, %b +  %cmp2 = icmp uge i8 %b, %a +  %and = and i1 %cmp1, %cmp2 +  ret i1 %and +} + +define i1 @ult_ult_swap(i8 %a, i8 %b) { +; CHECK-LABEL: @ult_ult_swap( +; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b +; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 %b, %a +; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT:    ret i1 [[AND]] +; +  %cmp1 = icmp ult i8 %a, %b +  %cmp2 = icmp ult i8 %b, %a +  %and = and i1 %cmp1, %cmp2 +  ret i1 %and +} + diff --git a/llvm/test/Transforms/InstSimplify/or-icmps-same-ops.ll b/llvm/test/Transforms/InstSimplify/or-icmps-same-ops.ll index cee7fc3c649..326b1e158c0 100644 --- a/llvm/test/Transforms/InstSimplify/or-icmps-same-ops.ll +++ b/llvm/test/Transforms/InstSimplify/or-icmps-same-ops.ll @@ -1211,3 +1211,29 @@ define <2 x i1> @ult_ule_vec(<2 x i8> %a, <2 x i8> %b) {    ret <2 x i1> %or  } +define i1 @ult_ne_swap(i8 %a, i8 %b) { +; CHECK-LABEL: @ult_ne_swap( +; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b +; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 %b, %a +; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT:    ret i1 [[OR]] +; +  %cmp1 = icmp ult i8 %a, %b +  %cmp2 = icmp ne i8 %b, %a +  %or = or i1 %cmp1, %cmp2 +  ret i1 %or +} + +define i1 @ult_ule_swap(i8 %a, i8 %b) { +; CHECK-LABEL: @ult_ule_swap( +; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b +; CHECK-NEXT:    [[CMP2:%.*]] = icmp uge i8 %b, %a +; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT:    ret i1 [[OR]] +; +  %cmp1 = icmp ult i8 %a, %b +  %cmp2 = icmp uge i8 %b, %a +  %or = or i1 %cmp1, %cmp2 +  ret i1 %or +} +  | 

