From 5369775a848db9840c52951dcc86ffe3a7db3616 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Tue, 6 Dec 2016 22:09:52 +0000 Subject: [PATCH] [InstSimplify] fixed (?) to not mutate icmps As Eli noted in the post-commit thread for r288833, the use of swapOperands() may not be allowed in InstSimplify, so I'm removing those calls here pending further review. The swap mutates the icmp, and there doesn't appear to be precedent for instruction mutation in InstSimplify. I didn't actually have any tests for those cases, so I'm adding a few here. llvm-svn: 288855 --- llvm/lib/Analysis/InstructionSimplify.cpp | 14 ++++-------- .../Transforms/InstSimplify/and-icmps-same-ops.ll | 26 ++++++++++++++++++++++ .../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 cc4a6ba..bbabf2a 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 8a665c3..4da7938 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 cee7fc3..326b1e1 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 +} + -- 2.7.4