forked from OSchip/llvm-project
[IR] SelectInst: add swapValues() utility
Summary: Sometimes we need to swap true-val and false-val of a `SelectInst`. Having a function for that is nicer than hand-writing it each time. Reviewers: spatel, RKSimon, craig.topper, jdoerfert Reviewed By: jdoerfert Subscribers: jdoerfert, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D65520 llvm-svn: 367547
This commit is contained in:
parent
b301860321
commit
0efeaa8162
|
@ -1764,6 +1764,10 @@ public:
|
|||
void setTrueValue(Value *V) { Op<1>() = V; }
|
||||
void setFalseValue(Value *V) { Op<2>() = V; }
|
||||
|
||||
/// Swap the true and false values of the select instruction.
|
||||
/// This doesn't swap prof metadata.
|
||||
void swapValues() { Op<1>().swap(Op<2>()); }
|
||||
|
||||
/// Return a string if the specified operands are invalid
|
||||
/// for a select operation, otherwise return null.
|
||||
static const char *areInvalidOperands(Value *Cond, Value *True, Value *False);
|
||||
|
|
|
@ -1690,13 +1690,9 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
|
|||
if (SPF == SPF_ABS || SPF == SPF_NABS) {
|
||||
// This is a negate of an ABS/NABS pattern. Just swap the operands
|
||||
// of the select.
|
||||
SelectInst *SI = cast<SelectInst>(Op1);
|
||||
Value *TrueVal = SI->getTrueValue();
|
||||
Value *FalseVal = SI->getFalseValue();
|
||||
SI->setTrueValue(FalseVal);
|
||||
SI->setFalseValue(TrueVal);
|
||||
cast<SelectInst>(Op1)->swapValues();
|
||||
// Don't swap prof metadata, we didn't change the branch behavior.
|
||||
return replaceInstUsesWith(I, SI);
|
||||
return replaceInstUsesWith(I, Op1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -973,8 +973,7 @@ canonicalizeMinMaxWithConstant(SelectInst &Sel, ICmpInst &Cmp,
|
|||
// If we are swapping the select operands, swap the metadata too.
|
||||
assert(Sel.getTrueValue() == RHS && Sel.getFalseValue() == LHS &&
|
||||
"Unexpected results from matchSelectPattern");
|
||||
Sel.setTrueValue(LHS);
|
||||
Sel.setFalseValue(RHS);
|
||||
Sel.swapValues();
|
||||
Sel.swapProfMetadata();
|
||||
return &Sel;
|
||||
}
|
||||
|
@ -1056,8 +1055,7 @@ static Instruction *canonicalizeAbsNabs(SelectInst &Sel, ICmpInst &Cmp,
|
|||
}
|
||||
|
||||
// We are swapping the select operands, so swap the metadata too.
|
||||
Sel.setTrueValue(FVal);
|
||||
Sel.setFalseValue(TVal);
|
||||
Sel.swapValues();
|
||||
Sel.swapProfMetadata();
|
||||
return &Sel;
|
||||
}
|
||||
|
|
|
@ -1538,10 +1538,7 @@ static bool negateICmpIfUsedByBranchOrSelectOnly(ICmpInst *ICmp,
|
|||
}
|
||||
if (auto *SI = dyn_cast<SelectInst>(U)) {
|
||||
// Swap operands
|
||||
Value *TrueValue = SI->getTrueValue();
|
||||
Value *FalseValue = SI->getFalseValue();
|
||||
SI->setTrueValue(FalseValue);
|
||||
SI->setFalseValue(TrueValue);
|
||||
SI->swapValues();
|
||||
SI->swapProfMetadata();
|
||||
if (Scope->TrueBiasedSelects.count(SI)) {
|
||||
assert(Scope->FalseBiasedSelects.count(SI) == 0 &&
|
||||
|
|
Loading…
Reference in New Issue