@@ -374,7 +374,7 @@ optimizeFunction(Function *OldF,
374
374
}
375
375
Instruction *At = &*(NewF->getEntryBlock ().begin ());
376
376
377
- for (int I = 0 ; I < NewInsts.size (); ++I) {
377
+ for (unsigned I = 0 ; I < NewInsts.size (); ++I) {
378
378
NewInsts[I]->insertBefore (At);
379
379
}
380
380
return NewF;
@@ -394,7 +394,7 @@ void optimizeCall(CallInst *CI, Function *OptF,
394
394
int SretInd = -1 ;
395
395
IRBuilder<> Bld (CI); // insert before CI
396
396
397
- for (int I = 0 ; I < OptimizeableParams.size (); ++I) {
397
+ for (unsigned I = 0 ; I < OptimizeableParams.size (); ++I) {
398
398
const auto &PI = OptimizeableParams[I];
399
399
auto ArgNo = PI.getFormalParam ().getArgNo ();
400
400
@@ -475,20 +475,14 @@ static bool processFunction(Function *F) {
475
475
}
476
476
// Optimize the function.
477
477
Function *NewF = optimizeFunction (F, OptimizeableParams, NewParamTs);
478
- // Copy users to a separate container, to enable safe eraseFromParent.
479
- SmallVector<User *> FUsers;
480
- std::copy (F->users ().begin (), F->users ().end (), std::back_inserter (FUsers));
481
478
482
479
// Optimize calls to the function.
483
- // Iterate over FUsers, to enable safe eraseFromParent in optimizeCall.
484
- for (auto *U : FUsers) {
480
+ for (auto *U : F->users ()) {
485
481
auto *Call = cast<CallInst>(U);
486
482
assert (Call->getCalledFunction () == F);
487
483
optimizeCall (Call, NewF, OptimizeableParams);
488
484
}
489
- std::string Name = F->getName ().str ();
490
- F->eraseFromParent ();
491
- NewF->setName (Name);
485
+ NewF->takeName (F);
492
486
return true ;
493
487
}
494
488
@@ -506,13 +500,18 @@ ESIMDOptimizeVecArgCallConvPass::run(Module &M, ModuleAnalysisManager &MAM) {
506
500
}
507
501
#endif // DEBUG_OPT_VEC_ARG_CALL_CONV
508
502
509
- SmallVector<Function *, 16 > Funcs;
510
- std::for_each (M.begin (), M.end (), [&](Function &F) { Funcs.push_back (&F); });
503
+ SmallVector<Function *, 16 > ToErase;
511
504
512
- // Iterate over Funcs, to enable safe eraseFromParent in processFunction.
513
- for (Function *F : Funcs) {
514
- Modified &= processFunction (F);
505
+ for (Function &F : M) {
506
+ const bool FReplaced = processFunction (&F);
507
+ Modified &= FReplaced;
508
+
509
+ if (FReplaced) {
510
+ ToErase.push_back (&F);
511
+ }
515
512
}
513
+ std::for_each (ToErase.begin (), ToErase.end (),
514
+ [](Function *F) { F->eraseFromParent (); });
516
515
#ifdef DEBUG_OPT_VEC_ARG_CALL_CONV
517
516
{
518
517
std::error_code EC;
0 commit comments