mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[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 llvm-svn: 346874
This commit is contained in:
parent
8b3a332fd8
commit
b289c656ab
@ -1866,8 +1866,7 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
|
||||
// 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::visitSelectInst(SelectInst &SI) {
|
||||
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::visitSelectInst(SelectInst &SI) {
|
||||
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))
|
||||
|
18
test/Transforms/InstCombine/select-pr39595.ll
Normal file
18
test/Transforms/InstCombine/select-pr39595.ll
Normal file
@ -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}
|
Loading…
Reference in New Issue
Block a user