Skip to content

Commit e96ddad

Browse files
committed
[MemoryBuiltins] Avoid comparing against Type::getInt8PtrTy(0)
This does not make sense with opaque pointers, and also caused issues for CHERI/Morello where hardcoding address-space zero prevented optimization. Downstream change: https://git.morello-project.org/morello/llvm-project/-/merge_requests/180 Co-authored-by: Silviu Baranga <[email protected]> Reviewed By: lebedev.ri Differential Revision: https://reviews.llvm.org/D139708
1 parent 1481fcf commit e96ddad

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

llvm/lib/Analysis/MemoryBuiltins.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ getAllocationDataForFunction(const Function *Callee, AllocType AllocTy,
192192
int SndParam = FnData->SndParam;
193193
FunctionType *FTy = Callee->getFunctionType();
194194

195-
if (FTy->getReturnType() == Type::getInt8PtrTy(FTy->getContext()) &&
195+
if (FTy->getReturnType()->isPointerTy() &&
196196
FTy->getNumParams() == FnData->NumParams &&
197197
(FstParam < 0 ||
198198
(FTy->getParamType(FstParam)->isIntegerTy(32) ||
@@ -537,7 +537,7 @@ bool llvm::isLibFreeFunction(const Function *F, const LibFunc TLIFn) {
537537
return false;
538538
if (FTy->getNumParams() != FnData->NumParams)
539539
return false;
540-
if (FTy->getParamType(0) != Type::getInt8PtrTy(F->getContext()))
540+
if (!FTy->getParamType(0)->isPointerTy())
541541
return false;
542542

543543
return true;
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
2+
; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3+
4+
target datalayout = "e-m:e-p200:128:128:128:64-A200-P200-G200"
5+
6+
define i64 @remove_malloc() addrspace(200) {
7+
; CHECK-LABEL: define {{[^@]+}}@remove_malloc() addrspace(200) {
8+
; CHECK-NEXT: entry:
9+
; CHECK-NEXT: ret i64 0
10+
;
11+
entry:
12+
%call = call align 16 ptr addrspace(200) @malloc(i64 4)
13+
call void @free(ptr addrspace(200) %call)
14+
ret i64 0
15+
}
16+
17+
define i64 @remove_calloc() addrspace(200) {
18+
; CHECK-LABEL: define {{[^@]+}}@remove_calloc() addrspace(200) {
19+
; CHECK-NEXT: entry:
20+
; CHECK-NEXT: ret i64 0
21+
;
22+
entry:
23+
%call = call ptr addrspace(200) @calloc(i64 1, i64 4)
24+
call void @free(ptr addrspace(200) %call)
25+
ret i64 0
26+
}
27+
define i64 @remove_aligned_alloc() addrspace(200) {
28+
; CHECK-LABEL: define {{[^@]+}}@remove_aligned_alloc() addrspace(200) {
29+
; CHECK-NEXT: entry:
30+
; CHECK-NEXT: ret i64 0
31+
;
32+
entry:
33+
%call = call align 4 ptr addrspace(200) @aligned_alloc(i64 4, i64 4)
34+
call void @free(ptr addrspace(200) %call)
35+
ret i64 0
36+
}
37+
38+
define i64 @remove_strdup(ptr addrspace(200) %arg) addrspace(200) {
39+
; CHECK-LABEL: define {{[^@]+}}@remove_strdup
40+
; CHECK-SAME: (ptr addrspace(200) [[ARG:%.*]]) addrspace(200) {
41+
; CHECK-NEXT: entry:
42+
; CHECK-NEXT: ret i64 0
43+
;
44+
entry:
45+
%call = call align 4 ptr addrspace(200) @strdup(ptr addrspace(200) %arg)
46+
call void @free(ptr addrspace(200) %call)
47+
ret i64 0
48+
}
49+
50+
define i64 @remove_new(ptr addrspace(200) %arg) addrspace(200) {
51+
; CHECK-LABEL: define {{[^@]+}}@remove_new
52+
; CHECK-SAME: (ptr addrspace(200) [[ARG:%.*]]) addrspace(200) {
53+
; CHECK-NEXT: entry:
54+
; CHECK-NEXT: ret i64 0
55+
;
56+
entry:
57+
%call = call align 4 ptr addrspace(200) @_Znwm(i64 4)
58+
call void @_ZdlPv(ptr addrspace(200) %call)
59+
ret i64 0
60+
}
61+
62+
define i64 @remove_new_array(ptr addrspace(200) %arg) addrspace(200) {
63+
; CHECK-LABEL: define {{[^@]+}}@remove_new_array
64+
; CHECK-SAME: (ptr addrspace(200) [[ARG:%.*]]) addrspace(200) {
65+
; CHECK-NEXT: entry:
66+
; CHECK-NEXT: ret i64 0
67+
;
68+
entry:
69+
%call = call align 4 ptr addrspace(200) @_Znam(i64 4)
70+
call void @_ZdaPv(ptr addrspace(200) %call)
71+
ret i64 0
72+
}
73+
74+
declare noalias ptr addrspace(200) @calloc(i64, i64) addrspace(200) nounwind allockind("alloc,zeroed") allocsize(0,1) "alloc-family"="malloc"
75+
declare noalias ptr addrspace(200) @malloc(i64) addrspace(200) allockind("alloc,uninitialized") allocsize(0) "alloc-family"="malloc"
76+
declare noalias ptr addrspace(200) @aligned_alloc(i64, i64) addrspace(200) allockind("alloc,uninitialized,aligned") allocsize(1) "alloc-family"="malloc"
77+
declare noalias ptr addrspace(200) @strdup(ptr addrspace(200) %arg) addrspace(200)
78+
declare void @free(ptr addrspace(200)) addrspace(200) allockind("free") "alloc-family"="malloc"
79+
; new/delete
80+
declare noalias ptr addrspace(200) @_Znwm(i64) addrspace(200)
81+
declare void @_ZdlPv(ptr addrspace(200)) addrspace(200)
82+
; new[]/delete[]
83+
declare noalias ptr addrspace(200) @_Znam(i64) addrspace(200)
84+
declare void @_ZdaPv(ptr addrspace(200)) addrspace(200)

0 commit comments

Comments
 (0)