Fix logical error when detecting lifetime intrinsics.

Don't replace a gep/bitcast with 'undef' because that will form a "free(undef)"
which in turn means "unreachable". What we wanted was a no-op. Instead, analyze
the whole tree and look for all the instructions we need to delete first, then
delete them second, not relying on the use_list to stay consistent.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136752 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky
2011-08-03 00:43:35 +00:00
parent 19308a1ea1
commit d5061a9268
2 changed files with 46 additions and 34 deletions

View File

@@ -35,3 +35,14 @@ define void @test3() {
call void @llvm.lifetime.end(i64 10, i8* %a)
ret void
}
;; This used to crash.
define void @test4() {
; CHECK: @test4
; CHECK-NEXT: ret void
%A = call i8* @malloc(i32 16000)
%B = bitcast i8* %A to double*
%C = bitcast double* %B to i8*
call void @free(i8* %C)
ret void
}