[llvm] 41c5a76 - [DeadArgElim] Check that function type is the same

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 14 05:08:50 PST 2022


Author: Nikita Popov
Date: 2022-02-14T14:08:42+01:00
New Revision: 41c5a762e5334419fdf0f488de1361afba63cbbf

URL: https://github.com/llvm/llvm-project/commit/41c5a762e5334419fdf0f488de1361afba63cbbf
DIFF: https://github.com/llvm/llvm-project/commit/41c5a762e5334419fdf0f488de1361afba63cbbf.diff

LOG: [DeadArgElim] Check that function type is the same

If the function types differ, the call arguments don't necessarily
correspon to the function arguments. It's likely not worthwhile to
handle this more precisely, but at least we shouldn't crash.

Added: 
    llvm/test/Transforms/DeadArgElim/opaque-ptr.ll

Modified: 
    llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
index 2a6e38b0437fb..d7d6c7d31bc2f 100644
--- a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
+++ b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
@@ -306,7 +306,8 @@ bool DeadArgumentEliminationPass::RemoveDeadArgumentsFromCallers(Function &Fn) {
 
   for (Use &U : Fn.uses()) {
     CallBase *CB = dyn_cast<CallBase>(U.getUser());
-    if (!CB || !CB->isCallee(&U))
+    if (!CB || !CB->isCallee(&U) ||
+        CB->getFunctionType() != Fn.getFunctionType())
       continue;
 
     // Now go through all unused args and replace them with "undef".

diff  --git a/llvm/test/Transforms/DeadArgElim/opaque-ptr.ll b/llvm/test/Transforms/DeadArgElim/opaque-ptr.ll
new file mode 100644
index 0000000000000..039614d96980d
--- /dev/null
+++ b/llvm/test/Transforms/DeadArgElim/opaque-ptr.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
+; RUN: opt -S -passes=deadargelim -opaque-pointers < %s | FileCheck %s
+
+define void @callee(i32 %unused) {
+; CHECK-LABEL: define {{[^@]+}}@callee
+; CHECK-SAME: (i32 [[UNUSED:%.*]]) {
+; CHECK-NEXT:    ret void
+;
+  ret void
+}
+
+define void @caller() {
+; CHECK-LABEL: define {{[^@]+}}@caller() {
+; CHECK-NEXT:    call void @callee(i32 undef)
+; CHECK-NEXT:    call void @callee()
+; CHECK-NEXT:    call void @callee(i32 42, i32 24)
+; CHECK-NEXT:    ret void
+;
+  call void @callee(i32 42)
+  call void @callee()
+  call void @callee(i32 42, i32 24)
+  ret void
+}


        


More information about the llvm-commits mailing list