forked from OSchip/llvm-project
[InstCombine][NFC] Use ConstantExpr::getBinOpIdentity
Delete duplicate implementation getSelectFoldableConstant and replace with ConstantExpr::getBinOpIdentity. Differential Revision: https://reviews.llvm.org/D89839
This commit is contained in:
parent
922285abec
commit
d49911c282
|
@ -259,26 +259,6 @@ static unsigned getSelectFoldableOperands(BinaryOperator *I) {
|
|||
}
|
||||
}
|
||||
|
||||
/// For the same transformation as the previous function, return the identity
|
||||
/// constant that goes into the select.
|
||||
static APInt getSelectFoldableConstant(BinaryOperator *I) {
|
||||
switch (I->getOpcode()) {
|
||||
default: llvm_unreachable("This cannot happen!");
|
||||
case Instruction::Add:
|
||||
case Instruction::Sub:
|
||||
case Instruction::Or:
|
||||
case Instruction::Xor:
|
||||
case Instruction::Shl:
|
||||
case Instruction::LShr:
|
||||
case Instruction::AShr:
|
||||
return APInt::getNullValue(I->getType()->getScalarSizeInBits());
|
||||
case Instruction::And:
|
||||
return APInt::getAllOnesValue(I->getType()->getScalarSizeInBits());
|
||||
case Instruction::Mul:
|
||||
return APInt(I->getType()->getScalarSizeInBits(), 1);
|
||||
}
|
||||
}
|
||||
|
||||
/// We have (select c, TI, FI), and we know that TI and FI have the same opcode.
|
||||
Instruction *InstCombinerImpl::foldSelectOpOp(SelectInst &SI, Instruction *TI,
|
||||
Instruction *FI) {
|
||||
|
@ -434,14 +414,15 @@ Instruction *InstCombinerImpl::foldSelectIntoOp(SelectInst &SI, Value *TrueVal,
|
|||
}
|
||||
|
||||
if (OpToFold) {
|
||||
APInt CI = getSelectFoldableConstant(TVI);
|
||||
Constant *C = ConstantExpr::getBinOpIdentity(TVI->getOpcode(),
|
||||
TVI->getType(), true);
|
||||
Value *OOp = TVI->getOperand(2-OpToFold);
|
||||
// Avoid creating select between 2 constants unless it's selecting
|
||||
// between 0, 1 and -1.
|
||||
const APInt *OOpC;
|
||||
bool OOpIsAPInt = match(OOp, m_APInt(OOpC));
|
||||
if (!isa<Constant>(OOp) || (OOpIsAPInt && isSelect01(CI, *OOpC))) {
|
||||
Value *C = ConstantInt::get(OOp->getType(), CI);
|
||||
if (!isa<Constant>(OOp) ||
|
||||
(OOpIsAPInt && isSelect01(C->getUniqueInteger(), *OOpC))) {
|
||||
Value *NewSel = Builder.CreateSelect(SI.getCondition(), OOp, C);
|
||||
NewSel->takeName(TVI);
|
||||
BinaryOperator *BO = BinaryOperator::Create(TVI->getOpcode(),
|
||||
|
@ -465,14 +446,15 @@ Instruction *InstCombinerImpl::foldSelectIntoOp(SelectInst &SI, Value *TrueVal,
|
|||
}
|
||||
|
||||
if (OpToFold) {
|
||||
APInt CI = getSelectFoldableConstant(FVI);
|
||||
Constant *C = ConstantExpr::getBinOpIdentity(FVI->getOpcode(),
|
||||
FVI->getType(), true);
|
||||
Value *OOp = FVI->getOperand(2-OpToFold);
|
||||
// Avoid creating select between 2 constants unless it's selecting
|
||||
// between 0, 1 and -1.
|
||||
const APInt *OOpC;
|
||||
bool OOpIsAPInt = match(OOp, m_APInt(OOpC));
|
||||
if (!isa<Constant>(OOp) || (OOpIsAPInt && isSelect01(CI, *OOpC))) {
|
||||
Value *C = ConstantInt::get(OOp->getType(), CI);
|
||||
if (!isa<Constant>(OOp) ||
|
||||
(OOpIsAPInt && isSelect01(C->getUniqueInteger(), *OOpC))) {
|
||||
Value *NewSel = Builder.CreateSelect(SI.getCondition(), C, OOp);
|
||||
NewSel->takeName(FVI);
|
||||
BinaryOperator *BO = BinaryOperator::Create(FVI->getOpcode(),
|
||||
|
|
Loading…
Reference in New Issue