[llvm] r346874 - [InstCombine] Remove a couple of asserts based on incorrect assumptions
Mandeep Singh Grang via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 14 09:55:07 PST 2018
Author: mgrang
Date: Wed Nov 14 09:55:07 2018
New Revision: 346874
URL: http://llvm.org/viewvc/llvm-project?rev=346874&view=rev
Log:
[InstCombine] Remove a couple of asserts based on incorrect assumptions
Summary:
These asserts are based on the assumption that the order of true/false operands in a select and those in the compare would always be the same.
This fixes PR39595.
Reviewers: craig.topper, spatel, dmgreen
Reviewed By: craig.topper
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D54359
Added:
llvm/trunk/test/Transforms/InstCombine/select-pr39595.ll
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp?rev=346874&r1=346873&r2=346874&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Wed Nov 14 09:55:07 2018
@@ -1866,8 +1866,7 @@ Instruction *InstCombiner::visitSelectIn
// MAX(~a, C) -> ~MIN(a, ~C)
// MIN(~a, ~b) -> ~MAX(a, b)
// MIN(~a, C) -> ~MAX(a, ~C)
- auto moveNotAfterMinMax = [&](Value *X, Value *Y,
- bool Swapped) -> Instruction * {
+ auto moveNotAfterMinMax = [&](Value *X, Value *Y) -> Instruction * {
Value *A;
if (match(X, m_Not(m_Value(A))) && !X->hasNUsesOrMore(3) &&
!IsFreeToInvert(A, A->hasOneUse()) &&
@@ -1880,14 +1879,8 @@ Instruction *InstCombiner::visitSelectIn
if (MDNode *MD = SI.getMetadata(LLVMContext::MD_prof)) {
cast<SelectInst>(NewMinMax)->setMetadata(LLVMContext::MD_prof, MD);
// Swap the metadata if the operands are swapped.
- if (Swapped) {
- assert(X == SI.getFalseValue() && Y == SI.getTrueValue() &&
- "Unexpected operands.");
+ if (X == SI.getFalseValue() && Y == SI.getTrueValue())
cast<SelectInst>(NewMinMax)->swapProfMetadata();
- } else {
- assert(X == SI.getTrueValue() && Y == SI.getFalseValue() &&
- "Unexpected operands.");
- }
}
return BinaryOperator::CreateNot(NewMinMax);
@@ -1896,9 +1889,9 @@ Instruction *InstCombiner::visitSelectIn
return nullptr;
};
- if (Instruction *I = moveNotAfterMinMax(LHS, RHS, /*Swapped*/false))
+ if (Instruction *I = moveNotAfterMinMax(LHS, RHS))
return I;
- if (Instruction *I = moveNotAfterMinMax(RHS, LHS, /*Swapped*/true))
+ if (Instruction *I = moveNotAfterMinMax(RHS, LHS))
return I;
if (Instruction *I = factorizeMinMaxTree(SPF, LHS, RHS, Builder))
Added: llvm/trunk/test/Transforms/InstCombine/select-pr39595.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/select-pr39595.ll?rev=346874&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/select-pr39595.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/select-pr39595.ll Wed Nov 14 09:55:07 2018
@@ -0,0 +1,18 @@
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+define i32 @foo(i32 %x, i32 %y) {
+; CHECK-LABEL: foo
+; CHECK: [[TMP1:%.*]] = icmp ult i32 %y, %x
+; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 %x, i32 %y, !prof ![[$MD0:[0-9]+]]
+; CHECK-NEXT: [[TMP3:%.*]] = xor i32 [[TMP2]], -1
+; CHECK-NEXT: ret i32 [[TMP3:%.*]]
+; CHECK-DAG: !0 = !{!"branch_weights", i32 6, i32 1}
+
+ %1 = xor i32 %x, -1
+ %2 = xor i32 %y, -1
+ %3 = icmp ugt i32 %1, %2
+ %4 = select i1 %3, i32 %2, i32 %1, !prof !1
+ ret i32 %4
+}
+
+!1 = !{!"branch_weights", i32 1, i32 6}
More information about the llvm-commits
mailing list