xref: /llvm-project/llvm/test/Transforms/InstCombine/new-delete-itanium-32.ll (revision 4ab40eca080965c65802710e39adbb78c4ce7bde)
10dcfe7aaSMartin Sebor; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
20dcfe7aaSMartin Sebor; RUN: opt < %s -passes=instcombine -S | FileCheck %s
30dcfe7aaSMartin Sebor
40dcfe7aaSMartin Sebor; Set pointer (and size_t) size to 32 bits.  This lets the declarations
50dcfe7aaSMartin Sebor; below and calls to them be recognized as special.
60dcfe7aaSMartin Sebor
70dcfe7aaSMartin Sebortarget datalayout = "p:32:32"
80dcfe7aaSMartin Sebor
90dcfe7aaSMartin Sebor%size_t = type i32
100dcfe7aaSMartin Sebor%align_val_t = type %size_t
110dcfe7aaSMartin Sebor%nothrow_t = type { }
120dcfe7aaSMartin Sebor
130dcfe7aaSMartin Sebor
140dcfe7aaSMartin Sebor; operator new(size_t = unsigned int)
15*4ab40ecaSBjorn Petterssondeclare ptr @_Znwj(%size_t)
160dcfe7aaSMartin Sebor
170dcfe7aaSMartin Sebor; operator new[](size_t = unsigned int)
18*4ab40ecaSBjorn Petterssondeclare ptr @_Znaj(%size_t)
190dcfe7aaSMartin Sebor
200dcfe7aaSMartin Sebor; operator new(size_t = unsigned int, std::align_val_t)
21*4ab40ecaSBjorn Petterssondeclare ptr @_ZnwjSt11align_val_t(%size_t, %size_t)
220dcfe7aaSMartin Sebor
230dcfe7aaSMartin Sebor; operator new[](size_t = unsigned int, std::align_val_t)
24*4ab40ecaSBjorn Petterssondeclare ptr @_ZnajSt11align_val_t(%size_t, %size_t)
250dcfe7aaSMartin Sebor
260dcfe7aaSMartin Sebor; operator new(size_t = unsigned int, std::align_val_t, const std::nothrow_t&)
27*4ab40ecaSBjorn Petterssondeclare ptr @_ZnwjSt11align_val_tRKSt9nothrow_t(%size_t, %size_t, ptr)
280dcfe7aaSMartin Sebor
290dcfe7aaSMartin Sebor; operator new[](size_t = unsigned int, std::align_val_t, const std::nothrow_t&)
30*4ab40ecaSBjorn Petterssondeclare ptr @_ZnajSt11align_val_tRKSt9nothrow_t(%size_t, %size_t, ptr)
310dcfe7aaSMartin Sebor
320dcfe7aaSMartin Sebor
33*4ab40ecaSBjorn Pettersson; operator delete(ptr, size_t = unsigned int)
34*4ab40ecaSBjorn Petterssondeclare void @_ZdlPvj(ptr, %size_t)
350dcfe7aaSMartin Sebor
36*4ab40ecaSBjorn Pettersson; operator delete[](ptr, size_t = unsigned int)
37*4ab40ecaSBjorn Petterssondeclare void @_ZdaPvj(ptr, %size_t)
380dcfe7aaSMartin Sebor
39*4ab40ecaSBjorn Pettersson; operator delete(ptr, std::align_val_t)
40*4ab40ecaSBjorn Petterssondeclare void @_ZdlPvSt11align_val_t(ptr, %align_val_t)
410dcfe7aaSMartin Sebor
42*4ab40ecaSBjorn Pettersson; operator delete[](ptr, std::align_val_t)
43*4ab40ecaSBjorn Petterssondeclare void @_ZdaPvSt11align_val_t(ptr, %align_val_t)
440dcfe7aaSMartin Sebor
45*4ab40ecaSBjorn Pettersson; operator delete(ptr, size_t = unsigned int, std::align_val_t)
46*4ab40ecaSBjorn Petterssondeclare void @_ZdlPvjSt11align_val_t(ptr, %size_t, %align_val_t)
470dcfe7aaSMartin Sebor
48*4ab40ecaSBjorn Pettersson; operator delete[](ptr, size_t = unsigned int, std::align_val_t)
49*4ab40ecaSBjorn Petterssondeclare void @_ZdaPvjSt11align_val_t(ptr, %size_t, %align_val_t)
500dcfe7aaSMartin Sebor
51*4ab40ecaSBjorn Pettersson; operator delete(ptr, std::align_val_t, const std::nothrow_t&)
52*4ab40ecaSBjorn Petterssondeclare void @_ZdlPvSt11align_val_tRKSt9nothrow_t(ptr, %align_val_t, ptr)
530dcfe7aaSMartin Sebor
54*4ab40ecaSBjorn Pettersson; operator delete[](ptr, std::align_val_t, const std::nothrow_t&)
55*4ab40ecaSBjorn Petterssondeclare void @_ZdaPvSt11align_val_tRKSt9nothrow_t(ptr, %align_val_t, ptr)
560dcfe7aaSMartin Sebor
570dcfe7aaSMartin Sebordeclare void @llvm.assume(i1)
580dcfe7aaSMartin Sebor
590dcfe7aaSMartin Sebor
600dcfe7aaSMartin Sebor; Verify that pairs of matching calls to new/delete are eliminated.
610dcfe7aaSMartin Sebor
620dcfe7aaSMartin Sebordefine void @elim_new_delete_pairs() {
630dcfe7aaSMartin Sebor; CHECK-LABEL: @elim_new_delete_pairs(
640dcfe7aaSMartin Sebor; CHECK-NEXT:    ret void
650dcfe7aaSMartin Sebor;
660dcfe7aaSMartin Sebor  %nt = alloca %nothrow_t
670dcfe7aaSMartin Sebor
68*4ab40ecaSBjorn Pettersson  %nwj = call ptr @_Znwj(%size_t 32)
69*4ab40ecaSBjorn Pettersson  call void @_ZdlPvj(ptr %nwj, %size_t 32)
700dcfe7aaSMartin Sebor
71*4ab40ecaSBjorn Pettersson  %naj = call ptr @_Znaj(%size_t 32)
72*4ab40ecaSBjorn Pettersson  call void @_ZdaPvj(ptr %naj, %size_t 32)
730dcfe7aaSMartin Sebor
74*4ab40ecaSBjorn Pettersson  %nwja = call ptr @_ZnwjSt11align_val_t(%size_t 32, %size_t 8)
75*4ab40ecaSBjorn Pettersson  call void @_ZdlPvSt11align_val_t(ptr %nwja, %size_t 8)
760dcfe7aaSMartin Sebor
77*4ab40ecaSBjorn Pettersson  %naja = call ptr @_ZnajSt11align_val_t(%size_t 32, %size_t 8)
78*4ab40ecaSBjorn Pettersson  call void @_ZdaPvSt11align_val_t(ptr %naja, i32 8)
790dcfe7aaSMartin Sebor
80*4ab40ecaSBjorn Pettersson  %nwjat = call ptr @_ZnwjSt11align_val_tRKSt9nothrow_t(%size_t 32, %size_t 8, ptr %nt)
81*4ab40ecaSBjorn Pettersson  call void @_ZdlPvSt11align_val_tRKSt9nothrow_t(ptr %nwjat, %size_t 8, ptr %nt)
820dcfe7aaSMartin Sebor
83*4ab40ecaSBjorn Pettersson  %najat = call ptr @_ZnajSt11align_val_tRKSt9nothrow_t(%size_t 32, %size_t 8, ptr %nt)
84*4ab40ecaSBjorn Pettersson  call void @_ZdaPvSt11align_val_tRKSt9nothrow_t(ptr %najat, i32 8, ptr %nt)
850dcfe7aaSMartin Sebor
86*4ab40ecaSBjorn Pettersson  %nwja2 = call ptr @_ZnwjSt11align_val_t(%size_t 32, %size_t 8)
87*4ab40ecaSBjorn Pettersson  call void @_ZdlPvjSt11align_val_t(ptr %nwja2, %size_t 32, %size_t 8)
880dcfe7aaSMartin Sebor
89*4ab40ecaSBjorn Pettersson  %naja2 = call ptr @_ZnajSt11align_val_t(%size_t 32, %size_t 8)
90*4ab40ecaSBjorn Pettersson  call void @_ZdaPvjSt11align_val_t(ptr %naja2, %size_t 32, %size_t 8)
910dcfe7aaSMartin Sebor
920dcfe7aaSMartin Sebor  ; Check that the alignment assume does not prevent the removal.
93*4ab40ecaSBjorn Pettersson  %nwa3 = call ptr @_ZnajSt11align_val_t(%size_t 32, %size_t 16)
940dcfe7aaSMartin Sebor
95*4ab40ecaSBjorn Pettersson  call void @llvm.assume(i1 true) [ "align"(ptr %nwa3, i32 16) ]
960dcfe7aaSMartin Sebor
97*4ab40ecaSBjorn Pettersson  call void @_ZdaPvjSt11align_val_t(ptr %nwa3, %size_t 32, %size_t 16)
980dcfe7aaSMartin Sebor
990dcfe7aaSMartin Sebor  ret void
1000dcfe7aaSMartin Sebor}
101