https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117370
Bug ID: 117370 Summary: std::nothrow variants of operator new are not optimized away when block is unused Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: hubicka at gcc dot gnu.org Target Milestone: --- #include <new> void test1() { int *a = new int; delete(a); } void test() { int *a = new (std::nothrow) int; delete(a); } void test2() { int *a = new (std::nothrow) int; if (!a) __builtin_abort (); delete(a); } compiles to: ;; Function test1 (_Z5test1v, funcdef_no=17, decl_uid=3143, cgraph_uid=17, symbol_order=18) void test1 () { <bb 2> [local count: 1073741824]: return; } ;; Function test (_Z4testv, funcdef_no=18, decl_uid=3147, cgraph_uid=18, symbol_order=19) Removing basic block 5 void test () { int * a; <bb 2> [local count: 1073741824]: a_4 = operator new (4, ¬hrow); if (a_4 != 0B) goto <bb 3>; [99.96%] else goto <bb 4>; [0.04%] <bb 3> [local count: 1073312328]: *a_4 ={v} {CLOBBER(eob)}; operator delete (a_4, 4); [tail call] <bb 4> [local count: 1073741824]: return; } ;; Function test2 (_Z5test2v, funcdef_no=19, decl_uid=3151, cgraph_uid=19, symbol_order=20) void test2 () { int * a; <bb 2> [local count: 1073741824]: a_3 = operator new (4, ¬hrow); if (a_3 == 0B) goto <bb 3>; [0.00%] else goto <bb 4>; [100.00%] <bb 3> [count: 0]: __builtin_abort (); <bb 4> [local count: 1073741824]: *a_3 ={v} {CLOBBER(eob)}; operator delete (a_3, 4); [tail call] return; } so only first variant is optimized out. Clang optimizes away all three new/delete pairs