<br><br>On Tuesday, August 19, 2014, Aaron Ballman <<a href="mailto:aaron@aaronballman.com">aaron@aaronballman.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I have reverted from this revision to r215957 (skipping only 215961 &<br>
215962 as they were unrelated) due to breaking MSVC with asserts. The<br>
assert is one in std::equal because it cannot be passed a nullptr,<br>
which your commits seemed to be doing. </blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"></blockquote><div><br></div><div>MSVC's STL is over zealous in this regard, it's a known bug; they really do not like nullptr iterators in some places. :/</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Since the patches all built on<br>
top of one another, I had to revert them in a block, sorry if this<br>
causes problems for you!<br>
<br>
~Aaron<br>
<br>
On Mon, Aug 18, 2014 at 10:24 PM, Duncan P. N. Exon Smith<br>
<<a href="javascript:;" onclick="_e(event, 'cvml', 'dexonsmith@apple.com')">dexonsmith@apple.com</a>> wrote:<br>
> Author: dexonsmith<br>
> Date: Mon Aug 18 21:24:46 2014<br>
> New Revision: 215966<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=215966&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=215966&view=rev</a><br>
> Log:<br>
> IR: Reduce RAUW traffic in ConstantVector<br>
><br>
> Avoid creating a new `ConstantVector` on an RAUW of one of its members.<br>
> This reduces RAUW traffic on any containing constant.<br>
><br>
> This is part of PR20515.<br>
><br>
> Modified:<br>
>     llvm/trunk/lib/IR/Constants.cpp<br>
><br>
> Modified: llvm/trunk/lib/IR/Constants.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Constants.cpp?rev=215966&r1=215965&r2=215966&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Constants.cpp?rev=215966&r1=215965&r2=215966&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/lib/IR/Constants.cpp (original)<br>
> +++ llvm/trunk/lib/IR/Constants.cpp Mon Aug 18 21:24:46 2014<br>
> @@ -2810,17 +2810,41 @@ void ConstantStruct::replaceUsesOfWithOn<br>
>  void ConstantVector::replaceUsesOfWithOnConstant(Value *From, Value *To,<br>
>                                                   Use *U) {<br>
>    assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");<br>
> +  Constant *ToC = cast<Constant>(To);<br>
><br>
>    SmallVector<Constant*, 8> Values;<br>
>    Values.reserve(getNumOperands());  // Build replacement array...<br>
> +  unsigned NumUpdated = 0;<br>
>    for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {<br>
>      Constant *Val = getOperand(i);<br>
> -    if (Val == From) Val = cast<Constant>(To);<br>
> +    if (Val == From) {<br>
> +      ++NumUpdated;<br>
> +      Val = ToC;<br>
> +    }<br>
>      Values.push_back(Val);<br>
>    }<br>
><br>
> -  Constant *Replacement = get(Values);<br>
> -  replaceUsesOfWithOnConstantImpl(Replacement);<br>
> +  if (Constant *C = getImpl(Values)) {<br>
> +    replaceUsesOfWithOnConstantImpl(C);<br>
> +    return;<br>
> +  }<br>
> +<br>
> +  // Update to the new value.  Optimize for the case when we have a single<br>
> +  // operand that we're changing, but handle bulk updates efficiently.<br>
> +  auto &pImpl = getType()->getContext().pImpl;<br>
> +  pImpl->VectorConstants.remove(this);<br>
> +<br>
> +  if (NumUpdated == 1) {<br>
> +    unsigned OperandToUpdate = U - OperandList;<br>
> +    assert(getOperand(OperandToUpdate) == From && "ReplaceAllUsesWith broken!");<br>
> +    setOperand(OperandToUpdate, ToC);<br>
> +  } else {<br>
> +    for (unsigned I = 0, E = getNumOperands(); I != E; ++I)<br>
> +      if (getOperand(I) == From)<br>
> +        setOperand(I, ToC);<br>
> +  }<br>
> +<br>
> +  pImpl->VectorConstants.insert(this);<br>
>  }<br>
><br>
>  void ConstantExpr::replaceUsesOfWithOnConstant(Value *From, Value *ToV,<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="javascript:;" onclick="_e(event, 'cvml', 'llvm-commits@cs.uiuc.edu')">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="javascript:;" onclick="_e(event, 'cvml', 'llvm-commits@cs.uiuc.edu')">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote>