156e681afSPaul Robinson; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2acdc419cSBjorn Pettersson; RUN: opt < %s -mtriple x86_64--linux -passes=instcombine -S | FileCheck %s 356e681afSPaul Robinson; REQUIRES: x86-registered-target 456e681afSPaul Robinson; PR1201 556e681afSPaul Robinson 656e681afSPaul Robinson; 'if (p) delete p;' cannot result in a call to 'operator delete(0)'. 7*4ab40ecaSBjorn Petterssondefine void @test6a(ptr %foo) minsize { 856e681afSPaul Robinson; CHECK-LABEL: @test6a( 956e681afSPaul Robinson; CHECK-NEXT: entry: 10*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq ptr [[FOO:%.*]], null 1156e681afSPaul Robinson; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 1256e681afSPaul Robinson; CHECK: if.then: 13*4ab40ecaSBjorn Pettersson; CHECK-NEXT: tail call void @_ZdlPv(ptr [[FOO]]) #[[ATTR5:[0-9]+]] 1456e681afSPaul Robinson; CHECK-NEXT: br label [[IF_END]] 1556e681afSPaul Robinson; CHECK: if.end: 1656e681afSPaul Robinson; CHECK-NEXT: ret void 1756e681afSPaul Robinson; 1856e681afSPaul Robinsonentry: 19*4ab40ecaSBjorn Pettersson %tobool = icmp eq ptr %foo, null 2056e681afSPaul Robinson br i1 %tobool, label %if.end, label %if.then 2156e681afSPaul Robinson 2256e681afSPaul Robinsonif.then: ; preds = %entry 23*4ab40ecaSBjorn Pettersson tail call void @_ZdlPv(ptr %foo) builtin 2456e681afSPaul Robinson br label %if.end 2556e681afSPaul Robinson 2656e681afSPaul Robinsonif.end: ; preds = %entry, %if.then 2756e681afSPaul Robinson ret void 2856e681afSPaul Robinson} 2956e681afSPaul Robinson 30*4ab40ecaSBjorn Petterssondeclare ptr @_ZnwmRKSt9nothrow_t(i64, ptr) nobuiltin 31*4ab40ecaSBjorn Petterssondeclare void @_ZdlPvRKSt9nothrow_t(ptr, ptr) nobuiltin 3256e681afSPaul Robinsondeclare i32 @__gxx_personality_v0(...) 33*4ab40ecaSBjorn Petterssondeclare void @_ZN1AC2Ev(ptr %this) 3456e681afSPaul Robinson 35*4ab40ecaSBjorn Petterssondefine void @test7() personality ptr @__gxx_personality_v0 { 3656e681afSPaul Robinson; CHECK-LABEL: @test7( 3756e681afSPaul Robinson; CHECK-NEXT: entry: 38*4ab40ecaSBjorn Pettersson; CHECK-NEXT: invoke void @_ZN1AC2Ev(ptr undef) 3956e681afSPaul Robinson; CHECK-NEXT: to label [[DOTNOEXC_I:%.*]] unwind label [[LPAD_I:%.*]] 4056e681afSPaul Robinson; CHECK: .noexc.i: 4156e681afSPaul Robinson; CHECK-NEXT: unreachable 4256e681afSPaul Robinson; CHECK: lpad.i: 43*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[TMP0:%.*]] = landingpad { ptr, i32 } 4456e681afSPaul Robinson; CHECK-NEXT: cleanup 45*4ab40ecaSBjorn Pettersson; CHECK-NEXT: resume { ptr, i32 } [[TMP0]] 4656e681afSPaul Robinson; 4756e681afSPaul Robinsonentry: 4856e681afSPaul Robinson %nt = alloca i8 49*4ab40ecaSBjorn Pettersson %call.i = tail call ptr @_ZnwmRKSt9nothrow_t(i64 1, ptr %nt) builtin nounwind 50*4ab40ecaSBjorn Pettersson invoke void @_ZN1AC2Ev(ptr undef) 5156e681afSPaul Robinson to label %.noexc.i unwind label %lpad.i 5256e681afSPaul Robinson 5356e681afSPaul Robinson.noexc.i: ; preds = %entry 5456e681afSPaul Robinson unreachable 5556e681afSPaul Robinson 5656e681afSPaul Robinsonlpad.i: ; preds = %entry 57*4ab40ecaSBjorn Pettersson %0 = landingpad { ptr, i32 } cleanup 58*4ab40ecaSBjorn Pettersson call void @_ZdlPvRKSt9nothrow_t(ptr %call.i, ptr %nt) builtin nounwind 59*4ab40ecaSBjorn Pettersson resume { ptr, i32 } %0 6056e681afSPaul Robinson} 6156e681afSPaul Robinson 62*4ab40ecaSBjorn Petterssondeclare ptr @_Znwm(i64) nobuiltin 63*4ab40ecaSBjorn Petterssondefine ptr @_Znwj(i32 %n) nobuiltin { 6456e681afSPaul Robinson; CHECK-LABEL: @_Znwj( 6556e681afSPaul Robinson; CHECK-NEXT: [[Z:%.*]] = zext i32 [[N:%.*]] to i64 66*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[M:%.*]] = call ptr @_Znwm(i64 [[Z]]) 67*4ab40ecaSBjorn Pettersson; CHECK-NEXT: ret ptr [[M]] 6856e681afSPaul Robinson; 6956e681afSPaul Robinson %z = zext i32 %n to i64 70*4ab40ecaSBjorn Pettersson %m = call ptr @_Znwm(i64 %z) 71*4ab40ecaSBjorn Pettersson ret ptr %m 7256e681afSPaul Robinson} 73*4ab40ecaSBjorn Petterssondeclare ptr @_Znam(i64) nobuiltin 74*4ab40ecaSBjorn Petterssondeclare ptr @_Znaj(i32) nobuiltin 75*4ab40ecaSBjorn Petterssondeclare void @_ZdlPv(ptr) nobuiltin 76*4ab40ecaSBjorn Petterssondeclare void @_ZdaPv(ptr) nobuiltin 7756e681afSPaul Robinson 78*4ab40ecaSBjorn Petterssondefine linkonce void @_ZdlPvm(ptr %p, i64) nobuiltin { 7956e681afSPaul Robinson; CHECK-LABEL: @_ZdlPvm( 80*4ab40ecaSBjorn Pettersson; CHECK-NEXT: call void @_ZdlPv(ptr [[P:%.*]]) 8156e681afSPaul Robinson; CHECK-NEXT: ret void 8256e681afSPaul Robinson; 83*4ab40ecaSBjorn Pettersson call void @_ZdlPv(ptr %p) 8456e681afSPaul Robinson ret void 8556e681afSPaul Robinson} 86*4ab40ecaSBjorn Petterssondefine linkonce void @_ZdlPvj(ptr %p, i32) nobuiltin { 8756e681afSPaul Robinson; CHECK-LABEL: @_ZdlPvj( 88*4ab40ecaSBjorn Pettersson; CHECK-NEXT: call void @_ZdlPv(ptr [[P:%.*]]) 8956e681afSPaul Robinson; CHECK-NEXT: ret void 9056e681afSPaul Robinson; 91*4ab40ecaSBjorn Pettersson call void @_ZdlPv(ptr %p) 9256e681afSPaul Robinson ret void 9356e681afSPaul Robinson} 94*4ab40ecaSBjorn Petterssondefine linkonce void @_ZdaPvm(ptr %p, i64) nobuiltin { 9556e681afSPaul Robinson; CHECK-LABEL: @_ZdaPvm( 96*4ab40ecaSBjorn Pettersson; CHECK-NEXT: call void @_ZdaPv(ptr [[P:%.*]]) 9756e681afSPaul Robinson; CHECK-NEXT: ret void 9856e681afSPaul Robinson; 99*4ab40ecaSBjorn Pettersson call void @_ZdaPv(ptr %p) 10056e681afSPaul Robinson ret void 10156e681afSPaul Robinson} 102*4ab40ecaSBjorn Petterssondefine linkonce void @_ZdaPvj(ptr %p, i32) nobuiltin { 10356e681afSPaul Robinson; CHECK-LABEL: @_ZdaPvj( 104*4ab40ecaSBjorn Pettersson; CHECK-NEXT: call void @_ZdaPv(ptr [[P:%.*]]) 10556e681afSPaul Robinson; CHECK-NEXT: ret void 10656e681afSPaul Robinson; 107*4ab40ecaSBjorn Pettersson call void @_ZdaPv(ptr %p) 10856e681afSPaul Robinson ret void 10956e681afSPaul Robinson} 11056e681afSPaul Robinson 11156e681afSPaul Robinson 11256e681afSPaul Robinson; new(size_t, align_val_t) 113*4ab40ecaSBjorn Petterssondeclare ptr @_ZnwmSt11align_val_t(i64, i64) nobuiltin 11456e681afSPaul Robinson; new[](size_t, align_val_t) 115*4ab40ecaSBjorn Petterssondeclare ptr @_ZnamSt11align_val_t(i64, i64) nobuiltin 11656e681afSPaul Robinson; new(size_t, align_val_t, nothrow) 117*4ab40ecaSBjorn Petterssondeclare ptr @_ZnwmSt11align_val_tRKSt9nothrow_t(i64, i64, ptr) nobuiltin 11856e681afSPaul Robinson; new[](size_t, align_val_t, nothrow) 119*4ab40ecaSBjorn Petterssondeclare ptr @_ZnamSt11align_val_tRKSt9nothrow_t(i64, i64, ptr) nobuiltin 120*4ab40ecaSBjorn Pettersson; delete(ptr, align_val_t) 121*4ab40ecaSBjorn Petterssondeclare void @_ZdlPvSt11align_val_t(ptr, i64) nobuiltin 122*4ab40ecaSBjorn Pettersson; delete[](ptr, align_val_t) 123*4ab40ecaSBjorn Petterssondeclare void @_ZdaPvSt11align_val_t(ptr, i64) nobuiltin 124*4ab40ecaSBjorn Pettersson; delete(ptr, align_val_t, nothrow) 125*4ab40ecaSBjorn Petterssondeclare void @_ZdlPvSt11align_val_tRKSt9nothrow_t(ptr, i64, ptr) nobuiltin 126*4ab40ecaSBjorn Pettersson; delete[](ptr, align_val_t, nothrow) 127*4ab40ecaSBjorn Petterssondeclare void @_ZdaPvSt11align_val_tRKSt9nothrow_t(ptr, i64, ptr) nobuiltin 128*4ab40ecaSBjorn Pettersson; delete(ptr, unsigned long, align_val_t) 129*4ab40ecaSBjorn Petterssondeclare void @_ZdlPvmSt11align_val_t(ptr, i64, i64) nobuiltin 130*4ab40ecaSBjorn Pettersson; delete[](ptr, unsigned long, align_val_t) 131*4ab40ecaSBjorn Petterssondeclare void @_ZdaPvmSt11align_val_t(ptr, i64, i64) nobuiltin 13256e681afSPaul Robinson 13356e681afSPaul Robinsondeclare void @llvm.assume(i1) 13456e681afSPaul Robinson 13556e681afSPaul Robinsondefine void @test8() { 13656e681afSPaul Robinson; CHECK-LABEL: @test8( 13756e681afSPaul Robinson; CHECK-NEXT: ret void 13856e681afSPaul Robinson; 13956e681afSPaul Robinson %nt = alloca i8 140*4ab40ecaSBjorn Pettersson %nw = call ptr @_Znwm(i64 32) builtin 141*4ab40ecaSBjorn Pettersson call void @_ZdlPv(ptr %nw) builtin 142*4ab40ecaSBjorn Pettersson %na = call ptr @_Znam(i64 32) builtin 143*4ab40ecaSBjorn Pettersson call void @_ZdaPv(ptr %na) builtin 144*4ab40ecaSBjorn Pettersson %nwm = call ptr @_Znwm(i64 32) builtin 145*4ab40ecaSBjorn Pettersson call void @_ZdlPvm(ptr %nwm, i64 32) builtin 146*4ab40ecaSBjorn Pettersson %nam = call ptr @_Znam(i64 32) builtin 147*4ab40ecaSBjorn Pettersson call void @_ZdaPvm(ptr %nam, i64 32) builtin 148*4ab40ecaSBjorn Pettersson %nwa = call ptr @_ZnwmSt11align_val_t(i64 32, i64 8) builtin 149*4ab40ecaSBjorn Pettersson call void @_ZdlPvSt11align_val_t(ptr %nwa, i64 8) builtin 150*4ab40ecaSBjorn Pettersson %naa = call ptr @_ZnamSt11align_val_t(i64 32, i64 8) builtin 151*4ab40ecaSBjorn Pettersson call void @_ZdaPvSt11align_val_t(ptr %naa, i64 8) builtin 152*4ab40ecaSBjorn Pettersson %nwat = call ptr @_ZnwmSt11align_val_tRKSt9nothrow_t(i64 32, i64 8, ptr %nt) builtin 153*4ab40ecaSBjorn Pettersson call void @_ZdlPvSt11align_val_tRKSt9nothrow_t(ptr %nwat, i64 8, ptr %nt) builtin 154*4ab40ecaSBjorn Pettersson %naat = call ptr @_ZnamSt11align_val_tRKSt9nothrow_t(i64 32, i64 8, ptr %nt) builtin 155*4ab40ecaSBjorn Pettersson call void @_ZdaPvSt11align_val_tRKSt9nothrow_t(ptr %naat, i64 8, ptr %nt) builtin 156*4ab40ecaSBjorn Pettersson %nwa2 = call ptr @_ZnwmSt11align_val_t(i64 32, i64 8) builtin 157*4ab40ecaSBjorn Pettersson call void @_ZdlPvmSt11align_val_t(ptr %nwa2, i64 32, i64 8) builtin 158*4ab40ecaSBjorn Pettersson %naa2 = call ptr @_ZnamSt11align_val_t(i64 32, i64 8) builtin 159*4ab40ecaSBjorn Pettersson call void @_ZdaPvmSt11align_val_t(ptr %naa2, i64 32, i64 8) builtin 16056e681afSPaul Robinson 16156e681afSPaul Robinson ; Check that the alignment assume does not prevent the removal. 162*4ab40ecaSBjorn Pettersson %nwa3 = call ptr @_ZnwmSt11align_val_t(i64 32, i64 16) builtin 163*4ab40ecaSBjorn Pettersson call void @llvm.assume(i1 true) [ "align"(ptr %nwa3, i64 16) ] 164*4ab40ecaSBjorn Pettersson call void @_ZdlPvmSt11align_val_t(ptr %nwa3, i64 32, i64 16) builtin 16556e681afSPaul Robinson 16656e681afSPaul Robinson ret void 16756e681afSPaul Robinson} 16856e681afSPaul Robinson 16956e681afSPaul Robinsondefine void @test10() { 17056e681afSPaul Robinson; CHECK-LABEL: @test10( 171*4ab40ecaSBjorn Pettersson; CHECK-NEXT: call void @_ZdlPv(ptr null) 17256e681afSPaul Robinson; CHECK-NEXT: ret void 17356e681afSPaul Robinson; 174*4ab40ecaSBjorn Pettersson call void @_ZdlPv(ptr null) 17556e681afSPaul Robinson ret void 17656e681afSPaul Robinson} 17756e681afSPaul Robinson 17856e681afSPaul Robinsondefine void @test11() { 17956e681afSPaul Robinson; CHECK-LABEL: @test11( 180*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[CALL:%.*]] = call dereferenceable_or_null(8) ptr @_Znwm(i64 8) #[[ATTR5]] 181*4ab40ecaSBjorn Pettersson; CHECK-NEXT: call void @_ZdlPv(ptr [[CALL]]) 18256e681afSPaul Robinson; CHECK-NEXT: ret void 18356e681afSPaul Robinson; 184*4ab40ecaSBjorn Pettersson %call = call ptr @_Znwm(i64 8) builtin 185*4ab40ecaSBjorn Pettersson call void @_ZdlPv(ptr %call) 18656e681afSPaul Robinson ret void 18756e681afSPaul Robinson} 18856e681afSPaul Robinson 189*4ab40ecaSBjorn Petterssondeclare ptr @llvm.launder.invariant.group(ptr) 190*4ab40ecaSBjorn Petterssondeclare ptr @llvm.strip.invariant.group(ptr) 19156e681afSPaul Robinson 19256e681afSPaul Robinsondefine void @test17() { 19356e681afSPaul Robinson; CHECK-LABEL: @test17( 19456e681afSPaul Robinson; CHECK-NEXT: ret void 19556e681afSPaul Robinson; 196*4ab40ecaSBjorn Pettersson %nw1 = call ptr @_Znwm(i64 32) builtin 197*4ab40ecaSBjorn Pettersson %nw2 = call ptr @llvm.launder.invariant.group(ptr %nw1) 198*4ab40ecaSBjorn Pettersson %nw3 = call ptr @llvm.strip.invariant.group(ptr %nw2) 199*4ab40ecaSBjorn Pettersson store i8 1, ptr %nw3 200*4ab40ecaSBjorn Pettersson call void @_ZdlPv(ptr %nw2) builtin 20156e681afSPaul Robinson ret void 20256e681afSPaul Robinson} 203