[llvm] r183532 - R600: Fix a potential iterator invalidation issue.

Benjamin Kramer benny.kra at gmail.com
Fri Jun 7 09:37:07 PDT 2013


On 07.06.2013, at 18:27, Vincent Lejeune <vljn at ovi.com> wrote:

> Hi,
> 
> I initially wrote the code almost like this way, using std::find instead of
> std::remove (because there is at most one element that is equal to chan in UpdatedUndef) but
> I got memory corruption error in some llvm IR.

If there's at most one equal element in the vector something like

    std::vector<unsigned>::iterator ChanPos =
        std::find(UpdatedUndef.begin(), UpdatedUndef.end(), Chan);
    if (ChanPos != UpdatedUndef.end())
      UpdatedUndef.erase(ChanPos);

should work. It would be a little bit faster because std::find exit early. The std::remove sequence is equivalent to the previous code but avoids the iterator invalidation issue.

- Ben

> 
> Vincent
> 
> ----- Mail original -----
>> De : Benjamin Kramer <benny.kra at googlemail.com>
>> À : llvm-commits at cs.uiuc.edu
>> Cc : 
>> Envoyé le : Vendredi 7 juin 2013 18h13
>> Objet : [llvm] r183532 - R600: Fix a potential iterator invalidation issue.
>> 
>> Author: d0k
>> Date: Fri Jun  7 11:13:49 2013
>> New Revision: 183532
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=183532&view=rev
>> Log:
>> R600: Fix a potential iterator invalidation issue.
>> 
>> As a bonus this reduces the loop from O(n^2) to O(n).
>> 
>> Modified:
>>     llvm/trunk/lib/Target/R600/R600OptimizeVectorRegisters.cpp
>> 
>> Modified: llvm/trunk/lib/Target/R600/R600OptimizeVectorRegisters.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/R600OptimizeVectorRegisters.cpp?rev=183532&r1=183531&r2=183532&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/R600/R600OptimizeVectorRegisters.cpp (original)
>> +++ llvm/trunk/lib/Target/R600/R600OptimizeVectorRegisters.cpp Fri Jun  7 
>> 11:13:49 2013
>> @@ -198,11 +198,9 @@ MachineInstr *R600VectorRegMerger::Rebui
>>          .addReg(SubReg)
>>          .addImm(Chan);
>>      UpdatedRegToChan[SubReg] = Chan;
>> -    for (std::vector<unsigned>::iterator RemoveIt = UpdatedUndef.begin(),
>> -        RemoveE = UpdatedUndef.end(); RemoveIt != RemoveE; ++ RemoveIt) {
>> -      if (*RemoveIt == Chan)
>> -        UpdatedUndef.erase(RemoveIt);
>> -    }
>> +    UpdatedUndef.erase(
>> +        std::remove(UpdatedUndef.begin(), UpdatedUndef.end(), Chan),
>> +        UpdatedUndef.end());
>>      DEBUG(dbgs() << "    ->"; Tmp->dump(););
>>      (void)Tmp;
>>      SrcVec = DstReg;
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 





More information about the llvm-commits mailing list