From 48ee59b6f05d46a0d4996e920ca702374a979873 Mon Sep 17 00:00:00 2001 From: George Burgess IV Date: Thu, 12 Apr 2018 02:06:01 +0000 Subject: [PATCH] [DeadArgElim] Remove allocsize attributes on callsites We're already removing allocsize attributes from Functions that we remove args from, since removing arguments from a function may make the allocsize attribute incorrect. It appears we forgot to also remove them from callsites. Without this, I get verifier errors on `@Test2`. It probably wouldn't be too hard to make DAE properly update allocsize attributes instead of dropping them, but I can't think of a scenario where that'd be useful in practice. llvm-svn: 329868 --- llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp | 8 +++++++- llvm/test/Transforms/DeadArgElim/allocsize.ll | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp index 0c54b7fc9306..4ef8e4b509a3 100644 --- a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -916,8 +916,14 @@ bool DeadArgumentEliminationPass::RemoveDeadStuffFromFunction(Function *F) { // Reconstruct the AttributesList based on the vector we constructed. assert(ArgAttrVec.size() == Args.size()); + + // Again, be sure to remove any allocsize attributes, since their indices + // may now be incorrect. + AttributeSet FnAttrs = CallPAL.getFnAttributes().removeAttribute( + F->getContext(), Attribute::AllocSize); + AttributeList NewCallPAL = AttributeList::get( - F->getContext(), CallPAL.getFnAttributes(), RetAttrs, ArgAttrVec); + F->getContext(), FnAttrs, RetAttrs, ArgAttrVec); SmallVector OpBundles; CS.getOperandBundlesAsDefs(OpBundles); diff --git a/llvm/test/Transforms/DeadArgElim/allocsize.ll b/llvm/test/Transforms/DeadArgElim/allocsize.ll index eee55f09dc78..04c1f533eaa2 100644 --- a/llvm/test/Transforms/DeadArgElim/allocsize.ll +++ b/llvm/test/Transforms/DeadArgElim/allocsize.ll @@ -11,3 +11,8 @@ define i64 @NeedsArg(i64 %s) { %c = call i64 @MagickMallocAligned(i64 0, i64 %s) ret i64 %c } + +define i64 @Test2(i64 %s) { + %c = call i64 @MagickMallocAligned(i64 0, i64 %s) allocsize(1) + ret i64 %c +}