Skip to content

Commit 50fa3b4

Browse files
authored
ValueFlow: avoid various unnecessary copies (danmar#8207)
1 parent e4a8480 commit 50fa3b4

File tree

2 files changed

+52
-57
lines changed

2 files changed

+52
-57
lines changed

lib/valueflow.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,7 +1511,7 @@ ValueFlow::Value ValueFlow::getLifetimeObjValue(const Token *tok, bool inconclus
15111511
// There should only be one lifetime
15121512
if (values.size() != 1)
15131513
return ValueFlow::Value{};
1514-
return values.front();
1514+
return std::move(values.front());
15151515
}
15161516

15171517
template<class Predicate>
@@ -3652,7 +3652,7 @@ static void valueFlowSymbolicOperators(const SymbolDatabase& symboldatabase, con
36523652
continue;
36533653

36543654
ValueFlow::Value v = makeSymbolic(arg);
3655-
v.errorPath = c.errorPath;
3655+
v.errorPath = std::move(c.errorPath);
36563656
v.errorPath.emplace_back(tok, "Passed to " + tok->str());
36573657
if (c.intvalue == 0)
36583658
v.setImpossible();
@@ -5070,8 +5070,7 @@ static void valueFlowInferCondition(TokenList& tokenlist, const Settings& settin
50705070
std::vector<ValueFlow::Value> result = infer(makeIntegralInferModel(), "!=", tok->values(), 0);
50715071
if (result.size() != 1)
50725072
continue;
5073-
ValueFlow::Value value = result.front();
5074-
setTokenValue(tok, std::move(value), settings);
5073+
setTokenValue(tok, std::move(result.front()), settings);
50755074
}
50765075
}
50775076
}
@@ -5490,7 +5489,7 @@ static void valueFlowInjectParameter(const TokenList& tokenlist,
54905489
const Settings& settings,
54915490
const Variable* arg,
54925491
const Scope* functionScope,
5493-
const std::list<ValueFlow::Value>& argvalues)
5492+
std::list<ValueFlow::Value> argvalues)
54945493
{
54955494
// Is argument passed by value or const reference, and is it a known non-class type?
54965495
if (arg->isReference() && !arg->isConst() && !arg->isClass())
@@ -5504,7 +5503,7 @@ static void valueFlowInjectParameter(const TokenList& tokenlist,
55045503
valueFlowForward(const_cast<Token*>(functionScope->bodyStart->next()),
55055504
functionScope->bodyEnd,
55065505
arg->nameToken(),
5507-
argvalues,
5506+
std::move(argvalues),
55085507
tokenlist,
55095508
errorLogger,
55105509
settings);
@@ -5731,7 +5730,7 @@ static void valueFlowFunctionDefaultParameter(const TokenList& tokenlist, const
57315730
argvalues.push_back(std::move(v));
57325731
}
57335732
if (!argvalues.empty())
5734-
valueFlowInjectParameter(tokenlist, errorLogger, settings, var, scope, argvalues);
5733+
valueFlowInjectParameter(tokenlist, errorLogger, settings, var, scope, std::move(argvalues));
57355734
}
57365735
}
57375736
}

lib/vf_settokenvalue.cpp

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -126,32 +126,31 @@ namespace ValueFlow
126126
return value.isIntValue() || value.isFloatValue();
127127
}
128128

