Skip to content

Commit

Permalink
[IR] SelectInst: add swapValues() utility
Browse files Browse the repository at this point in the history
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
  • Loading branch information
LebedevRI committed Aug 1, 2019
1 parent b301860 commit 0efeaa8
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 14 deletions.
4 changes: 4 additions & 0 deletions llvm/include/llvm/IR/Instructions.h
Expand Up @@ -1764,6 +1764,10 @@ class SelectInst : public Instruction {
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);
Expand Down
8 changes: 2 additions & 6 deletions llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
Expand Up @@ -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);
}
}
}
Expand Down
6 changes: 2 additions & 4 deletions llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
Expand Up @@ -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 &&
Expand Down

0 comments on commit 0efeaa8

Please sign in to comment.