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