129-
static void setTokenValueCast(Token *parent, const ValueType &valueType, const Value &value, const Settings &settings)
129+
static void setTokenValueCast(Token *parent, const ValueType &valueType, Value value, const Settings &settings)
130130
{
131131
if (valueType.pointer || value.isImpossible())
132-
setTokenValue(parent,value,settings);
132+
setTokenValue(parent,std::move(value),settings);
133133
else if (valueType.type == ValueType::Type::CHAR)
134-
setTokenValue(parent, castValue(value, valueType.sign, settings.platform.char_bit), settings);
134+
setTokenValue(parent, castValue(std::move(value), valueType.sign, settings.platform.char_bit), settings);
135135
else if (valueType.type == ValueType::Type::SHORT)
136-
setTokenValue(parent, castValue(value, valueType.sign, settings.platform.short_bit), settings);
136+
setTokenValue(parent, castValue(std::move(value), valueType.sign, settings.platform.short_bit), settings);
137137
else if (valueType.type == ValueType::Type::INT)
138-
setTokenValue(parent, castValue(value, valueType.sign, settings.platform.int_bit), settings);
138+
setTokenValue(parent, castValue(std::move(value), valueType.sign, settings.platform.int_bit), settings);
139139
else if (valueType.type == ValueType::Type::LONG)
140-
setTokenValue(parent, castValue(value, valueType.sign, settings.platform.long_bit), settings);
140+
setTokenValue(parent, castValue(std::move(value), valueType.sign, settings.platform.long_bit), settings);
141141
else if (valueType.type == ValueType::Type::LONGLONG)
142-
setTokenValue(parent, castValue(value, valueType.sign, settings.platform.long_long_bit), settings);
142+
setTokenValue(parent, castValue(std::move(value), valueType.sign, settings.platform.long_long_bit), settings);
143143
else if (valueType.isFloat() && isNumeric(value)) {
144-
Value floatValue = value;
145-
floatValue.valueType = Value::ValueType::FLOAT;
146144
if (value.isIntValue())
147-
floatValue.floatValue = static_cast<double>(value.intvalue);
148-
setTokenValue(parent, std::move(floatValue), settings);
145+
value.floatValue = static_cast<double>(value.intvalue);
146+
value.valueType = Value::ValueType::FLOAT;
147+
setTokenValue(parent, std::move(value), settings);
149148
} else if (value.isIntValue()) {
150149
const long long charMax = settings.platform.signedCharMax();
151150
const long long charMin = settings.platform.signedCharMin();
152151
if (charMin <= value.intvalue && value.intvalue <= charMax) {
153152
// unknown type, but value is small so there should be no truncation etc
154-
setTokenValue(parent,value,settings);
153+
setTokenValue(parent,std::move(value),settings);
155154
}
156155
}
157156
}
@@ -307,22 +306,23 @@ namespace ValueFlow
307306
value.valueType = Value::ValueType::INT;
308307
setTokenValue(next, std::move(value), settings);
309308
} else if (yields == Library::Container::Yield::EMPTY) {
310-
Value v(value);
311-
v.valueType = Value::ValueType::INT;
312-
v.bound = Value::Bound::Point;
309+
const Value::Bound bound = value.bound;
310+
const long long intvalue = value.intvalue;
311+
value.valueType = Value::ValueType::INT;
312+
value.bound = Value::Bound::Point;
313313
if (value.isImpossible()) {
314-
if (value.intvalue == 0)
315-
v.setKnown();
316-
else if ((value.bound == Value::Bound::Upper && value.intvalue > 0) ||
317-
(value.bound == Value::Bound::Lower && value.intvalue < 0)) {
318-
v.intvalue = 0;
319-
v.setKnown();
314+
if (intvalue == 0)
315+
value.setKnown();
316+
else if ((bound == Value::Bound::Upper && intvalue > 0) ||
317+
(bound == Value::Bound::Lower && intvalue < 0)) {
318+
value.intvalue = 0;
319+
value.setKnown();
320320
} else
321-
v.setPossible();
321+
value.setPossible();
322322
} else {
323-
v.intvalue = !v.intvalue;
323+
value.intvalue = !value.intvalue;
324324
}
325-
setTokenValue(next, std::move(v), settings);
325+
setTokenValue(next, std::move(value), settings);
326326
}
327327
return;
328328
}
@@ -346,27 +346,26 @@ namespace ValueFlow
346346
setTokenValue(parent, std::move(value), settings);
347347
return;
348348
}
349-
Value pvalue = value;
350349
if (!value.subexpressions.empty() && Token::Match(parent, ". %var%")) {
351350
if (contains(value.subexpressions, parent->strAt(1)))
352-
pvalue.subexpressions.clear();
351+
value.subexpressions.clear();
353352
else
354353
return;
355354
}
356355
if (parent->isUnaryOp("&")) {
357-
pvalue.indirect++;
358-
setTokenValue(parent, std::move(pvalue), settings);
356+
value.indirect++;
357+
setTokenValue(parent, std::move(value), settings);
359358
} else if (Token::Match(parent, ". %var%") && parent->astOperand1() == tok && parent->astOperand2()) {
360-
if (parent->originalName() == "->" && pvalue.indirect > 0)
361-
pvalue.indirect--;
362-
setTokenValue(parent->astOperand2(), std::move(pvalue), settings);
359+
if (parent->originalName() == "->" && value.indirect > 0)
360+
value.indirect--;
361+
setTokenValue(parent->astOperand2(), std::move(value), settings);
363362
} else if (Token::Match(parent->astParent(), ". %var%") && parent->astParent()->astOperand1() == parent) {
364-
if (parent->astParent()->originalName() == "->" && pvalue.indirect > 0)
365-
pvalue.indirect--;
366-
setTokenValue(parent->astParent()->astOperand2(), std::move(pvalue), settings);
367-
} else if (parent->isUnaryOp("*") && pvalue.indirect > 0) {
368-
pvalue.indirect--;
369-
setTokenValue(parent, std::move(pvalue), settings);
363+
if (parent->astParent()->originalName() == "->" && value.indirect > 0)
364+
value.indirect--;
365+
setTokenValue(parent->astParent()->astOperand2(), std::move(value), settings);
366+
} else if (parent->isUnaryOp("*") && value.indirect > 0) {
367+
value.indirect--;
368+
setTokenValue(parent, std::move(value), settings);
370369
}
371370
return;
372371
}
@@ -382,7 +381,7 @@ namespace ValueFlow
382381
&& tok->valueType()->getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer)
383382
>= valueType.getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer))
384383
return;
385-
setTokenValueCast(parent, valueType, value, settings);
384+
setTokenValueCast(parent, valueType, std::move(value), settings);
386385
}
387386

