Index: llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp =================================================================== --- llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -295,6 +295,10 @@ Changed = true; } UnusedArgs.push_back(Arg.getArgNo()); + Arg.removeAttr(Attribute::NoUndef); + Arg.removeAttr(Attribute::Dereferenceable); + Arg.removeAttr(Attribute::DereferenceableOrNull); + Arg.removeAttr(Attribute::NonNull); } } @@ -312,6 +316,11 @@ Value *Arg = CB->getArgOperand(ArgNo); CB->setArgOperand(ArgNo, UndefValue::get(Arg->getType())); + CB->removeParamAttr(ArgNo, Attribute::NoUndef); + CB->removeParamAttr(ArgNo, Attribute::Dereferenceable); + CB->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull); + CB->removeParamAttr(ArgNo, Attribute::NonNull); + ++NumArgumentsReplacedWithUndef; Changed = true; } Index: llvm/test/Transforms/DeadArgElim/NoundefAttrs.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/DeadArgElim/NoundefAttrs.ll @@ -0,0 +1,18 @@ +; RUN: opt -deadargelim -S < %s | FileCheck %s + +; If caller is changed to pass in undef, noundef and related attributes +; should be deleted. + + +; CHECK: define i64 @bar(i64* %0, i64 %1) +define i64 @bar(i64* nonnull dereferenceable(8) %0, i64 %1) { +entry: + %2 = add i64 %1, 8 + ret i64 %2 +} + +define i64 @foo(i64* %p, i64 %v) { +; CHECK: %retval = call i64 @bar(i64* undef, i64 %v) + %retval = call i64 @bar(i64* nonnull dereferenceable(8) %p, i64 %v) + ret i64 %retval +} Index: llvm/test/Transforms/InstCombine/unused-nonnull.ll =================================================================== --- llvm/test/Transforms/InstCombine/unused-nonnull.ll +++ llvm/test/Transforms/InstCombine/unused-nonnull.ll @@ -37,7 +37,7 @@ define i32 @compute(i8* noundef nonnull %ptr, i32 %x) #1 { ; CHECK-LABEL: define {{[^@]+}}@compute -; CHECK-SAME: (i8* nocapture noundef nonnull readnone [[PTR:%.*]], i32 returned [[X:%.*]]) local_unnamed_addr #1 +; CHECK-SAME: (i8* nocapture readnone [[PTR:%.*]], i32 returned [[X:%.*]]) local_unnamed_addr #1 ; CHECK-NEXT: ret i32 [[X]] ; ret i32 %x