mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-26 22:34:39 +00:00
Avoid copies of std::strings and APInt/APFloats where we only read from it
As suggested by clang-tidy's performance-unnecessary-copy-initialization. This can easily hit lifetime issues, so I audited every change and ran the tests under asan, which came back clean. llvm-svn: 272126
This commit is contained in:
parent
c1b262a77f
commit
5d5a0e4f68
@ -523,7 +523,7 @@ bool DependenceInfo::intersectConstraints(Constraint *X, const Constraint *Y) {
|
||||
}
|
||||
if (const SCEVConstant *CUB =
|
||||
collectConstantUpperBound(X->getAssociatedLoop(), Prod1->getType())) {
|
||||
APInt UpperBound = CUB->getAPInt();
|
||||
const APInt &UpperBound = CUB->getAPInt();
|
||||
DEBUG(dbgs() << "\t\tupper bound = " << UpperBound << "\n");
|
||||
if (Xq.sgt(UpperBound) || Yq.sgt(UpperBound)) {
|
||||
X->setEmpty();
|
||||
@ -1587,8 +1587,8 @@ bool DependenceInfo::exactSIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff,
|
||||
static
|
||||
bool isRemainderZero(const SCEVConstant *Dividend,
|
||||
const SCEVConstant *Divisor) {
|
||||
APInt ConstDividend = Dividend->getAPInt();
|
||||
APInt ConstDivisor = Divisor->getAPInt();
|
||||
const APInt &ConstDividend = Dividend->getAPInt();
|
||||
const APInt &ConstDivisor = Divisor->getAPInt();
|
||||
return ConstDividend.srem(ConstDivisor) == 0;
|
||||
}
|
||||
|
||||
|
@ -2300,7 +2300,7 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
||||
} else if (match(LHS, m_SDiv(m_Value(), m_ConstantInt(CI2)))) {
|
||||
APInt IntMin = APInt::getSignedMinValue(Width);
|
||||
APInt IntMax = APInt::getSignedMaxValue(Width);
|
||||
APInt Val = CI2->getValue();
|
||||
const APInt &Val = CI2->getValue();
|
||||
if (Val.isAllOnesValue()) {
|
||||
// 'sdiv x, -1' produces [INT_MIN + 1, INT_MAX]
|
||||
// where CI2 != -1 and CI2 != 0 and CI2 != 1
|
||||
|
@ -1120,7 +1120,7 @@ static void computeKnownBitsFromOperator(Operator *I, APInt &KnownZero,
|
||||
break;
|
||||
case Instruction::URem: {
|
||||
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||
APInt RA = Rem->getValue();
|
||||
const APInt &RA = Rem->getValue();
|
||||
if (RA.isPowerOf2()) {
|
||||
APInt LowBits = (RA - 1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, Depth + 1, Q);
|
||||
|
@ -8806,7 +8806,7 @@ SDValue DAGCombiner::visitFDIV(SDNode *N) {
|
||||
// fold (fdiv X, c2) -> fmul X, 1/c2 if losing precision is acceptable.
|
||||
if (N1CFP) {
|
||||
// Compute the reciprocal 1.0 / c2.
|
||||
APFloat N1APF = N1CFP->getValueAPF();
|
||||
const APFloat &N1APF = N1CFP->getValueAPF();
|
||||
APFloat Recip(N1APF.getSemantics(), 1); // 1.0
|
||||
APFloat::opStatus st = Recip.divide(N1APF, APFloat::rmNearestTiesToEven);
|
||||
// Only do the transform if the reciprocal is a legal fp immediate that
|
||||
@ -9874,7 +9874,7 @@ bool DAGCombiner::CombineToPreIndexedLoadStore(SDNode *N) {
|
||||
ConstantSDNode *CN =
|
||||
cast<ConstantSDNode>(OtherUses[i]->getOperand(OffsetIdx));
|
||||
int X0, X1, Y0, Y1;
|
||||
APInt Offset0 = CN->getAPIntValue();
|
||||
const APInt &Offset0 = CN->getAPIntValue();
|
||||
APInt Offset1 = cast<ConstantSDNode>(Offset)->getAPIntValue();
|
||||
|
||||
X0 = (OtherUses[i]->getOpcode() == ISD::SUB && OffsetIdx == 1) ? -1 : 1;
|
||||
@ -14336,7 +14336,7 @@ SDValue DAGCombiner::SimplifySelectCC(SDLoc DL, SDValue N0, SDValue N1,
|
||||
ConstantSDNode *ConstAndRHS = dyn_cast<ConstantSDNode>(N0->getOperand(1));
|
||||
if (ConstAndRHS && ConstAndRHS->getAPIntValue().countPopulation() == 1) {
|
||||
// Shift the tested bit over the sign bit.
|
||||
APInt AndMask = ConstAndRHS->getAPIntValue();
|
||||
const APInt &AndMask = ConstAndRHS->getAPIntValue();
|
||||
SDValue ShlAmt =
|
||||
DAG.getConstant(AndMask.countLeadingZeros(), SDLoc(AndLHS),
|
||||
getShiftAmountTy(AndLHS.getValueType()));
|
||||
|
@ -1142,7 +1142,7 @@ SDValue SelectionDAG::getConstant(const ConstantInt &Val, SDLoc DL, EVT VT,
|
||||
else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
|
||||
TLI->getTypeAction(*getContext(), EltVT) ==
|
||||
TargetLowering::TypeExpandInteger) {
|
||||
APInt NewVal = Elt->getValue();
|
||||
const APInt &NewVal = Elt->getValue();
|
||||
EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
|
||||
unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
|
||||
unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
|
||||
@ -3671,7 +3671,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1,
|
||||
};
|
||||
|
||||
if (N1C) {
|
||||
APInt Val = N1C->getAPIntValue();
|
||||
const APInt &Val = N1C->getAPIntValue();
|
||||
return SignExtendInReg(Val);
|
||||
}
|
||||
if (ISD::isBuildVectorOfConstantSDNodes(N1.getNode())) {
|
||||
@ -7261,7 +7261,7 @@ BuildVectorSDNode::getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements,
|
||||
dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements))) {
|
||||
bool IsExact;
|
||||
APSInt IntVal(BitWidth);
|
||||
APFloat APF = CN->getValueAPF();
|
||||
const APFloat &APF = CN->getValueAPF();
|
||||
if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
|
||||
APFloat::opOK ||
|
||||
!IsExact)
|
||||
|
@ -3663,7 +3663,7 @@ void Verifier::visitInstruction(Instruction &I) {
|
||||
Assert(MD->getNumOperands() == 1, "fpmath takes one operand!", &I);
|
||||
if (ConstantFP *CFP0 =
|
||||
mdconst::dyn_extract_or_null<ConstantFP>(MD->getOperand(0))) {
|
||||
APFloat Accuracy = CFP0->getValueAPF();
|
||||
const APFloat &Accuracy = CFP0->getValueAPF();
|
||||
Assert(Accuracy.isFiniteNonZero() && !Accuracy.isNegative(),
|
||||
"fpmath accuracy not a positive number!", &I);
|
||||
} else {
|
||||
|
@ -651,7 +651,7 @@ Init *UnOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const {
|
||||
return StringInit::get(LHSi->getAsString());
|
||||
} else {
|
||||
if (StringInit *LHSs = dyn_cast<StringInit>(LHS)) {
|
||||
std::string Name = LHSs->getValue();
|
||||
const std::string &Name = LHSs->getValue();
|
||||
|
||||
// From TGParser::ParseIDValue
|
||||
if (CurRec) {
|
||||
|
@ -7588,7 +7588,7 @@ static SDValue performMulCombine(SDNode *N, SelectionDAG &DAG,
|
||||
// gated on a subtarget feature. For Cyclone, 32-bit MADD is 4 cycles and
|
||||
// 64-bit is 5 cycles, so this is always a win.
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(1))) {
|
||||
APInt Value = C->getAPIntValue();
|
||||
const APInt &Value = C->getAPIntValue();
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc DL(N);
|
||||
if (Value.isNonNegative()) {
|
||||
|
@ -5075,7 +5075,7 @@ SDValue ARMTargetLowering::LowerConstantFP(SDValue Op, SelectionDAG &DAG,
|
||||
return SDValue();
|
||||
|
||||
// Try splatting with a VMOV.f32...
|
||||
APFloat FPVal = CFP->getValueAPF();
|
||||
const APFloat &FPVal = CFP->getValueAPF();
|
||||
int ImmVal = IsDouble ? ARM_AM::getFP64Imm(FPVal) : ARM_AM::getFP32Imm(FPVal);
|
||||
|
||||
if (ImmVal != -1) {
|
||||
@ -10601,7 +10601,7 @@ static void computeKnownBits(SelectionDAG &DAG, SDValue Op, APInt &KnownZero,
|
||||
// The operand to BFI is already a mask suitable for removing the bits it
|
||||
// sets.
|
||||
ConstantSDNode *CI = cast<ConstantSDNode>(Op.getOperand(2));
|
||||
APInt Mask = CI->getAPIntValue();
|
||||
const APInt &Mask = CI->getAPIntValue();
|
||||
KnownZero &= Mask;
|
||||
KnownOne &= Mask;
|
||||
return;
|
||||
|
@ -422,7 +422,7 @@ BT::RegisterCell BT::MachineEvaluator::eIMM(int64_t V, uint16_t W) const {
|
||||
|
||||
|
||||
BT::RegisterCell BT::MachineEvaluator::eIMM(const ConstantInt *CI) const {
|
||||
APInt A = CI->getValue();
|
||||
const APInt &A = CI->getValue();
|
||||
uint16_t BW = A.getBitWidth();
|
||||
assert((unsigned)BW == A.getBitWidth() && "BitWidth overflow");
|
||||
RegisterCell Res(BW);
|
||||
|
@ -1066,7 +1066,7 @@ void HexagonDAGToDAGISel::SelectIntrinsicWOChain(SDNode *N) {
|
||||
void HexagonDAGToDAGISel::SelectConstantFP(SDNode *N) {
|
||||
SDLoc dl(N);
|
||||
ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N);
|
||||
APFloat APF = CN->getValueAPF();
|
||||
const APFloat &APF = CN->getValueAPF();
|
||||
if (N->getValueType(0) == MVT::f32) {
|
||||
ReplaceNode(
|
||||
N, CurDAG->getMachineNode(Hexagon::TFRI_f, dl, MVT::f32,
|
||||
|
@ -277,7 +277,7 @@ bool NVPTXAsmPrinter::lowerOperand(const MachineOperand &MO,
|
||||
break;
|
||||
case MachineOperand::MO_FPImmediate: {
|
||||
const ConstantFP *Cnt = MO.getFPImm();
|
||||
APFloat Val = Cnt->getValueAPF();
|
||||
const APFloat &Val = Cnt->getValueAPF();
|
||||
|
||||
switch (Cnt->getType()->getTypeID()) {
|
||||
default: report_fatal_error("Unsupported FP type"); break;
|
||||
|
@ -4153,7 +4153,7 @@ static bool AreMulWideOperandsDemotable(SDValue LHS, SDValue RHS,
|
||||
|
||||
// The RHS can be a demotable op or a constant
|
||||
if (ConstantSDNode *CI = dyn_cast<ConstantSDNode>(RHS)) {
|
||||
APInt Val = CI->getAPIntValue();
|
||||
const APInt &Val = CI->getAPIntValue();
|
||||
if (LHSSign == Unsigned) {
|
||||
return Val.isIntN(OptSize);
|
||||
} else {
|
||||
|
@ -4764,7 +4764,7 @@ static bool getTargetShuffleMaskIndices(SDValue MaskNode,
|
||||
if (VT.getScalarSizeInBits() != MaskEltSizeInBits)
|
||||
return false;
|
||||
if (auto *CN = dyn_cast<ConstantSDNode>(MaskNode.getOperand(0))) {
|
||||
APInt MaskElement = CN->getAPIntValue();
|
||||
const APInt &MaskElement = CN->getAPIntValue();
|
||||
for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i) {
|
||||
APInt RawElt = MaskElement.getLoBits(MaskEltSizeInBits);
|
||||
RawMask.push_back(RawElt.getZExtValue());
|
||||
@ -26928,7 +26928,7 @@ static SDValue combineShiftLeft(SDNode *N, SelectionDAG &DAG) {
|
||||
N0.getOperand(1).getOpcode() == ISD::Constant) {
|
||||
SDValue N00 = N0.getOperand(0);
|
||||
APInt Mask = cast<ConstantSDNode>(N0.getOperand(1))->getAPIntValue();
|
||||
APInt ShAmt = N1C->getAPIntValue();
|
||||
const APInt &ShAmt = N1C->getAPIntValue();
|
||||
Mask = Mask.shl(ShAmt);
|
||||
bool MaskOK = false;
|
||||
// We can handle cases concerning bit-widening nodes containing setcc_c if
|
||||
@ -27044,7 +27044,7 @@ static SDValue performShiftToAllZeros(SDNode *N, SelectionDAG &DAG,
|
||||
SDLoc DL(N);
|
||||
if (auto *AmtBV = dyn_cast<BuildVectorSDNode>(Amt))
|
||||
if (auto *AmtSplat = AmtBV->getConstantSplatNode()) {
|
||||
APInt ShiftAmt = AmtSplat->getAPIntValue();
|
||||
const APInt &ShiftAmt = AmtSplat->getAPIntValue();
|
||||
unsigned MaxAmount =
|
||||
VT.getSimpleVT().getVectorElementType().getSizeInBits();
|
||||
|
||||
@ -30330,7 +30330,7 @@ static bool clobbersFlagRegisters(const SmallVector<StringRef, 4> &AsmPieces) {
|
||||
bool X86TargetLowering::ExpandInlineAsm(CallInst *CI) const {
|
||||
InlineAsm *IA = cast<InlineAsm>(CI->getCalledValue());
|
||||
|
||||
std::string AsmStr = IA->getAsmString();
|
||||
const std::string &AsmStr = IA->getAsmString();
|
||||
|
||||
IntegerType *Ty = dyn_cast<IntegerType>(CI->getType());
|
||||
if (!Ty || Ty->getBitWidth() % 16 != 0)
|
||||
|
@ -1543,7 +1543,7 @@ void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
||||
CS << CI->getZExtValue();
|
||||
} else {
|
||||
// print multi-word constant as (w0,w1)
|
||||
auto Val = CI->getValue();
|
||||
const auto &Val = CI->getValue();
|
||||
CS << "(";
|
||||
for (int i = 0, N = Val.getNumWords(); i < N; ++i) {
|
||||
if (i > 0)
|
||||
|
@ -1866,7 +1866,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
|
||||
// Attempt to simplify to a constant, shuffle vector or INSERTQI call.
|
||||
if (CI11) {
|
||||
APInt V11 = CI11->getValue();
|
||||
const APInt &V11 = CI11->getValue();
|
||||
APInt Len = V11.zextOrTrunc(6);
|
||||
APInt Idx = V11.lshr(8).zextOrTrunc(6);
|
||||
if (Value *V = simplifyX86insertq(*II, Op0, Op1, Len, Idx, *Builder))
|
||||
|
@ -1444,8 +1444,8 @@ Instruction *InstCombiner::FoldICmpCstShrCst(ICmpInst &I, Value *Op, Value *A,
|
||||
return new ICmpInst(Pred, LHS, RHS);
|
||||
};
|
||||
|
||||
APInt AP1 = CI1->getValue();
|
||||
APInt AP2 = CI2->getValue();
|
||||
const APInt &AP1 = CI1->getValue();
|
||||
const APInt &AP2 = CI2->getValue();
|
||||
|
||||
// Don't bother doing any work for cases which InstSimplify handles.
|
||||
if (AP2 == 0)
|
||||
@ -1508,8 +1508,8 @@ Instruction *InstCombiner::FoldICmpCstShlCst(ICmpInst &I, Value *Op, Value *A,
|
||||
return new ICmpInst(Pred, LHS, RHS);
|
||||
};
|
||||
|
||||
APInt AP1 = CI1->getValue();
|
||||
APInt AP2 = CI2->getValue();
|
||||
const APInt &AP1 = CI1->getValue();
|
||||
const APInt &AP2 = CI2->getValue();
|
||||
|
||||
// Don't bother doing any work for cases which InstSimplify handles.
|
||||
if (AP2 == 0)
|
||||
@ -2092,8 +2092,8 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
|
||||
case Instruction::UDiv:
|
||||
if (ConstantInt *DivLHS = dyn_cast<ConstantInt>(LHSI->getOperand(0))) {
|
||||
Value *X = LHSI->getOperand(1);
|
||||
APInt C1 = RHS->getValue();
|
||||
APInt C2 = DivLHS->getValue();
|
||||
const APInt &C1 = RHS->getValue();
|
||||
const APInt &C2 = DivLHS->getValue();
|
||||
assert(C2 != 0 && "udiv 0, X should have been simplified already.");
|
||||
// (icmp ugt (udiv C2, X), C1) -> (icmp ule X, C2/(C1+1))
|
||||
if (ICI.getPredicate() == ICmpInst::ICMP_UGT) {
|
||||
|
@ -663,8 +663,8 @@ Instruction *InstCombiner::FoldSPFofSPF(Instruction *Inner,
|
||||
if (SPF1 == SPF2) {
|
||||
if (ConstantInt *CB = dyn_cast<ConstantInt>(B)) {
|
||||
if (ConstantInt *CC = dyn_cast<ConstantInt>(C)) {
|
||||
APInt ACB = CB->getValue();
|
||||
APInt ACC = CC->getValue();
|
||||
const APInt &ACB = CB->getValue();
|
||||
const APInt &ACC = CC->getValue();
|
||||
|
||||
// MIN(MIN(A, 23), 97) -> MIN(A, 23)
|
||||
// MAX(MAX(A, 97), 23) -> MAX(A, 97)
|
||||
|
@ -1615,7 +1615,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
for (unsigned Idx = 0; Idx < NumElements; ++Idx) {
|
||||
if (ConstantInt *Elt =
|
||||
dyn_cast<ConstantInt>(ConstArg->getAggregateElement(Idx))) {
|
||||
APInt V = Elt->getValue();
|
||||
const APInt &V = Elt->getValue();
|
||||
APInt V2 = APInt(V.getBitWidth(), 1) << V.countTrailingZeros();
|
||||
Elements.push_back(ConstantInt::get(EltTy, V2));
|
||||
} else {
|
||||
@ -1625,7 +1625,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
ShadowMul = ConstantVector::get(Elements);
|
||||
} else {
|
||||
if (ConstantInt *Elt = dyn_cast<ConstantInt>(ConstArg)) {
|
||||
APInt V = Elt->getValue();
|
||||
const APInt &V = Elt->getValue();
|
||||
APInt V2 = APInt(V.getBitWidth(), 1) << V.countTrailingZeros();
|
||||
ShadowMul = ConstantInt::get(Ty, V2);
|
||||
} else {
|
||||
|
@ -317,7 +317,7 @@ void Float2Int::walkForwards() {
|
||||
// Instead, we ask APFloat to round itself to an integral value - this
|
||||
// preserves sign-of-zero - then compare the result with the original.
|
||||
//
|
||||
APFloat F = CF->getValueAPF();
|
||||
const APFloat &F = CF->getValueAPF();
|
||||
|
||||
// First, weed out obviously incorrect values. Non-finite numbers
|
||||
// can't be represented and neither can negative zero, unless
|
||||
|
@ -599,7 +599,7 @@ bool GuardWideningImpl::combineRangeChecks(
|
||||
return false;
|
||||
|
||||
APInt MaxDiff = MaxOffset->getValue() - MinOffset->getValue();
|
||||
APInt HighOffset = MaxOffset->getValue();
|
||||
const APInt &HighOffset = MaxOffset->getValue();
|
||||
auto OffsetOK = [&](const GuardWideningImpl::RangeCheck &RC) {
|
||||
return (HighOffset - RC.getOffsetValue()).ult(MaxDiff);
|
||||
};
|
||||
|
@ -1028,7 +1028,7 @@ Value *ReassociatePass::RemoveFactorFromExpression(Value *V, Value *Factor) {
|
||||
}
|
||||
} else if (ConstantFP *FC1 = dyn_cast<ConstantFP>(Factor)) {
|
||||
if (ConstantFP *FC2 = dyn_cast<ConstantFP>(Factors[i].Op)) {
|
||||
APFloat F1(FC1->getValueAPF());
|
||||
const APFloat &F1 = FC1->getValueAPF();
|
||||
APFloat F2(FC2->getValueAPF());
|
||||
F2.changeSign();
|
||||
if (F1.compare(F2) == APFloat::cmpEqual) {
|
||||
|
@ -254,7 +254,7 @@ public:
|
||||
~LLIObjectCache() override {}
|
||||
|
||||
void notifyObjectCompiled(const Module *M, MemoryBufferRef Obj) override {
|
||||
const std::string ModuleID = M->getModuleIdentifier();
|
||||
const std::string &ModuleID = M->getModuleIdentifier();
|
||||
std::string CacheName;
|
||||
if (!getCacheFilename(ModuleID, CacheName))
|
||||
return;
|
||||
@ -269,7 +269,7 @@ public:
|
||||
}
|
||||
|
||||
std::unique_ptr<MemoryBuffer> getObject(const Module* M) override {
|
||||
const std::string ModuleID = M->getModuleIdentifier();
|
||||
const std::string &ModuleID = M->getModuleIdentifier();
|
||||
std::string CacheName;
|
||||
if (!getCacheFilename(ModuleID, CacheName))
|
||||
return nullptr;
|
||||
|
Loading…
x
Reference in New Issue
Block a user