diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp --- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -259,26 +259,6 @@ } } -/// 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 @@ } 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(OOp) || (OOpIsAPInt && isSelect01(CI, *OOpC))) { - Value *C = ConstantInt::get(OOp->getType(), CI); + if (!isa(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 @@ } 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(OOp) || (OOpIsAPInt && isSelect01(CI, *OOpC))) { - Value *C = ConstantInt::get(OOp->getType(), CI); + if (!isa(OOp) || + (OOpIsAPInt && isSelect01(C->getUniqueInteger(), *OOpC))) { Value *NewSel = Builder.CreateSelect(SI.getCondition(), C, OOp); NewSel->takeName(FVI); BinaryOperator *BO = BinaryOperator::Create(FVI->getOpcode(),