[llvm] 35f02aa - Revert "[AggressiveInstCombine] Add support for ICmp instr that feeds a select intsr's condition operand."
Ayman Musa via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 12 05:05:50 PST 2020
Author: Ayman Musa
Date: 2020-02-12T15:04:49+02:00
New Revision: 35f02aa0213c41c4c408108e277e473de954dc5e
URL: https://github.com/llvm/llvm-project/commit/35f02aa0213c41c4c408108e277e473de954dc5e
DIFF: https://github.com/llvm/llvm-project/commit/35f02aa0213c41c4c408108e277e473de954dc5e.diff
LOG: Revert "[AggressiveInstCombine] Add support for ICmp instr that feeds a select intsr's condition operand."
This reverts commit cf155150f992270c88e586ffc61973d2552b72e8.
Added:
Modified:
llvm/lib/Transforms/AggressiveInstCombine/TruncInstCombine.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/AggressiveInstCombine/TruncInstCombine.cpp b/llvm/lib/Transforms/AggressiveInstCombine/TruncInstCombine.cpp
index 3581a24851de..0cfc6ef47d4b 100644
--- a/llvm/lib/Transforms/AggressiveInstCombine/TruncInstCombine.cpp
+++ b/llvm/lib/Transforms/AggressiveInstCombine/TruncInstCombine.cpp
@@ -36,24 +36,6 @@ using namespace llvm;
#define DEBUG_TYPE "aggressive-instcombine"
-// This function returns true if Value V is a constant or if it's a type
-// extension node.
-static bool isConstOrExt(Value *V) {
- if (isa<Constant>(V))
- return true;
-
- if (Instruction *I = dyn_cast<Instruction>(V)) {
- switch(I->getOpcode()) {
- case Instruction::ZExt:
- case Instruction::SExt:
- return true;
- default:
- return false;
- }
- }
- return false;
-}
-
/// Given an instruction and a container, it fills all the relevant operands of
/// that instruction, with respect to the Trunc expression dag optimizaton.
static void getRelevantOperands(Instruction *I, SmallVectorImpl<Value *> &Ops) {
@@ -71,20 +53,12 @@ static void getRelevantOperands(Instruction *I, SmallVectorImpl<Value *> &Ops) {
case Instruction::And:
case Instruction::Or:
case Instruction::Xor:
- case Instruction::ICmp:
Ops.push_back(I->getOperand(0));
Ops.push_back(I->getOperand(1));
break;
case Instruction::Select:
- Value *Op0 = I->getOperand(0);
Ops.push_back(I->getOperand(1));
Ops.push_back(I->getOperand(2));
- // In case the condition is a compare instruction, that both of its operands
- // are a type extension/truncate or a constant, that can be shrinked without
- // loosing information in the compare instruction, add them as well.
- if (CmpInst *C = dyn_cast<CmpInst>(Op0))
- if (isConstOrExt(C->getOperand(0)) && isConstOrExt(C->getOperand(1)))
- Ops.push_back(Op0);
break;
default:
llvm_unreachable("Unreachable!");
@@ -145,8 +119,7 @@ bool TruncInstCombine::buildTruncExpressionDag() {
case Instruction::And:
case Instruction::Or:
case Instruction::Xor:
- case Instruction::Select:
- case Instruction::ICmp: {
+ case Instruction::Select: {
SmallVector<Value *, 2> Operands;
getRelevantOperands(I, Operands);
for (Value *Operand : Operands)
@@ -166,21 +139,6 @@ bool TruncInstCombine::buildTruncExpressionDag() {
return true;
}
-// Get the minimum number of bits needed for the given constant.
-static unsigned getConstMinBitWidth(bool IsSigned, ConstantInt *C) {
- // If the const value is signed and negative, count the leading ones.
- if (IsSigned) {
- int64_t Val = C->getSExtValue();
- uint64_t UVal = (uint64_t)Val;
- if (Val < 0)
- return sizeof(UVal)*8 - countLeadingOnes(UVal) + 1;
- }
- // Otherwise, count leading zeroes.
- uint64_t Val = C->getZExtValue();
- auto MinBits = sizeof(Val)*8 - countLeadingZeros(Val);
- return IsSigned ? MinBits + 1 : MinBits;
-}
-
unsigned TruncInstCombine::getMinBitWidth() {
SmallVector<Value *, 8> Worklist;
SmallVector<Instruction *, 8> Stack;
@@ -222,13 +180,6 @@ unsigned TruncInstCombine::getMinBitWidth() {
if (auto *IOp = dyn_cast<Instruction>(Operand))
Info.MinBitWidth =
std::max(Info.MinBitWidth, InstInfoMap[IOp].MinBitWidth);
- else if (auto *C = dyn_cast<ConstantInt>(Operand)) {
- // In case of Cmp instruction, make sure the constant can be truncated
- // without losing information.
- if (CmpInst *Cmp = dyn_cast<CmpInst>(I))
- Info.MinBitWidth = std::max(
- Info.MinBitWidth, getConstMinBitWidth(Cmp->isSigned(), C));
- }
continue;
}
@@ -242,27 +193,14 @@ unsigned TruncInstCombine::getMinBitWidth() {
for (auto *Operand : Operands)
if (auto *IOp = dyn_cast<Instruction>(Operand)) {
- if (isa<CmpInst>(I)) {
- // Cmp instructions kind of resets the valid bits analysis for its
- // operands, as it does not continue with the same calculation chain
- // but rather creates a new chain of its own.
- switch (IOp->getOpcode()) {
- case Instruction::SExt:
- case Instruction::ZExt:
- InstInfoMap[IOp].ValidBitWidth =
- cast<CastInst>(IOp)->getSrcTy()->getScalarSizeInBits();
- break;
- }
- } else {
- // If we already calculated the minimum bit-width for this valid
- // bit-width, or for a smaller valid bit-width, then just keep the
- // answer we already calculated.
- unsigned IOpBitwidth = InstInfoMap.lookup(IOp).ValidBitWidth;
- if (IOpBitwidth >= ValidBitWidth)
- continue;
- InstInfoMap[IOp].ValidBitWidth = ValidBitWidth;
- Worklist.push_back(IOp);
- }
+ // If we already calculated the minimum bit-width for this valid
+ // bit-width, or for a smaller valid bit-width, then just keep the
+ // answer we already calculated.
+ unsigned IOpBitwidth = InstInfoMap.lookup(IOp).ValidBitWidth;
+ if (IOpBitwidth >= ValidBitWidth)
+ continue;
+ InstInfoMap[IOp].ValidBitWidth = ValidBitWidth;
+ Worklist.push_back(IOp);
}
}
unsigned MinBitWidth = InstInfoMap.lookup(cast<Instruction>(Src)).MinBitWidth;
@@ -425,13 +363,6 @@ void TruncInstCombine::ReduceExpressionDag(Type *SclTy) {
Res = Builder.CreateSelect(Op0, LHS, RHS);
break;
}
- case Instruction::ICmp: {
- auto ICmp = cast<ICmpInst>(I);
- Value *LHS = getReducedOperand(ICmp->getOperand(0), SclTy);
- Value *RHS = getReducedOperand(ICmp->getOperand(1), SclTy);
- Res = Builder.CreateICmp(ICmp->getPredicate(), LHS, RHS);
- break;
- }
default:
llvm_unreachable("Unhandled instruction");
}
More information about the llvm-commits
mailing list