[llvm] 51561b5 - [ArgPromo][OpaquePointer] Don't promote mismatched function types
Arthur Eubanks via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 12 15:18:16 PDT 2022
Author: Arthur Eubanks
Date: 2022-04-12T15:17:45-07:00
New Revision: 51561b5e8017a3153629ba45b89d013ffa665f6c
URL: https://github.com/llvm/llvm-project/commit/51561b5e8017a3153629ba45b89d013ffa665f6c
DIFF: https://github.com/llvm/llvm-project/commit/51561b5e8017a3153629ba45b89d013ffa665f6c.diff
LOG: [ArgPromo][OpaquePointer] Don't promote mismatched function types
Mismatched call/callee function types is considered an indirect call.
Fixes crash in https://reviews.llvm.org/D123300#3446023.
Added:
Modified:
llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
llvm/test/Transforms/ArgumentPromotion/opaque-ptr.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
index 354971aeff744..18a1b8351a91f 100644
--- a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
+++ b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
@@ -793,7 +793,8 @@ promoteArguments(Function *F, function_ref<AAResults &(Function &F)> AARGetter,
for (Use &U : F->uses()) {
CallBase *CB = dyn_cast<CallBase>(U.getUser());
// Must be a direct call.
- if (CB == nullptr || !CB->isCallee(&U))
+ if (CB == nullptr || !CB->isCallee(&U) ||
+ CB->getFunctionType() != F->getFunctionType())
return nullptr;
// Can't change signature of musttail callee
diff --git a/llvm/test/Transforms/ArgumentPromotion/opaque-ptr.ll b/llvm/test/Transforms/ArgumentPromotion/opaque-ptr.ll
index 25939bc900b86..70cdf0c36000e 100644
--- a/llvm/test/Transforms/ArgumentPromotion/opaque-ptr.ll
+++ b/llvm/test/Transforms/ArgumentPromotion/opaque-ptr.ll
@@ -80,3 +80,21 @@ define void @caller_overlap(ptr %p) {
call i32 @callee_overlap(ptr %p)
ret void
}
+
+; Don't promote calls with function type mismatch.
+define void @caller_type_mismatch() {
+; CHECK-LABEL: define {{[^@]+}}@caller_type_mismatch() {
+; CHECK-NEXT: [[TMP1:%.*]] = call i32 @callee_type_mismatch(ptr null)
+; CHECK-NEXT: ret void
+;
+ call i32 @callee_type_mismatch(ptr null)
+ ret void
+}
+
+define internal void @callee_type_mismatch(ptr %p) {
+; CHECK-LABEL: define {{[^@]+}}@callee_type_mismatch
+; CHECK-SAME: (ptr [[P:%.*]]) {
+; CHECK-NEXT: ret void
+;
+ ret void
+}
More information about the llvm-commits
mailing list