1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instcombine -S | FileCheck %s 3; PR1201 4define i32 @main(i32 %argc, i8** %argv) { 5; CHECK-LABEL: @main( 6; CHECK-NEXT: ret i32 0 7; 8 %c_19 = alloca i8* 9 %malloc_206 = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i32), i32 10)) 10 store i8* %malloc_206, i8** %c_19 11 %tmp_207 = load i8*, i8** %c_19 12 tail call void @free(i8* %tmp_207) 13 ret i32 0 14} 15 16define i32 @dead_aligned_alloc(i32 %size, i32 %alignment, i8 %value) { 17; CHECK-LABEL: @dead_aligned_alloc( 18; CHECK-NEXT: ret i32 0 19; 20 %aligned_allocation = tail call i8* @aligned_alloc(i32 %alignment, i32 %size) 21 store i8 %value, i8* %aligned_allocation 22 tail call void @free(i8* %aligned_allocation) 23 ret i32 0 24} 25 26declare noalias i8* @calloc(i32, i32) nounwind 27declare noalias i8* @malloc(i32) 28declare noalias i8* @aligned_alloc(i32, i32) 29declare void @free(i8*) 30 31define i1 @foo() { 32; CHECK-LABEL: @foo( 33; CHECK-NEXT: ret i1 false 34; 35 %m = call i8* @malloc(i32 1) 36 %z = icmp eq i8* %m, null 37 call void @free(i8* %m) 38 ret i1 %z 39} 40 41declare void @llvm.lifetime.start.p0i8(i64, i8*) 42declare void @llvm.lifetime.end.p0i8(i64, i8*) 43declare i64 @llvm.objectsize.i64(i8*, i1) 44declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i1) nounwind 45declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i1) nounwind 46declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i1) nounwind 47 48define void @test3(i8* %src) { 49; CHECK-LABEL: @test3( 50; CHECK-NEXT: ret void 51; 52 %a = call noalias i8* @malloc(i32 10) 53 call void @llvm.lifetime.start.p0i8(i64 10, i8* %a) 54 call void @llvm.lifetime.end.p0i8(i64 10, i8* %a) 55 %size = call i64 @llvm.objectsize.i64(i8* %a, i1 true) 56 store i8 42, i8* %a 57 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a, i8* %src, i32 32, i1 false) 58 call void @llvm.memmove.p0i8.p0i8.i32(i8* %a, i8* %src, i32 32, i1 false) 59 call void @llvm.memset.p0i8.i32(i8* %a, i8 5, i32 32, i1 false) 60 %alloc2 = call noalias i8* @calloc(i32 5, i32 7) nounwind 61 %z = icmp ne i8* %alloc2, null 62 ret void 63} 64 65;; This used to crash. 66define void @test4() { 67; CHECK-LABEL: @test4( 68; CHECK-NEXT: ret void 69; 70 %A = call i8* @malloc(i32 16000) 71 %B = bitcast i8* %A to double* 72 %C = bitcast double* %B to i8* 73 call void @free(i8* %C) 74 ret void 75} 76 77define void @test5(i8* %ptr, i8** %esc) { 78; CHECK-LABEL: @test5( 79; CHECK-NEXT: [[A:%.*]] = call dereferenceable_or_null(700) i8* @malloc(i32 700) 80; CHECK-NEXT: [[B:%.*]] = call dereferenceable_or_null(700) i8* @malloc(i32 700) 81; CHECK-NEXT: [[C:%.*]] = call dereferenceable_or_null(700) i8* @malloc(i32 700) 82; CHECK-NEXT: [[D:%.*]] = call dereferenceable_or_null(700) i8* @malloc(i32 700) 83; CHECK-NEXT: [[E:%.*]] = call dereferenceable_or_null(700) i8* @malloc(i32 700) 84; CHECK-NEXT: [[F:%.*]] = call dereferenceable_or_null(700) i8* @malloc(i32 700) 85; CHECK-NEXT: [[G:%.*]] = call dereferenceable_or_null(700) i8* @malloc(i32 700) 86; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* nonnull align 1 dereferenceable(32) [[PTR:%.*]], i8* nonnull align 1 dereferenceable(32) [[A]], i32 32, i1 false) 87; CHECK-NEXT: call void @llvm.memmove.p0i8.p0i8.i32(i8* nonnull align 1 dereferenceable(32) [[PTR]], i8* nonnull align 1 dereferenceable(32) [[B]], i32 32, i1 false) 88; CHECK-NEXT: store i8* [[C]], i8** [[ESC:%.*]], align 8 89; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* [[D]], i8* [[PTR]], i32 32, i1 true) 90; CHECK-NEXT: call void @llvm.memmove.p0i8.p0i8.i32(i8* [[E]], i8* [[PTR]], i32 32, i1 true) 91; CHECK-NEXT: call void @llvm.memset.p0i8.i32(i8* [[F]], i8 5, i32 32, i1 true) 92; CHECK-NEXT: store volatile i8 4, i8* [[G]], align 1 93; CHECK-NEXT: ret void 94; 95 %a = call i8* @malloc(i32 700) 96 %b = call i8* @malloc(i32 700) 97 %c = call i8* @malloc(i32 700) 98 %d = call i8* @malloc(i32 700) 99 %e = call i8* @malloc(i32 700) 100 %f = call i8* @malloc(i32 700) 101 %g = call i8* @malloc(i32 700) 102 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr, i8* %a, i32 32, i1 false) 103 call void @llvm.memmove.p0i8.p0i8.i32(i8* %ptr, i8* %b, i32 32, i1 false) 104 store i8* %c, i8** %esc 105 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %d, i8* %ptr, i32 32, i1 true) 106 call void @llvm.memmove.p0i8.p0i8.i32(i8* %e, i8* %ptr, i32 32, i1 true) 107 call void @llvm.memset.p0i8.i32(i8* %f, i8 5, i32 32, i1 true) 108 store volatile i8 4, i8* %g 109 ret void 110} 111 112;; When a basic block contains only a call to free and this block is accessed 113;; through a test of the argument of free against null, move the call in the 114;; predecessor block. 115;; Using simplifycfg will remove the empty basic block and the branch operation 116;; Then, performing a dead elimination will remove the comparison. 117;; This is what happens with -O1 and upper. 118define void @test6(i8* %foo) minsize { 119; CHECK-LABEL: @test6( 120; CHECK-NEXT: entry: 121; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i8* [[FOO:%.*]], null 122; CHECK-NEXT: tail call void @free(i8* [[FOO]]) 123; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 124; CHECK: if.then: 125; CHECK-NEXT: br label [[IF_END]] 126; CHECK: if.end: 127; CHECK-NEXT: ret void 128; 129;; Call to free moved 130;; Block is now empty and may be simplified by simplifycfg 131entry: 132 %tobool = icmp eq i8* %foo, null 133 br i1 %tobool, label %if.end, label %if.then 134 135if.then: ; preds = %entry 136 tail call void @free(i8* %foo) 137 br label %if.end 138 139if.end: ; preds = %entry, %if.then 140 ret void 141} 142 143; Same optimization with even a builtin 'operator delete' would be 144; incorrect in general. 145; 'if (p) delete p;' cannot result in a call to 'operator delete(0)'. 146define void @test6a(i8* %foo) minsize { 147; CHECK-LABEL: @test6a( 148; CHECK-NEXT: entry: 149; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i8* [[FOO:%.*]], null 150; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 151; CHECK: if.then: 152; CHECK-NEXT: tail call void @_ZdlPv(i8* [[FOO]]) 153; CHECK-NEXT: br label [[IF_END]] 154; CHECK: if.end: 155; CHECK-NEXT: ret void 156entry: 157 %tobool = icmp eq i8* %foo, null 158 br i1 %tobool, label %if.end, label %if.then 159 160if.then: ; preds = %entry 161 tail call void @_ZdlPv(i8* %foo) builtin 162 br label %if.end 163 164if.end: ; preds = %entry, %if.then 165 ret void 166} 167 168declare i8* @_ZnwmRKSt9nothrow_t(i64, i8*) nobuiltin 169declare void @_ZdlPvRKSt9nothrow_t(i8*, i8*) nobuiltin 170declare i32 @__gxx_personality_v0(...) 171declare void @_ZN1AC2Ev(i8* %this) 172 173define void @test7() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 174; CHECK-LABEL: @test7( 175; CHECK-NEXT: entry: 176; CHECK-NEXT: invoke void @_ZN1AC2Ev(i8* undef) 177; CHECK-NEXT: to label [[DOTNOEXC_I:%.*]] unwind label [[LPAD_I:%.*]] 178; CHECK: .noexc.i: 179; CHECK-NEXT: unreachable 180; CHECK: lpad.i: 181; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 } 182; CHECK-NEXT: cleanup 183; CHECK-NEXT: resume { i8*, i32 } [[TMP0]] 184; 185entry: 186 %nt = alloca i8 187 %call.i = tail call i8* @_ZnwmRKSt9nothrow_t(i64 1, i8* %nt) builtin nounwind 188 invoke void @_ZN1AC2Ev(i8* undef) 189 to label %.noexc.i unwind label %lpad.i 190 191.noexc.i: ; preds = %entry 192 unreachable 193 194lpad.i: ; preds = %entry 195 %0 = landingpad { i8*, i32 } cleanup 196 call void @_ZdlPvRKSt9nothrow_t(i8* %call.i, i8* %nt) builtin nounwind 197 resume { i8*, i32 } %0 198} 199 200declare i8* @_Znwm(i64) nobuiltin 201define i8* @_Znwj(i32 %n) nobuiltin { 202; CHECK-LABEL: @_Znwj( 203; CHECK-NEXT: [[Z:%.*]] = zext i32 [[N:%.*]] to i64 204; CHECK-NEXT: [[M:%.*]] = call i8* @_Znwm(i64 [[Z]]) 205; CHECK-NEXT: ret i8* [[M]] 206; 207 %z = zext i32 %n to i64 208 %m = call i8* @_Znwm(i64 %z) 209 ret i8* %m 210} 211declare i8* @_Znam(i64) nobuiltin 212declare i8* @_Znaj(i32) nobuiltin 213declare void @_ZdlPv(i8*) nobuiltin 214declare void @_ZdaPv(i8*) nobuiltin 215 216define linkonce void @_ZdlPvm(i8* %p, i64) nobuiltin { 217; CHECK-LABEL: @_ZdlPvm( 218; CHECK-NEXT: call void @_ZdlPv(i8* [[P:%.*]]) 219; CHECK-NEXT: ret void 220; 221 call void @_ZdlPv(i8* %p) 222 ret void 223} 224define linkonce void @_ZdlPvj(i8* %p, i32) nobuiltin { 225; CHECK-LABEL: @_ZdlPvj( 226; CHECK-NEXT: call void @_ZdlPv(i8* [[P:%.*]]) 227; CHECK-NEXT: ret void 228; 229 call void @_ZdlPv(i8* %p) 230 ret void 231} 232define linkonce void @_ZdaPvm(i8* %p, i64) nobuiltin { 233; CHECK-LABEL: @_ZdaPvm( 234; CHECK-NEXT: call void @_ZdaPv(i8* [[P:%.*]]) 235; CHECK-NEXT: ret void 236; 237 call void @_ZdaPv(i8* %p) 238 ret void 239} 240define linkonce void @_ZdaPvj(i8* %p, i32) nobuiltin { 241; CHECK-LABEL: @_ZdaPvj( 242; CHECK-NEXT: call void @_ZdaPv(i8* [[P:%.*]]) 243; CHECK-NEXT: ret void 244; 245 call void @_ZdaPv(i8* %p) 246 ret void 247} 248 249 250; new(size_t, align_val_t) 251declare i8* @_ZnwmSt11align_val_t(i64, i64) nobuiltin 252declare i8* @_ZnwjSt11align_val_t(i32, i32) nobuiltin 253; new[](size_t, align_val_t) 254declare i8* @_ZnamSt11align_val_t(i64, i64) nobuiltin 255declare i8* @_ZnajSt11align_val_t(i32, i32) nobuiltin 256; new(size_t, align_val_t, nothrow) 257declare i8* @_ZnwmSt11align_val_tRKSt9nothrow_t(i64, i64, i8*) nobuiltin 258declare i8* @_ZnwjSt11align_val_tRKSt9nothrow_t(i32, i32, i8*) nobuiltin 259; new[](size_t, align_val_t, nothrow) 260declare i8* @_ZnamSt11align_val_tRKSt9nothrow_t(i64, i64, i8*) nobuiltin 261declare i8* @_ZnajSt11align_val_tRKSt9nothrow_t(i32, i32, i8*) nobuiltin 262; delete(void*, align_val_t) 263declare void @_ZdlPvSt11align_val_t(i8*, i64) nobuiltin 264; delete[](void*, align_val_t) 265declare void @_ZdaPvSt11align_val_t(i8*, i64) nobuiltin 266; delete(void*, align_val_t, nothrow) 267declare void @_ZdlPvSt11align_val_tRKSt9nothrow_t(i8*, i64, i8*) nobuiltin 268; delete[](void*, align_val_t, nothrow) 269declare void @_ZdaPvSt11align_val_tRKSt9nothrow_t(i8*, i64, i8*) nobuiltin 270; delete(void*, unsigned int, align_val_t) 271declare void @_ZdlPvjSt11align_val_t(i8*, i32, i32) nobuiltin 272; delete(void*, unsigned long, align_val_t) 273declare void @_ZdlPvmSt11align_val_t(i8*, i64, i64) nobuiltin 274; delete[](void*, unsigned int, align_val_t) 275declare void @_ZdaPvjSt11align_val_t(i8*, i32, i32) nobuiltin 276; delete[](void*, unsigned long, align_val_t) 277declare void @_ZdaPvmSt11align_val_t(i8*, i64, i64) nobuiltin 278 279declare void @llvm.assume(i1) 280 281define void @test8() { 282; CHECK-LABEL: @test8( 283; CHECK-NEXT: ret void 284; 285 %nt = alloca i8 286 %nw = call i8* @_Znwm(i64 32) builtin 287 call void @_ZdlPv(i8* %nw) builtin 288 %na = call i8* @_Znam(i64 32) builtin 289 call void @_ZdaPv(i8* %na) builtin 290 %nwm = call i8* @_Znwm(i64 32) builtin 291 call void @_ZdlPvm(i8* %nwm, i64 32) builtin 292 %nwj = call i8* @_Znwj(i32 32) builtin 293 call void @_ZdlPvj(i8* %nwj, i32 32) builtin 294 %nam = call i8* @_Znam(i64 32) builtin 295 call void @_ZdaPvm(i8* %nam, i64 32) builtin 296 %naj = call i8* @_Znaj(i32 32) builtin 297 call void @_ZdaPvj(i8* %naj, i32 32) builtin 298 %nwa = call i8* @_ZnwmSt11align_val_t(i64 32, i64 8) builtin 299 call void @_ZdlPvSt11align_val_t(i8* %nwa, i64 8) builtin 300 %naa = call i8* @_ZnamSt11align_val_t(i64 32, i64 8) builtin 301 call void @_ZdaPvSt11align_val_t(i8* %naa, i64 8) builtin 302 %nwja = call i8* @_ZnwjSt11align_val_t(i32 32, i32 8) builtin 303 call void @_ZdlPvSt11align_val_t(i8* %nwja, i64 8) builtin 304 %naja = call i8* @_ZnajSt11align_val_t(i32 32, i32 8) builtin 305 call void @_ZdaPvSt11align_val_t(i8* %naja, i64 8) builtin 306 %nwat = call i8* @_ZnwmSt11align_val_tRKSt9nothrow_t(i64 32, i64 8, i8* %nt) builtin 307 call void @_ZdlPvSt11align_val_tRKSt9nothrow_t(i8* %nwat, i64 8, i8* %nt) builtin 308 %naat = call i8* @_ZnamSt11align_val_tRKSt9nothrow_t(i64 32, i64 8, i8* %nt) builtin 309 call void @_ZdaPvSt11align_val_tRKSt9nothrow_t(i8* %naat, i64 8, i8* %nt) builtin 310 %nwjat = call i8* @_ZnwjSt11align_val_tRKSt9nothrow_t(i32 32, i32 8, i8* %nt) builtin 311 call void @_ZdlPvSt11align_val_tRKSt9nothrow_t(i8* %nwjat, i64 8, i8* %nt) builtin 312 %najat = call i8* @_ZnajSt11align_val_tRKSt9nothrow_t(i32 32, i32 8, i8* %nt) builtin 313 call void @_ZdaPvSt11align_val_tRKSt9nothrow_t(i8* %najat, i64 8, i8* %nt) builtin 314 %nwa2 = call i8* @_ZnwmSt11align_val_t(i64 32, i64 8) builtin 315 call void @_ZdlPvmSt11align_val_t(i8* %nwa2, i64 32, i64 8) builtin 316 %nwja2 = call i8* @_ZnwjSt11align_val_t(i32 32, i32 8) builtin 317 call void @_ZdlPvjSt11align_val_t(i8* %nwa2, i32 32, i32 8) builtin 318 %naa2 = call i8* @_ZnamSt11align_val_t(i64 32, i64 8) builtin 319 call void @_ZdaPvmSt11align_val_t(i8* %naa2, i64 32, i64 8) builtin 320 %naja2 = call i8* @_ZnajSt11align_val_t(i32 32, i32 8) builtin 321 call void @_ZdaPvjSt11align_val_t(i8* %naja2, i32 32, i32 8) builtin 322 323 ; Check that the alignment assume does not prevent the removal. 324 %nwa3 = call i8* @_ZnwmSt11align_val_t(i64 32, i64 16) builtin 325 call void @llvm.assume(i1 true) [ "align"(i8* %nwa3, i64 16) ] 326 call void @_ZdlPvmSt11align_val_t(i8* %nwa3, i64 32, i64 16) builtin 327 328 ret void 329} 330 331declare noalias i8* @"\01??2@YAPEAX_K@Z"(i64) nobuiltin 332declare void @"\01??3@YAXPEAX@Z"(i8*) nobuiltin 333 334define void @test9() { 335; CHECK-LABEL: @test9( 336; CHECK-NEXT: ret void 337; 338 %new_long_long = call noalias i8* @"\01??2@YAPEAX_K@Z"(i64 32) builtin 339 call void @"\01??3@YAXPEAX@Z"(i8* %new_long_long) builtin 340 ret void 341} 342 343define void @test10() { 344; CHECK-LABEL: @test10( 345; CHECK-NEXT: call void @_ZdlPv(i8* null) 346; CHECK-NEXT: ret void 347; 348 call void @_ZdlPv(i8* null) 349 ret void 350} 351 352define void @test11() { 353; CHECK-LABEL: @test11( 354; CHECK-NEXT: [[CALL:%.*]] = call dereferenceable(8) i8* @_Znwm(i64 8) #7 355; CHECK-NEXT: call void @_ZdlPv(i8* nonnull [[CALL]]) 356; CHECK-NEXT: ret void 357; 358 %call = call i8* @_Znwm(i64 8) builtin 359 call void @_ZdlPv(i8* %call) 360 ret void 361} 362 363;; Check that the optimization that moves a call to free in its predecessor 364;; block (see test6) also happens when noop casts are involved. 365define void @test12(i32* %foo) minsize { 366; CHECK-LABEL: @test12( 367; CHECK-NEXT: entry: 368; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32* [[FOO:%.*]], null 369; CHECK-NEXT: [[BITCAST:%.*]] = bitcast i32* [[FOO]] to i8* 370; CHECK-NEXT: tail call void @free(i8* [[BITCAST]]) 371; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 372; CHECK: if.then: 373; CHECK-NEXT: br label [[IF_END]] 374; CHECK: if.end: 375; CHECK-NEXT: ret void 376; 377;; Everything before the call to free should have been moved as well. 378;; Call to free moved 379;; Block is now empty and may be simplified by simplifycfg 380entry: 381 %tobool = icmp eq i32* %foo, null 382 br i1 %tobool, label %if.end, label %if.then 383 384if.then: ; preds = %entry 385 %bitcast = bitcast i32* %foo to i8* 386 tail call void @free(i8* %bitcast) 387 br label %if.end 388 389if.end: ; preds = %entry, %if.then 390 ret void 391} 392 393