1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4; Set pointer (and size_t) size to 32 bits. This lets the declarations 5; below and calls to them be recognized as special. 6 7target datalayout = "p:32:32" 8 9%size_t = type i32 10%align_val_t = type %size_t 11%nothrow_t = type { } 12 13 14; operator new(size_t = unsigned int) 15declare ptr @_Znwj(%size_t) 16 17; operator new[](size_t = unsigned int) 18declare ptr @_Znaj(%size_t) 19 20; operator new(size_t = unsigned int, std::align_val_t) 21declare ptr @_ZnwjSt11align_val_t(%size_t, %size_t) 22 23; operator new[](size_t = unsigned int, std::align_val_t) 24declare ptr @_ZnajSt11align_val_t(%size_t, %size_t) 25 26; operator new(size_t = unsigned int, std::align_val_t, const std::nothrow_t&) 27declare ptr @_ZnwjSt11align_val_tRKSt9nothrow_t(%size_t, %size_t, ptr) 28 29; operator new[](size_t = unsigned int, std::align_val_t, const std::nothrow_t&) 30declare ptr @_ZnajSt11align_val_tRKSt9nothrow_t(%size_t, %size_t, ptr) 31 32 33; operator delete(ptr, size_t = unsigned int) 34declare void @_ZdlPvj(ptr, %size_t) 35 36; operator delete[](ptr, size_t = unsigned int) 37declare void @_ZdaPvj(ptr, %size_t) 38 39; operator delete(ptr, std::align_val_t) 40declare void @_ZdlPvSt11align_val_t(ptr, %align_val_t) 41 42; operator delete[](ptr, std::align_val_t) 43declare void @_ZdaPvSt11align_val_t(ptr, %align_val_t) 44 45; operator delete(ptr, size_t = unsigned int, std::align_val_t) 46declare void @_ZdlPvjSt11align_val_t(ptr, %size_t, %align_val_t) 47 48; operator delete[](ptr, size_t = unsigned int, std::align_val_t) 49declare void @_ZdaPvjSt11align_val_t(ptr, %size_t, %align_val_t) 50 51; operator delete(ptr, std::align_val_t, const std::nothrow_t&) 52declare void @_ZdlPvSt11align_val_tRKSt9nothrow_t(ptr, %align_val_t, ptr) 53 54; operator delete[](ptr, std::align_val_t, const std::nothrow_t&) 55declare void @_ZdaPvSt11align_val_tRKSt9nothrow_t(ptr, %align_val_t, ptr) 56 57declare void @llvm.assume(i1) 58 59 60; Verify that pairs of matching calls to new/delete are eliminated. 61 62define void @elim_new_delete_pairs() { 63; CHECK-LABEL: @elim_new_delete_pairs( 64; CHECK-NEXT: ret void 65; 66 %nt = alloca %nothrow_t 67 68 %nwj = call ptr @_Znwj(%size_t 32) 69 call void @_ZdlPvj(ptr %nwj, %size_t 32) 70 71 %naj = call ptr @_Znaj(%size_t 32) 72 call void @_ZdaPvj(ptr %naj, %size_t 32) 73 74 %nwja = call ptr @_ZnwjSt11align_val_t(%size_t 32, %size_t 8) 75 call void @_ZdlPvSt11align_val_t(ptr %nwja, %size_t 8) 76 77 %naja = call ptr @_ZnajSt11align_val_t(%size_t 32, %size_t 8) 78 call void @_ZdaPvSt11align_val_t(ptr %naja, i32 8) 79 80 %nwjat = call ptr @_ZnwjSt11align_val_tRKSt9nothrow_t(%size_t 32, %size_t 8, ptr %nt) 81 call void @_ZdlPvSt11align_val_tRKSt9nothrow_t(ptr %nwjat, %size_t 8, ptr %nt) 82 83 %najat = call ptr @_ZnajSt11align_val_tRKSt9nothrow_t(%size_t 32, %size_t 8, ptr %nt) 84 call void @_ZdaPvSt11align_val_tRKSt9nothrow_t(ptr %najat, i32 8, ptr %nt) 85 86 %nwja2 = call ptr @_ZnwjSt11align_val_t(%size_t 32, %size_t 8) 87 call void @_ZdlPvjSt11align_val_t(ptr %nwja2, %size_t 32, %size_t 8) 88 89 %naja2 = call ptr @_ZnajSt11align_val_t(%size_t 32, %size_t 8) 90 call void @_ZdaPvjSt11align_val_t(ptr %naja2, %size_t 32, %size_t 8) 91 92 ; Check that the alignment assume does not prevent the removal. 93 %nwa3 = call ptr @_ZnajSt11align_val_t(%size_t 32, %size_t 16) 94 95 call void @llvm.assume(i1 true) [ "align"(ptr %nwa3, i32 16) ] 96 97 call void @_ZdaPvjSt11align_val_t(ptr %nwa3, %size_t 32, %size_t 16) 98 99 ret void 100} 101