[llvm] r183459 - CodeGenSchedule: smallvector.push_back(smallvector[0]) is dangerous

Arnold Schwaighofer aschwaighofer at apple.com
Thu Jun 6 17:05:01 PDT 2013


r183465 for the reserve workaround

On Jun 6, 2013, at 6:38 PM, Andrew Trick <atrick at apple.com> wrote:

> 
> On Jun 6, 2013, at 4:33 PM, David Blaikie <dblaikie at gmail.com> wrote:
> 
>> On Thu, Jun 6, 2013 at 4:23 PM, Arnold Schwaighofer
>> <aschwaighofer at apple.com> wrote:
>>> Author: arnolds
>>> Date: Thu Jun  6 18:23:14 2013
>>> New Revision: 183459
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=183459&view=rev
>>> Log:
>>> CodeGenSchedule: smallvector.push_back(smallvector[0]) is dangerous
>>> 
>>> The element passed to push_back is not copied before the vector reallocates.
>> 
>> A similar change to this has been previously reverted: r178319
>> 
>> We should probably fix SmallVector to allow this, consistent with
>> standard containers, to avoid this pitfall now & in the future.
> 
> Agreed.
> 
> Meanwhile I think the proper workaround is:
> 
> RWSequences.reserve(RWSequences.size()+1);
> RWSequences.push_back(RWSequences[OperIdx]);
> 
> ...rather than copying the vector. Anyone disagree?
> 
> -Andy
> 
>>> The client needs to copy the element first before passing it to push_back.
>>> 
>>> No test case, will be tested by follow-up swift scheduler model change (it
>>> segfaults without this change).
>>> 
>>> Modified:
>>>    llvm/trunk/utils/TableGen/CodeGenSchedule.cpp
>>> 
>>> Modified: llvm/trunk/utils/TableGen/CodeGenSchedule.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenSchedule.cpp?rev=183459&r1=183458&r2=183459&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/utils/TableGen/CodeGenSchedule.cpp (original)
>>> +++ llvm/trunk/utils/TableGen/CodeGenSchedule.cpp Thu Jun  6 18:23:14 2013
>>> @@ -1172,7 +1172,9 @@ pushVariant(const TransVariant &VInfo, b
>>>     unsigned OperIdx = RWSequences.size()-1;
>>>     // Make N-1 copies of this transition's last sequence.
>>>     for (unsigned i = 1, e = SelectedRWs.size(); i != e; ++i) {
>>> -      RWSequences.push_back(RWSequences[OperIdx]);
>>> +      // Create a temporary copy the vector could reallocate.
>>> +      SmallVector<unsigned, 4> Tmp = RWSequences[OperIdx];
>>> +      RWSequences.push_back(Tmp);
>>>     }
>>>     // Push each of the N elements of the SelectedRWs onto a copy of the last
>>>     // sequence (split the current operand into N operands).
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> _______________________________________________
>> 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