- // Check to see which arguments are promotable. If an argument is not
- // promotable, remove it from the PointerArgs vector.
- for (unsigned i = 0; i != PointerArgs.size(); ++i)
- if (!isSafeToPromoteArgument(PointerArgs[i])) {
- std::swap(PointerArgs[i--], PointerArgs.back());
- PointerArgs.pop_back();
- }
-
+ // Check to see which arguments are promotable. If an argument is promotable,
+ // add it to ArgsToPromote.
+ SmallPtrSet<Argument*, 8> ArgsToPromote;
+ for (unsigned i = 0; i != PointerArgs.size(); ++i) {
+ bool isByVal = F->paramHasAttr(PointerArgs[i].second, ParamAttr::ByVal);
+ if (isSafeToPromoteArgument(PointerArgs[i].first, isByVal))
+ ArgsToPromote.insert(PointerArgs[i].first);
+ }
+