101 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; Set pointer (and size_t) size to 32 bits. This lets the declarations5; below and calls to them be recognized as special.6 7target datalayout = "p:32:32"8 9%size_t = type i3210%align_val_t = type %size_t11%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 void65;66 %nt = alloca %nothrow_t67 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 void100}101