DeadArgElim: Don't mark swifterror arguments as unused
authorArnold Schwaighofer <aschwaighofer@apple.com>
Wed, 21 Sep 2016 15:29:08 +0000 (15:29 +0000)
committerArnold Schwaighofer <aschwaighofer@apple.com>
Wed, 21 Sep 2016 15:29:08 +0000 (15:29 +0000)
Replacing swifterror arguments with undef creates invalid IR.

rdar://28300490

llvm-svn: 282075

llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
llvm/test/Transforms/DeadArgElim/deadexternal.ll

index c8c895b..c294d64 100644 (file)
@@ -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());
   }
 
index 21cbc37..1b098c6 100644 (file)
@@ -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
+}