diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 23 | 
1 files changed, 10 insertions, 13 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index b36eadf6aad..c32821c73f8 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -2042,23 +2042,20 @@ Instruction *InstCombiner::foldICmpShlConstant(ICmpInst &Cmp, Instruction *Shl,                          And, Constant::getNullValue(And->getType()));    } -  // FIXME: This check restricts all folds under here to scalar types. -  ConstantInt *RHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)); -  if (!RHS) -    return nullptr; - -  // Transform (icmp pred iM (shl iM %v, N), CI) -  // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (CI>>N)) -  // Transform the shl to a trunc if (trunc (CI>>N)) has no loss and M-N. -  // This enables to get rid of the shift in favor of a trunc which can be +  // Transform (icmp pred iM (shl iM %v, N), C) +  // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N)) +  // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N. +  // This enables us to get rid of the shift in favor of a trunc which can be    // free on the target. It has the additional benefit of comparing to a    // smaller constant, which will be target friendly.    unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);    if (Shl->hasOneUse() && Amt != 0 && C->countTrailingZeros() >= Amt) { -    Type *NTy = IntegerType::get(Cmp.getContext(), TypeBits - Amt); -    Constant *NCI = ConstantExpr::getTrunc( -        ConstantExpr::getAShr(RHS, ConstantInt::get(RHS->getType(), Amt)), NTy); -    return new ICmpInst(Pred, Builder->CreateTrunc(X, NTy), NCI); +    Type *TruncTy = IntegerType::get(Cmp.getContext(), TypeBits - Amt); +    if (X->getType()->isVectorTy()) +      TruncTy = VectorType::get(TruncTy, X->getType()->getVectorNumElements()); +    Constant *NewC = +        ConstantInt::get(TruncTy, C->ashr(*ShiftAmt).trunc(TypeBits - Amt)); +    return new ICmpInst(Pred, Builder->CreateTrunc(X, TruncTy), NewC);    }    return nullptr;  | 

