From 223d65b651621fcede1f9e64918e515bd0a27413 Mon Sep 17 00:00:00 2001 From: Zhou Sheng Date: Thu, 19 Apr 2007 05:35:00 +0000 Subject: [PATCH] Make the operations of APInt variables more efficient. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36260 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/PredicateSimplifier.cpp | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp index 175ddefaf02..7eef9ac6911 100644 --- a/lib/Transforms/Scalar/PredicateSimplifier.cpp +++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp @@ -747,35 +747,34 @@ namespace { case ICmpInst::ICMP_SLT: return ConstantRange(APInt::getSignedMinValue(W), CR.getSignedMax()); case ICmpInst::ICMP_ULE: { - APInt UMax = CR.getUnsignedMax(); + APInt UMax(CR.getUnsignedMax()); if (UMax == APInt::getMaxValue(W)) return ConstantRange(W); return ConstantRange(APInt::getMinValue(W), UMax + 1); } case ICmpInst::ICMP_SLE: { - APInt SMax = CR.getSignedMax(); + APInt SMax(CR.getSignedMax()); if (SMax == APInt::getSignedMaxValue(W) || SMax + 1 == APInt::getSignedMaxValue(W)) return ConstantRange(W); return ConstantRange(APInt::getSignedMinValue(W), SMax + 1); } case ICmpInst::ICMP_UGT: - return ConstantRange(CR.getUnsignedMin() + 1, - APInt::getMaxValue(W) + 1); + return ConstantRange(CR.getUnsignedMin() + 1, APInt::getNullValue(W)); case ICmpInst::ICMP_SGT: return ConstantRange(CR.getSignedMin() + 1, - APInt::getSignedMaxValue(W) + 1); + APInt::getSignedMinValue(W)); case ICmpInst::ICMP_UGE: { - APInt UMin = CR.getUnsignedMin(); + APInt UMin(CR.getUnsignedMin()); if (UMin == APInt::getMinValue(W)) return ConstantRange(W); - return ConstantRange(UMin, APInt::getMaxValue(W) + 1); + return ConstantRange(UMin, APInt::getNullValue(W)); } case ICmpInst::ICMP_SGE: { - APInt SMin = CR.getSignedMin(); + APInt SMin(CR.getSignedMin()); if (SMin == APInt::getSignedMinValue(W)) return ConstantRange(W); - return ConstantRange(SMin, APInt::getSignedMaxValue(W) + 1); + return ConstantRange(SMin, APInt::getSignedMinValue(W)); } } } @@ -969,16 +968,16 @@ namespace { ConstantRange NewCR2(CR1.getUpper(), CR1.getLower()); applyRange(V2, NewCR2, Subtree, VRP); } else if (*I == CR2.getLower()) { - APInt NewLower = CR2.getLower() + 1, - NewUpper = CR2.getUpper(); + APInt NewLower(CR2.getLower() + 1), + NewUpper(CR2.getUpper()); if (NewLower == NewUpper) NewLower = NewUpper = APInt::getMinValue(W); ConstantRange NewCR2(NewLower, NewUpper); applyRange(V2, NewCR2, Subtree, VRP); } else if (*I == CR2.getUpper() - 1) { - APInt NewLower = CR2.getLower(), - NewUpper = CR2.getUpper() - 1; + APInt NewLower(CR2.getLower()), + NewUpper(CR2.getUpper() - 1); if (NewLower == NewUpper) NewLower = NewUpper = APInt::getMinValue(W); @@ -992,16 +991,16 @@ namespace { ConstantRange NewCR1(CR2.getUpper(), CR2.getLower()); applyRange(V1, NewCR1, Subtree, VRP); } else if (*I == CR1.getLower()) { - APInt NewLower = CR1.getLower() + 1, - NewUpper = CR1.getUpper(); + APInt NewLower(CR1.getLower() + 1), + NewUpper(CR1.getUpper()); if (NewLower == NewUpper) NewLower = NewUpper = APInt::getMinValue(W); ConstantRange NewCR1(NewLower, NewUpper); applyRange(V1, NewCR1, Subtree, VRP); } else if (*I == CR1.getUpper() - 1) { - APInt NewLower = CR1.getLower(), - NewUpper = CR1.getUpper() - 1; + APInt NewLower(CR1.getLower()), + NewUpper(CR1.getUpper() - 1); if (NewLower == NewUpper) NewLower = NewUpper = APInt::getMinValue(W); @@ -2242,10 +2241,8 @@ namespace { VRPSolver VRP(IG, UB, VR, PS->Forest, PS->modified, &SI); uint32_t SrcBitWidth = cast(SI.getSrcTy())->getBitWidth(); uint32_t DstBitWidth = cast(SI.getDestTy())->getBitWidth(); - APInt Min(APInt::getSignedMinValue(SrcBitWidth)); - APInt Max(APInt::getSignedMaxValue(SrcBitWidth)); - Min.sext(DstBitWidth); - Max.sext(DstBitWidth); + APInt Min(APInt::getHighBitsSet(DstBitWidth, DstBitWidth-SrcBitWidth+1)); + APInt Max(APInt::getLowBitsSet(DstBitWidth, SrcBitWidth-1)); VRP.add(ConstantInt::get(Min), &SI, ICmpInst::ICMP_SLE); VRP.add(ConstantInt::get(Max), &SI, ICmpInst::ICMP_SGE); VRP.solve(); @@ -2255,8 +2252,7 @@ namespace { VRPSolver VRP(IG, UB, VR, PS->Forest, PS->modified, &ZI); uint32_t SrcBitWidth = cast(ZI.getSrcTy())->getBitWidth(); uint32_t DstBitWidth = cast(ZI.getDestTy())->getBitWidth(); - APInt Max(APInt::getMaxValue(SrcBitWidth)); - Max.zext(DstBitWidth); + APInt Max(APInt::getLowBitsSet(DstBitWidth, SrcBitWidth)); VRP.add(ConstantInt::get(Max), &ZI, ICmpInst::ICMP_UGE); VRP.solve(); } @@ -2353,14 +2349,12 @@ namespace { case ICmpInst::ICMP_SLT: case ICmpInst::ICMP_ULT: if (Op1->getValue() != 0) - NextVal = cast(ConstantExpr::getSub( - Op1, ConstantInt::get(Op1->getType(), 1))); + NextVal = ConstantInt::get(Op1->getValue()-1); break; case ICmpInst::ICMP_SGT: case ICmpInst::ICMP_UGT: if (!Op1->getValue().isAllOnesValue()) - NextVal = cast(ConstantExpr::getAdd( - Op1, ConstantInt::get(Op1->getType(), 1))); + NextVal = ConstantInt::get(Op1->getValue()+1); break; }