Mercurial > hg > CbC > CbC_llvm
diff test/Transforms/InstCombine/malloc-free-delete.ll @ 147:c2174574ed3a
LLVM 10
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 16:55:33 +0900 |
parents | 3a76565eade5 |
children |
line wrap: on
line diff
--- a/test/Transforms/InstCombine/malloc-free-delete.ll Sat Feb 17 09:57:20 2018 +0900 +++ b/test/Transforms/InstCombine/malloc-free-delete.ll Wed Aug 14 16:55:33 2019 +0900 @@ -146,7 +146,11 @@ } declare i8* @_Znwm(i64) nobuiltin -declare i8* @_Znwj(i32) nobuiltin +define i8* @_Znwj(i32 %n) nobuiltin { + %z = zext i32 %n to i64 + %m = call i8* @_Znwm(i64 %z) + ret i8* %m +} declare i8* @_Znam(i64) nobuiltin declare i8* @_Znaj(i32) nobuiltin declare void @_ZdlPv(i8*) nobuiltin @@ -169,9 +173,33 @@ ret void } + +; new(size_t, align_val_t) +declare i8* @_ZnwmSt11align_val_t(i64, i64) nobuiltin +declare i8* @_ZnwjSt11align_val_t(i32, i32) nobuiltin +; new[](size_t, align_val_t) +declare i8* @_ZnamSt11align_val_t(i64, i64) nobuiltin +declare i8* @_ZnajSt11align_val_t(i32, i32) nobuiltin +; new(size_t, align_val_t, nothrow) +declare i8* @_ZnwmSt11align_val_tRKSt9nothrow_t(i64, i64, i8*) nobuiltin +declare i8* @_ZnwjSt11align_val_tRKSt9nothrow_t(i32, i32, i8*) nobuiltin +; new[](size_t, align_val_t, nothrow) +declare i8* @_ZnamSt11align_val_tRKSt9nothrow_t(i64, i64, i8*) nobuiltin +declare i8* @_ZnajSt11align_val_tRKSt9nothrow_t(i32, i32, i8*) nobuiltin +; delete(void*, align_val_t) +declare void @_ZdlPvSt11align_val_t(i8*, i64) nobuiltin +; delete[](void*, align_val_t) +declare void @_ZdaPvSt11align_val_t(i8*, i64) nobuiltin +; delete(void*, align_val_t, nothrow) +declare void @_ZdlPvSt11align_val_tRKSt9nothrow_t(i8*, i64, i8*) nobuiltin +; delete[](void*, align_val_t, nothrow) +declare void @_ZdaPvSt11align_val_tRKSt9nothrow_t(i8*, i64, i8*) nobuiltin + + ; CHECK-LABEL: @test8( define void @test8() { ; CHECK-NOT: call + %nt = alloca i8 %nw = call i8* @_Znwm(i64 32) builtin call void @_ZdlPv(i8* %nw) builtin %na = call i8* @_Znam(i64 32) builtin @@ -184,6 +212,22 @@ call void @_ZdaPvm(i8* %nam, i64 32) builtin %naj = call i8* @_Znaj(i32 32) builtin call void @_ZdaPvj(i8* %naj, i32 32) builtin + %nwa = call i8* @_ZnwmSt11align_val_t(i64 32, i64 8) builtin + call void @_ZdlPvSt11align_val_t(i8* %nwa, i64 8) builtin + %naa = call i8* @_ZnamSt11align_val_t(i64 32, i64 8) builtin + call void @_ZdaPvSt11align_val_t(i8* %naa, i64 8) builtin + %nwja = call i8* @_ZnwjSt11align_val_t(i32 32, i32 8) builtin + call void @_ZdlPvSt11align_val_t(i8* %nwja, i64 8) builtin + %naja = call i8* @_ZnajSt11align_val_t(i32 32, i32 8) builtin + call void @_ZdaPvSt11align_val_t(i8* %naja, i64 8) builtin + %nwat = call i8* @_ZnwmSt11align_val_tRKSt9nothrow_t(i64 32, i64 8, i8* %nt) builtin + call void @_ZdlPvSt11align_val_tRKSt9nothrow_t(i8* %nwat, i64 8, i8* %nt) builtin + %naat = call i8* @_ZnamSt11align_val_tRKSt9nothrow_t(i64 32, i64 8, i8* %nt) builtin + call void @_ZdaPvSt11align_val_tRKSt9nothrow_t(i8* %naat, i64 8, i8* %nt) builtin + %nwjat = call i8* @_ZnwjSt11align_val_tRKSt9nothrow_t(i32 32, i32 8, i8* %nt) builtin + call void @_ZdlPvSt11align_val_tRKSt9nothrow_t(i8* %nwjat, i64 8, i8* %nt) builtin + %najat = call i8* @_ZnajSt11align_val_tRKSt9nothrow_t(i32 32, i32 8, i8* %nt) builtin + call void @_ZdaPvSt11align_val_tRKSt9nothrow_t(i8* %najat, i64 8, i8* %nt) builtin ret void } @@ -197,3 +241,48 @@ call void @"\01??3@YAXPEAX@Z"(i8* %new_long_long) builtin ret void } + +define void @test10() { +; CHECK-LABEL: @test10 +; CHECK: call void @_ZdlPv + call void @_ZdlPv(i8* null) + ret void +} + +define void @test11() { +; CHECK-LABEL: @test11 +; CHECK: call i8* @_Znwm +; CHECK: call void @_ZdlPv + %call = call i8* @_Znwm(i64 8) builtin + call void @_ZdlPv(i8* %call) + ret void +} + +;; Check that the optimization that moves a call to free in its predecessor +;; block (see test6) also happens when noop casts are involved. +; CHECK-LABEL: @test12( +define void @test12(i32* %foo) minsize { +; CHECK: %tobool = icmp eq i32* %foo, null +;; Everything before the call to free should have been moved as well. +; CHECK-NEXT: %bitcast = bitcast i32* %foo to i8* +;; Call to free moved +; CHECK-NEXT: tail call void @free(i8* %bitcast) +; CHECK-NEXT: br i1 %tobool, label %if.end, label %if.then +; CHECK: if.then: +;; Block is now empty and may be simplified by simplifycfg +; CHECK-NEXT: br label %if.end +; CHECK: if.end: +; CHECK-NEXT: ret void +entry: + %tobool = icmp eq i32* %foo, null + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + %bitcast = bitcast i32* %foo to i8* + tail call void @free(i8* %bitcast) + br label %if.end + +if.end: ; preds = %entry, %if.then + ret void +} +