summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold Schwaighofer <aschwaighofer@apple.com>2016-09-21 15:29:08 +0000
committerArnold Schwaighofer <aschwaighofer@apple.com>2016-09-21 15:29:08 +0000
commitf62ba1031fc88b76db2dc19960fd8da7ed5aefac (patch)
treec04001d0208e1e6f4863e194e640931ce44d5db2
parent62ba446223d5ed6abd3563d8527eda988cf885a7 (diff)
downloadbcm5719-llvm-f62ba1031fc88b76db2dc19960fd8da7ed5aefac.tar.gz
bcm5719-llvm-f62ba1031fc88b76db2dc19960fd8da7ed5aefac.zip
DeadArgElim: Don't mark swifterror arguments as unused
Replacing swifterror arguments with undef creates invalid IR. rdar://28300490 llvm-svn: 282075
-rw-r--r--llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp2
-rw-r--r--llvm/test/Transforms/DeadArgElim/deadexternal.ll15
2 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
index c8c895b1879..c294d6450b5 100644
--- a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
+++ b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
@@ -270,7 +270,7 @@ bool DeadArgumentEliminationPass::RemoveDeadArgumentsFromCallers(Function &Fn) {
SmallVector<unsigned, 8> 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/llvm/test/Transforms/DeadArgElim/deadexternal.ll b/llvm/test/Transforms/DeadArgElim/deadexternal.ll
index 21cbc37a3f0..1b098c6fe52 100644
--- a/llvm/test/Transforms/DeadArgElim/deadexternal.ll
+++ b/llvm/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
+}
OpenPOWER on IntegriCloud