1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -mtriple x86_64--linux -passes=instcombine -S | FileCheck %s 3; REQUIRES: x86-registered-target 4; PR1201 5 6; 'if (p) delete p;' cannot result in a call to 'operator delete(0)'. 7define void @test6a(ptr %foo) minsize { 8; CHECK-LABEL: @test6a( 9; CHECK-NEXT: entry: 10; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq ptr [[FOO:%.*]], null 11; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 12; CHECK: if.then: 13; CHECK-NEXT: tail call void @_ZdlPv(ptr [[FOO]]) #[[ATTR5:[0-9]+]] 14; CHECK-NEXT: br label [[IF_END]] 15; CHECK: if.end: 16; CHECK-NEXT: ret void 17; 18entry: 19 %tobool = icmp eq ptr %foo, null 20 br i1 %tobool, label %if.end, label %if.then 21 22if.then: ; preds = %entry 23 tail call void @_ZdlPv(ptr %foo) builtin 24 br label %if.end 25 26if.end: ; preds = %entry, %if.then 27 ret void 28} 29 30declare ptr @_ZnwmRKSt9nothrow_t(i64, ptr) nobuiltin 31declare void @_ZdlPvRKSt9nothrow_t(ptr, ptr) nobuiltin 32declare i32 @__gxx_personality_v0(...) 33declare void @_ZN1AC2Ev(ptr %this) 34 35define void @test7() personality ptr @__gxx_personality_v0 { 36; CHECK-LABEL: @test7( 37; CHECK-NEXT: entry: 38; CHECK-NEXT: invoke void @_ZN1AC2Ev(ptr undef) 39; CHECK-NEXT: to label [[DOTNOEXC_I:%.*]] unwind label [[LPAD_I:%.*]] 40; CHECK: .noexc.i: 41; CHECK-NEXT: unreachable 42; CHECK: lpad.i: 43; CHECK-NEXT: [[TMP0:%.*]] = landingpad { ptr, i32 } 44; CHECK-NEXT: cleanup 45; CHECK-NEXT: resume { ptr, i32 } [[TMP0]] 46; 47entry: 48 %nt = alloca i8 49 %call.i = tail call ptr @_ZnwmRKSt9nothrow_t(i64 1, ptr %nt) builtin nounwind 50 invoke void @_ZN1AC2Ev(ptr undef) 51 to label %.noexc.i unwind label %lpad.i 52 53.noexc.i: ; preds = %entry 54 unreachable 55 56lpad.i: ; preds = %entry 57 %0 = landingpad { ptr, i32 } cleanup 58 call void @_ZdlPvRKSt9nothrow_t(ptr %call.i, ptr %nt) builtin nounwind 59 resume { ptr, i32 } %0 60} 61 62declare ptr @_Znwm(i64) nobuiltin 63define ptr @_Znwj(i32 %n) nobuiltin { 64; CHECK-LABEL: @_Znwj( 65; CHECK-NEXT: [[Z:%.*]] = zext i32 [[N:%.*]] to i64 66; CHECK-NEXT: [[M:%.*]] = call ptr @_Znwm(i64 [[Z]]) 67; CHECK-NEXT: ret ptr [[M]] 68; 69 %z = zext i32 %n to i64 70 %m = call ptr @_Znwm(i64 %z) 71 ret ptr %m 72} 73declare ptr @_Znam(i64) nobuiltin 74declare ptr @_Znaj(i32) nobuiltin 75declare void @_ZdlPv(ptr) nobuiltin 76declare void @_ZdaPv(ptr) nobuiltin 77 78define linkonce void @_ZdlPvm(ptr %p, i64) nobuiltin { 79; CHECK-LABEL: @_ZdlPvm( 80; CHECK-NEXT: call void @_ZdlPv(ptr [[P:%.*]]) 81; CHECK-NEXT: ret void 82; 83 call void @_ZdlPv(ptr %p) 84 ret void 85} 86define linkonce void @_ZdlPvj(ptr %p, i32) nobuiltin { 87; CHECK-LABEL: @_ZdlPvj( 88; CHECK-NEXT: call void @_ZdlPv(ptr [[P:%.*]]) 89; CHECK-NEXT: ret void 90; 91 call void @_ZdlPv(ptr %p) 92 ret void 93} 94define linkonce void @_ZdaPvm(ptr %p, i64) nobuiltin { 95; CHECK-LABEL: @_ZdaPvm( 96; CHECK-NEXT: call void @_ZdaPv(ptr [[P:%.*]]) 97; CHECK-NEXT: ret void 98; 99 call void @_ZdaPv(ptr %p) 100 ret void 101} 102define linkonce void @_ZdaPvj(ptr %p, i32) nobuiltin { 103; CHECK-LABEL: @_ZdaPvj( 104; CHECK-NEXT: call void @_ZdaPv(ptr [[P:%.*]]) 105; CHECK-NEXT: ret void 106; 107 call void @_ZdaPv(ptr %p) 108 ret void 109} 110 111 112; new(size_t, align_val_t) 113declare ptr @_ZnwmSt11align_val_t(i64, i64) nobuiltin 114; new[](size_t, align_val_t) 115declare ptr @_ZnamSt11align_val_t(i64, i64) nobuiltin 116; new(size_t, align_val_t, nothrow) 117declare ptr @_ZnwmSt11align_val_tRKSt9nothrow_t(i64, i64, ptr) nobuiltin 118; new[](size_t, align_val_t, nothrow) 119declare ptr @_ZnamSt11align_val_tRKSt9nothrow_t(i64, i64, ptr) nobuiltin 120; delete(ptr, align_val_t) 121declare void @_ZdlPvSt11align_val_t(ptr, i64) nobuiltin 122; delete[](ptr, align_val_t) 123declare void @_ZdaPvSt11align_val_t(ptr, i64) nobuiltin 124; delete(ptr, align_val_t, nothrow) 125declare void @_ZdlPvSt11align_val_tRKSt9nothrow_t(ptr, i64, ptr) nobuiltin 126; delete[](ptr, align_val_t, nothrow) 127declare void @_ZdaPvSt11align_val_tRKSt9nothrow_t(ptr, i64, ptr) nobuiltin 128; delete(ptr, unsigned long, align_val_t) 129declare void @_ZdlPvmSt11align_val_t(ptr, i64, i64) nobuiltin 130; delete[](ptr, unsigned long, align_val_t) 131declare void @_ZdaPvmSt11align_val_t(ptr, i64, i64) nobuiltin 132 133declare void @llvm.assume(i1) 134 135define void @test8() { 136; CHECK-LABEL: @test8( 137; CHECK-NEXT: ret void 138; 139 %nt = alloca i8 140 %nw = call ptr @_Znwm(i64 32) builtin 141 call void @_ZdlPv(ptr %nw) builtin 142 %na = call ptr @_Znam(i64 32) builtin 143 call void @_ZdaPv(ptr %na) builtin 144 %nwm = call ptr @_Znwm(i64 32) builtin 145 call void @_ZdlPvm(ptr %nwm, i64 32) builtin 146 %nam = call ptr @_Znam(i64 32) builtin 147 call void @_ZdaPvm(ptr %nam, i64 32) builtin 148 %nwa = call ptr @_ZnwmSt11align_val_t(i64 32, i64 8) builtin 149 call void @_ZdlPvSt11align_val_t(ptr %nwa, i64 8) builtin 150 %naa = call ptr @_ZnamSt11align_val_t(i64 32, i64 8) builtin 151 call void @_ZdaPvSt11align_val_t(ptr %naa, i64 8) builtin 152 %nwat = call ptr @_ZnwmSt11align_val_tRKSt9nothrow_t(i64 32, i64 8, ptr %nt) builtin 153 call void @_ZdlPvSt11align_val_tRKSt9nothrow_t(ptr %nwat, i64 8, ptr %nt) builtin 154 %naat = call ptr @_ZnamSt11align_val_tRKSt9nothrow_t(i64 32, i64 8, ptr %nt) builtin 155 call void @_ZdaPvSt11align_val_tRKSt9nothrow_t(ptr %naat, i64 8, ptr %nt) builtin 156 %nwa2 = call ptr @_ZnwmSt11align_val_t(i64 32, i64 8) builtin 157 call void @_ZdlPvmSt11align_val_t(ptr %nwa2, i64 32, i64 8) builtin 158 %naa2 = call ptr @_ZnamSt11align_val_t(i64 32, i64 8) builtin 159 call void @_ZdaPvmSt11align_val_t(ptr %naa2, i64 32, i64 8) builtin 160 161 ; Check that the alignment assume does not prevent the removal. 162 %nwa3 = call ptr @_ZnwmSt11align_val_t(i64 32, i64 16) builtin 163 call void @llvm.assume(i1 true) [ "align"(ptr %nwa3, i64 16) ] 164 call void @_ZdlPvmSt11align_val_t(ptr %nwa3, i64 32, i64 16) builtin 165 166 ret void 167} 168 169define void @test10() { 170; CHECK-LABEL: @test10( 171; CHECK-NEXT: call void @_ZdlPv(ptr null) 172; CHECK-NEXT: ret void 173; 174 call void @_ZdlPv(ptr null) 175 ret void 176} 177 178define void @test11() { 179; CHECK-LABEL: @test11( 180; CHECK-NEXT: [[CALL:%.*]] = call dereferenceable_or_null(8) ptr @_Znwm(i64 8) #[[ATTR5]] 181; CHECK-NEXT: call void @_ZdlPv(ptr [[CALL]]) 182; CHECK-NEXT: ret void 183; 184 %call = call ptr @_Znwm(i64 8) builtin 185 call void @_ZdlPv(ptr %call) 186 ret void 187} 188 189declare ptr @llvm.launder.invariant.group(ptr) 190declare ptr @llvm.strip.invariant.group(ptr) 191 192define void @test17() { 193; CHECK-LABEL: @test17( 194; CHECK-NEXT: ret void 195; 196 %nw1 = call ptr @_Znwm(i64 32) builtin 197 %nw2 = call ptr @llvm.launder.invariant.group(ptr %nw1) 198 %nw3 = call ptr @llvm.strip.invariant.group(ptr %nw2) 199 store i8 1, ptr %nw3 200 call void @_ZdlPv(ptr %nw2) builtin 201 ret void 202} 203