[llvm] Fix crash when alloc functions are missing `alloc-family` (PR #138310)
via llvm-commits
llvm-commits at lists.llvm.org
Fri May 2 10:09:35 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: None (clubby789)
<details>
<summary>Changes</summary>
Fixes #<!-- -->63477 by bailing out instead of crashing
---
Full diff: https://github.com/llvm/llvm-project/pull/138310.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/InstCombine/InstructionCombining.cpp (+4-2)
- (modified) llvm/test/Transforms/InstCombine/malloc-free-mismatched.ll (+19-1)
``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index f807f5f4519fc..43b858ed327df 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -3302,14 +3302,16 @@ static bool isAllocSiteRemovable(Instruction *AI,
if (getFreedOperand(cast<CallBase>(I), &TLI) == PI &&
getAllocationFamily(I, &TLI) == Family) {
- assert(Family);
+ if (!Family)
+ return false;
Users.emplace_back(I);
continue;
}
if (getReallocatedOperand(cast<CallBase>(I)) == PI &&
getAllocationFamily(I, &TLI) == Family) {
- assert(Family);
+ if (!Family)
+ return false;
Users.emplace_back(I);
Worklist.push_back(I);
continue;
diff --git a/llvm/test/Transforms/InstCombine/malloc-free-mismatched.ll b/llvm/test/Transforms/InstCombine/malloc-free-mismatched.ll
index 658dbd662508c..5f31d787839e2 100644
--- a/llvm/test/Transforms/InstCombine/malloc-free-mismatched.ll
+++ b/llvm/test/Transforms/InstCombine/malloc-free-mismatched.ll
@@ -3,7 +3,7 @@
define dso_local i32 @_Z6answeri(i32 %0) {
; CHECK-LABEL: @_Z6answeri(
-; CHECK-NEXT: [[TMP2:%.*]] = call noalias nonnull dereferenceable(80) ptr @_Znam(i64 80) #[[ATTR2:[0-9]+]]
+; CHECK-NEXT: [[TMP2:%.*]] = call noalias nonnull dereferenceable(80) ptr @_Znam(i64 80) #[[ATTR4:[0-9]+]]
; CHECK-NEXT: call void @free(ptr [[TMP2]])
; CHECK-NEXT: ret i32 42
;
@@ -25,11 +25,29 @@ define void @test_alloca() {
ret void
}
+; Test that missing `alloc-family` attributes don't crash LLVM
+; https://github.com/llvm/llvm-project/issues/63749
+
+define void @no_family() {
+; CHECK-LABEL: @no_family(
+; CHECK-NEXT: [[ALLOC:%.*]] = call ptr @customalloc(i64 64)
+; CHECK-NEXT: call void @customfree(ptr [[ALLOC]])
+; CHECK-NEXT: ret void
+;
+ %alloc = call ptr @customalloc(i64 64)
+ call void @customfree(ptr %alloc)
+ ret void
+}
+
+
; Function Attrs: nobuiltin allocsize(0)
declare dso_local nonnull ptr @_Znam(i64) #1
; Function Attrs: nounwind
declare dso_local void @free(ptr) allockind("free") "alloc-family"="malloc"
+declare ptr @customalloc(i64) allockind("alloc")
+declare void @customfree(ptr allocptr) allockind("free")
+
attributes #0 = { builtin allocsize(0) }
attributes #1 = { nobuiltin allocsize(0) allockind("alloc,uninitialized") "alloc-family"="_Znam" }
``````````
</details>
https://github.com/llvm/llvm-project/pull/138310
More information about the llvm-commits
mailing list