[llvm] r215966 - IR: Reduce RAUW traffic in ConstantVector
Aaron Ballman
aaron at aaronballman.com
Tue Aug 19 08:12:46 PDT 2014
I have reverted from this revision to r215957 (skipping only 215961 &
215962 as they were unrelated) due to breaking MSVC with asserts. The
assert is one in std::equal because it cannot be passed a nullptr,
which your commits seemed to be doing. Since the patches all built on
top of one another, I had to revert them in a block, sorry if this
causes problems for you!
~Aaron
On Mon, Aug 18, 2014 at 10:24 PM, Duncan P. N. Exon Smith
<dexonsmith at apple.com> wrote:
> Author: dexonsmith
> Date: Mon Aug 18 21:24:46 2014
> New Revision: 215966
>
> URL: http://llvm.org/viewvc/llvm-project?rev=215966&view=rev
> Log:
> IR: Reduce RAUW traffic in ConstantVector
>
> Avoid creating a new `ConstantVector` on an RAUW of one of its members.
> This reduces RAUW traffic on any containing constant.
>
> This is part of PR20515.
>
> Modified:
> llvm/trunk/lib/IR/Constants.cpp
>
> Modified: llvm/trunk/lib/IR/Constants.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Constants.cpp?rev=215966&r1=215965&r2=215966&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/Constants.cpp (original)
> +++ llvm/trunk/lib/IR/Constants.cpp Mon Aug 18 21:24:46 2014
> @@ -2810,17 +2810,41 @@ void ConstantStruct::replaceUsesOfWithOn
> void ConstantVector::replaceUsesOfWithOnConstant(Value *From, Value *To,
> Use *U) {
> assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
> + Constant *ToC = cast<Constant>(To);
>
> SmallVector<Constant*, 8> Values;
> Values.reserve(getNumOperands()); // Build replacement array...
> + unsigned NumUpdated = 0;
> for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
> Constant *Val = getOperand(i);
> - if (Val == From) Val = cast<Constant>(To);
> + if (Val == From) {
> + ++NumUpdated;
> + Val = ToC;
> + }
> Values.push_back(Val);
> }
>
> - Constant *Replacement = get(Values);
> - replaceUsesOfWithOnConstantImpl(Replacement);
> + if (Constant *C = getImpl(Values)) {
> + replaceUsesOfWithOnConstantImpl(C);
> + return;
> + }
> +
> + // Update to the new value. Optimize for the case when we have a single
> + // operand that we're changing, but handle bulk updates efficiently.
> + auto &pImpl = getType()->getContext().pImpl;
> + pImpl->VectorConstants.remove(this);
> +
> + if (NumUpdated == 1) {
> + unsigned OperandToUpdate = U - OperandList;
> + assert(getOperand(OperandToUpdate) == From && "ReplaceAllUsesWith broken!");
> + setOperand(OperandToUpdate, ToC);
> + } else {
> + for (unsigned I = 0, E = getNumOperands(); I != E; ++I)
> + if (getOperand(I) == From)
> + setOperand(I, ToC);
> + }
> +
> + pImpl->VectorConstants.insert(this);
> }
>
> void ConstantExpr::replaceUsesOfWithOnConstant(Value *From, Value *ToV,
>
>
> _______________________________________________
> 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