From: Arnold Schwaighofer Date: Wed, 21 Sep 2016 15:29:08 +0000 (+0000) Subject: DeadArgElim: Don't mark swifterror arguments as unused X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9993d5a21d67b6ce137705fa06712a7d4cfc35a;p=llvm DeadArgElim: Don't mark swifterror arguments as unused Replacing swifterror arguments with undef creates invalid IR. rdar://28300490 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282075 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/DeadArgumentElimination.cpp b/lib/Transforms/IPO/DeadArgumentElimination.cpp index c8c895b1879..c294d6450b5 100644 --- a/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ b/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -270,7 +270,7 @@ bool DeadArgumentEliminationPass::RemoveDeadArgumentsFromCallers(Function &Fn) { SmallVector UnusedArgs; for (Argument &Arg : Fn.args()) { - if (Arg.use_empty() && !Arg.hasByValOrInAllocaAttr()) + if (!Arg.hasSwiftErrorAttr() && Arg.use_empty() && !Arg.hasByValOrInAllocaAttr()) UnusedArgs.push_back(Arg.getArgNo()); } diff --git a/test/Transforms/DeadArgElim/deadexternal.ll b/test/Transforms/DeadArgElim/deadexternal.ll index 21cbc37a3f0..1b098c6fe52 100644 --- a/test/Transforms/DeadArgElim/deadexternal.ll +++ b/test/Transforms/DeadArgElim/deadexternal.ll @@ -50,3 +50,18 @@ entry: ret void } +%swift_error = type opaque + +define void @unused_swifterror_arg(%swift_error** swifterror %dead_arg) { + tail call void @sideeffect() nounwind + ret void +} + +; CHECK-LABEL: @dont_replace_by_undef +; CHECK-NOT: call void @unused_swifterror_arg({{.*}}undef) +define void @dont_replace_by_undef() { + %error_ptr_ref = alloca swifterror %swift_error* + store %swift_error* null, %swift_error** %error_ptr_ref + call void @unused_swifterror_arg(%swift_error** %error_ptr_ref) + ret void +}