[llvm] r183532 - R600: Fix a potential iterator invalidation issue.
Benjamin Kramer
benny.kra at gmail.com
Fri Jun 7 11:24:15 PDT 2013
On 07.06.2013, at 18:53, Vincent Lejeune <vljn at ovi.com> wrote:
> Ok, I though vector::erase(Iterator) left vector untouched if Iterator was equal to vector::end()
Ah. I updated the file with the std::find code I posted in r183541 and added an assert to make sure Chan is really only once in the vector.
- Ben
>
>
> ----- Mail original -----
>> De : Benjamin Kramer <benny.kra at gmail.com>
>> À : Vincent Lejeune <vljn at ovi.com>
>> Cc : llvm-commits at cs.uiuc.edu
>> Envoyé le : Vendredi 7 juin 2013 18h37
>> Objet : Re: [llvm] r183532 - R600: Fix a potential iterator invalidation issue.
>>
>>
>> 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