388387
else if (parent->str() == ":") {
@@ -421,11 +420,10 @@ namespace ValueFlow
421420
if (ret)
422421
return;
423422

424-
Value v(std::move(value));
425-
v.conditional = true;
426-
v.changeKnownToPossible();
423+
value.conditional = true;
424+
value.changeKnownToPossible();
427425

428-
setTokenValue(parent, std::move(v), settings);
426+
setTokenValue(parent, std::move(value), settings);
429427
}
430428
}
431429

@@ -713,15 +711,13 @@ namespace ValueFlow
713711
std::vector<const Token*> args = getArguments(value.tokvalue);
714712
if (const Library::Function* f = settings.library.getFunction(parent->previous())) {
715713
if (f->containerYield == Library::Container::Yield::SIZE) {
716-
Value v(std::move(value));
717-
v.valueType = Value::ValueType::INT;
718-
v.intvalue = args.size();
719-
setTokenValue(parent, std::move(v), settings);
714+
value.valueType = Value::ValueType::INT;
715+
value.intvalue = args.size();
716+
setTokenValue(parent, std::move(value), settings);
720717
} else if (f->containerYield == Library::Container::Yield::EMPTY) {
721-
Value v(std::move(value));
722-
v.intvalue = args.empty();
723-
v.valueType = Value::ValueType::INT;
724-
setTokenValue(parent, std::move(v), settings);
718+
value.intvalue = args.empty();
719+
value.valueType = Value::ValueType::INT;
720+
setTokenValue(parent, std::move(value), settings);
725721
}
726722
}
727723
}

0 commit comments

Comments
 (0)