[llvm-commits] [llvm] r99400 - in /llvm/trunk: lib/CodeGen/LiveIntervalAnalysis.cpp test/CodeGen/Generic/2010-03-24-liveintervalleak.ll

Bob Wilson bob.wilson at apple.com
Wed Mar 24 13:24:06 PDT 2010


This breaks MultiSource/Applications/ClamAV/clamscan.
I'm going to revert it for now.

On Mar 24, 2010, at 6:50 AM, Torok Edwin wrote:

> Author: edwin
> Date: Wed Mar 24 08:50:36 2010
> New Revision: 99400
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=99400&view=rev
> Log:
> Fix memory leak in liveintervals: the destructor for VNInfos must be called,
> otherwise the SmallVector it contains doesn't free its memory.
> In most cases LiveIntervalAnalysis could get away by not calling the destructor,
> because VNInfos are bumpptr-allocated, and smallvectors usually don't grow.
> However when the SmallVector does grow it always leaks.
> 
> This is the valgrind shown leak from the original testcase:
> ==8206== 18,304 bytes in 151 blocks are definitely lost in loss record 164 of 164
> ==8206==    at 0x4A079C7: operator new(unsigned long) (vg_replace_malloc.c:220)
> ==8206==    by 0x4DB7A7E: llvm::SmallVectorBase::grow_pod(unsigned long, unsigned long) (in /home/edwin/clam/git/builds/defaul
> t/libclamav/.libs/libclamav.so.6.1.0)
> ==8206==    by 0x4F90382: llvm::VNInfo::addKill(llvm::SlotIndex) (in /home/edwin/clam/git/builds/default/libclamav/.libs/libcl
> amav.so.6.1.0)
> ==8206==    by 0x5126B5C: llvm::LiveIntervals::handleVirtualRegisterDef(llvm::MachineBasicBlock*, llvm::ilist_iterator<llvm::M
> achineInstr>, llvm::SlotIndex, llvm::MachineOperand&, unsigned int, llvm::LiveInterval&) (in /home/edwin/clam/git/builds/defau
> lt/libclamav/.libs/libclamav.so.6.1.0)
> ==8206==    by 0x512725E: llvm::LiveIntervals::handleRegisterDef(llvm::MachineBasicBlock*, llvm::ilist_iterator<llvm::MachineI
> nstr>, llvm::SlotIndex, llvm::MachineOperand&, unsigned int) (in /home/edwin/clam/git/builds/default/libclamav/.libs/libclamav
> .so.6.1.0)
> ==8206==    by 0x51278A8: llvm::LiveIntervals::computeIntervals() (in /home/edwin/clam/git/builds/default/libclamav/.libs/libc
> lamav.so.6.1.0)
> ==8206==    by 0x5127CB4: llvm::LiveIntervals::runOnMachineFunction(llvm::MachineFunction&) (in /home/edwin/clam/git/builds/de
> fault/libclamav/.libs/libclamav.so.6.1.0)
> ==8206==    by 0x4DAE935: llvm::FPPassManager::runOnFunction(llvm::Function&) (in /home/edwin/clam/git/builds/default/libclama
> v/.libs/libclamav.so.6.1.0)
> ==8206==    by 0x4DAEB10: llvm::FunctionPassManagerImpl::run(llvm::Function&) (in /home/edwin/clam/git/builds/default/libclama
> v/.libs/libclamav.so.6.1.0)
> ==8206==    by 0x4DAED3D: llvm::FunctionPassManager::run(llvm::Function&) (in /home/edwin/clam/git/builds/default/libclamav/.l
> ibs/libclamav.so.6.1.0)
> ==8206==    by 0x4D8BE8E: llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*, llvm::MutexGuard const&) (in /home/edwin/clam/git/builds/default/libclamav/.libs/libclamav.so.6.1.0)
> ==8206==    by 0x4D8CA72: llvm::JIT::getPointerToFunction(llvm::Function*) (in /home/edwin/clam/git/builds/default/libclamav/.libs/libclamav.so.6.1.0)
> 
> Added:
>    llvm/trunk/test/CodeGen/Generic/2010-03-24-liveintervalleak.ll
> Modified:
>    llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
> 
> Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=99400&r1=99399&r2=99400&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original)
> +++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Wed Mar 24 08:50:36 2010
> @@ -85,8 +85,10 @@
> void LiveIntervals::releaseMemory() {
>   // Free the live intervals themselves.
>   for (DenseMap<unsigned, LiveInterval*>::iterator I = r2iMap_.begin(),
> -       E = r2iMap_.end(); I != E; ++I)
> +       E = r2iMap_.end(); I != E; ++I) {
> +    I->second->clear();
>     delete I->second;
> +  }
> 
>   r2iMap_.clear();
> 
> 
> Added: llvm/trunk/test/CodeGen/Generic/2010-03-24-liveintervalleak.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/2010-03-24-liveintervalleak.ll?rev=99400&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Generic/2010-03-24-liveintervalleak.ll (added)
> +++ llvm/trunk/test/CodeGen/Generic/2010-03-24-liveintervalleak.ll Wed Mar 24 08:50:36 2010
> @@ -0,0 +1,114 @@
> +; RUN: llc <%s
> +%0 = type { i8, %1, i8, %1, i8, %1 }
> +%1 = type { i32 }
> +%2 = type { i16, i8, i8, i8, [3 x [10 x i8]], [29 x i8] }
> +%3 = type { i32, i32, i32, i32, i32, i32, i32, i32, i32 }
> +%4 = type { i32, i32, i16, i16, %5, %6, i32, %8, [16 x %7], i32, i32, i32, i32 }
> +%5 = type { i32, i16, i16, i32, i32, i32, i16, i16 }
> +%6 = type { i16, i8, i8, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i16, i16, i32, i32, i32, i32, i16, i16, i32, i32, i32, i32, i32, i32, [16 x %7] }
> +%7 = type { i32, i32 }
> +%8 = type { i16, i8, i8, i32, i32, i32, i32, i32, i64, i32, i32, i16, i16, i16, i16, i16, i16, i32, i32, i32, i32, i16, i16, i64, i64, i64, i64, i32, i32, [16 x %7] }
> + at glob2 = internal constant [39 x i8] c"ClamAV-Test-File-detected-via-bytecode\00" ; <[39 x i8]*> [#uses=1]
> + at glob9 = internal constant [5 x i8] c"EP: \00"    ; <[5 x i8]*> [#uses=1]
> + at glob10 = internal constant [27 x i8] c"Couldn't read 5 bytes @EP\0A\00" ; <[27 x i8]*> [#uses=1]
> + at glob11 = internal constant [46 x i8] c"No 'mov ebx, cyphertext' found at entrypoint\0A\00" ; <[46 x i8]*> [#uses=1]
> + at glob12 = internal constant [21 x i8] c"VA of cyphertext is \00" ; <[21 x i8]*> [#uses=1]
> + at glob13 = internal constant [22 x i8] c"RVA of cyphertext is \00" ; <[22 x i8]*> [#uses=1]
> + at glob14 = internal constant [51 x i8] c"Can't locate the phisical offset of the cyphertext\00" ; <[51 x i8]*> [#uses=1]
> + at glob15 = internal constant [22 x i8] c"Cyphertext starts at \00" ; <[22 x i8]*> [#uses=1]
> + at glob16 = internal constant [35 x i8] c"Can't read 10 bytes of cyphertext\0A\00" ; <[35 x i8]*> [#uses=1]
> + at glob17 = internal constant [11 x i8] c"HELLO WORM\00" ; <[11 x i8]*> [#uses=1]
> +declare i32 @llvm.bswap.i32(i32) nounwind readnone
> +declare i32 @memcmp(i8*, i8*, i64)
> +declare i32 @read([128 x i8]*, i8*, i32)
> +declare i32 @seek([128 x i8]*, i32, i32)
> +declare i32 @setvirusname([128 x i8]*, i8*, i32)
> +declare i32 @debug_print_str([128 x i8]*, i8*, i32)
> +declare i32 @debug_print_uint([128 x i8]*, i32)
> +declare i32 @pe_rawaddr([128 x i8]*, i32)
> +define internal fastcc i32 @bc0f0([128 x i8]*) nounwind ssp sspreq {
> +  %2 = alloca [5 x i8]                            ; <[5 x i8]*> [#uses=3]
> +  %3 = alloca [11 x i8]                           ; <[11 x i8]*> [#uses=5]
> +  %4 = getelementptr inbounds [128 x i8]* %0, i32 0, i32 120 ; <i8*> [#uses=1]
> +  %5 = bitcast i8* %4 to %4**                     ; <%4**> [#uses=1]
> +  %6 = load %4** %5                               ; <%4*> [#uses=1]
> +  %g3_1 = bitcast %4* %6 to i8*                   ; <i8*> [#uses=1]
> +  %7 = getelementptr i8* %g3_1, i32 64            ; <i8*> [#uses=1]
> +  %8 = bitcast i8* %7 to %4**                     ; <%4**> [#uses=1]
> +  %9 = getelementptr inbounds [128 x i8]* %0, i32 0, i32 120 ; <i8*> [#uses=1]
> +  %10 = bitcast i8* %9 to %4**                    ; <%4**> [#uses=1]
> +  %11 = load %4** %10                             ; <%4*> [#uses=1]
> +  %g3_2 = bitcast %4* %11 to i8*                  ; <i8*> [#uses=1]
> +  %12 = getelementptr i8* %g3_2, i32 4            ; <i8*> [#uses=1]
> +  %13 = bitcast i8* %12 to %4**                   ; <%4**> [#uses=1]
> +  %14 = bitcast %4** %13 to i32*                  ; <i32*> [#uses=1]
> +  %15 = load i32* %14                             ; <i32> [#uses=2]
> +  %16 = call i32 @debug_print_str([128 x i8]* %0, i8* getelementptr inbounds ([5 x i8]* @glob9, i32 0, i32 0), i32 0) ; <i32> [#uses=0]
> +  %17 = call i32 @debug_print_uint([128 x i8]* %0, i32 %15) ; <i32> [#uses=0]
> +  %18 = call i32 @seek([128 x i8]* %0, i32 %15, i32 0) ; <i32> [#uses=0]
> +  %19 = getelementptr [5 x i8]* %2, i32 0, i32 0  ; <i8*> [#uses=1]
> +  %20 = call i32 @read([128 x i8]* %0, i8* %19, i32 5) ; <i32> [#uses=1]
> +  %21 = icmp eq i32 %20, 5                        ; <i1> [#uses=1]
> +  br i1 %21, label %24, label %22
> +  %23 = call i32 @debug_print_str([128 x i8]* %0, i8* getelementptr inbounds ([27 x i8]* @glob10, i32 0, i32 0), i32 0) ; <i32> [#uses=0]
> +  ret i32 0
> +  %25 = getelementptr [5 x i8]* %2, i32 0, i32 0  ; <i8*> [#uses=1]
> +  %26 = load i8* %25                              ; <i8> [#uses=1]
> +  %27 = icmp eq i8 %26, -69                       ; <i1> [#uses=1]
> +  br i1 %27, label %30, label %28
> +  %29 = call i32 @debug_print_str([128 x i8]* %0, i8* getelementptr inbounds ([46 x i8]* @glob11, i32 0, i32 0), i32 0) ; <i32> [#uses=0]
> +  ret i32 0
> +  %31 = getelementptr [5 x i8]* %2, i32 0, i32 1  ; <i8*> [#uses=1]
> +  %32 = bitcast i8* %31 to i32*                   ; <i32*> [#uses=1]
> +  %33 = load i32* %32                             ; <i32> [#uses=2]
> +  br i1 false, label %34, label %36
> +  %35 = tail call i32 @llvm.bswap.i32(i32 %33) nounwind ; <i32> [#uses=1]
> +  br label %36
> +  %.06 = phi i32 [ %35, %34 ], [ %33, %30 ]       ; <i32> [#uses=2]
> +  %37 = call i32 @debug_print_str([128 x i8]* %0, i8* getelementptr inbounds ([21 x i8]* @glob12, i32 0, i32 0), i32 0) ; <i32> [#uses=0]
> +  %38 = call i32 @debug_print_uint([128 x i8]* %0, i32 %.06) ; <i32> [#uses=0]
> +  %39 = bitcast %4** %8 to i32*                   ; <i32*> [#uses=1]
> +  %40 = load i32* %39                             ; <i32> [#uses=1]
> +  %41 = sub i32 %.06, %40                         ; <i32> [#uses=2]
> +  %42 = call i32 @debug_print_str([128 x i8]* %0, i8* getelementptr inbounds ([22 x i8]* @glob13, i32 0, i32 0), i32 0) ; <i32> [#uses=0]
> +  %43 = call i32 @debug_print_uint([128 x i8]* %0, i32 %41) ; <i32> [#uses=0]
> +  %44 = call i32 @pe_rawaddr([128 x i8]* %0, i32 %41) ; <i32> [#uses=3]
> +  %45 = icmp eq i32 %44, -1                       ; <i1> [#uses=1]
> +  br i1 %45, label %46, label %48
> +  %47 = call i32 @debug_print_str([128 x i8]* %0, i8* getelementptr inbounds ([51 x i8]* @glob14, i32 0, i32 0), i32 0) ; <i32> [#uses=0]
> +  ret i32 0
> +  %49 = call i32 @debug_print_str([128 x i8]* %0, i8* getelementptr inbounds ([22 x i8]* @glob15, i32 0, i32 0), i32 0) ; <i32> [#uses=0]
> +  %50 = call i32 @debug_print_uint([128 x i8]* %0, i32 %44) ; <i32> [#uses=0]
> +  %51 = call i32 @seek([128 x i8]* %0, i32 %44, i32 0) ; <i32> [#uses=0]
> +  %52 = getelementptr [11 x i8]* %3, i32 0, i32 0 ; <i8*> [#uses=1]
> +  %53 = call i32 @read([128 x i8]* %0, i8* %52, i32 10) ; <i32> [#uses=1]
> +  %54 = icmp eq i32 %53, 10                       ; <i1> [#uses=1]
> +  br i1 %54, label %57, label %55
> +  %56 = call i32 @debug_print_str([128 x i8]* %0, i8* getelementptr inbounds ([35 x i8]* @glob16, i32 0, i32 0), i32 0) ; <i32> [#uses=0]
> +  ret i32 0
> +  %.05 = phi i32 [ 0, %48 ], [ %66, %65 ]         ; <i32> [#uses=4]
> +  %.0 = phi i8 [ 41, %48 ], [ %63, %65 ]          ; <i8> [#uses=1]
> +  %58 = getelementptr [11 x i8]* %3, i32 0, i32 %.05 ; <i8*> [#uses=2]
> +  %59 = icmp ult i32 %.05, 11                     ; <i1> [#uses=1]
> +  br i1 %59, label %60, label %79
> +  %61 = add i8 %.0, 1                             ; <i8> [#uses=1]
> +  %62 = load i8* %58                              ; <i8> [#uses=1]
> +  %63 = xor i8 %62, %61                           ; <i8> [#uses=2]
> +  %64 = icmp ult i32 %.05, 11                     ; <i1> [#uses=1]
> +  br i1 %64, label %65, label %79
> +  %66 = add i32 %.05, 1                           ; <i32> [#uses=2]
> +  %67 = icmp eq i32 %66, 10                       ; <i1> [#uses=1]
> +  br i1 %67, label %68, label %57
> +  %69 = getelementptr [11 x i8]* %3, i32 0, i32 0 ; <i8*> [#uses=1]
> +  %70 = tail call i32 @memcmp(i8* %69, i8* getelementptr inbounds ([11 x i8]* @glob17, i32 0, i32 0), i64 10) nounwind ; <i32> [#uses=1]
> +  %71 = icmp eq i32 %70, 0                        ; <i1> [#uses=1]
> +  br i1 %71, label %72, label %78
> +  %73 = getelementptr [11 x i8]* %3, i32 0, i32 10 ; <i8*> [#uses=1]
> +  %74 = bitcast i8* %73 to i1*                    ; <i1*> [#uses=1]
> +  %75 = getelementptr [11 x i8]* %3, i32 0, i32 0 ; <i8*> [#uses=1]
> +  %76 = call i32 @debug_print_str([128 x i8]* %0, i8* %75, i32 0) ; <i32> [#uses=0]
> +  %77 = call i32 @setvirusname([128 x i8]* %0, i8* getelementptr inbounds ([39 x i8]* @glob2, i32 0, i32 0), i32 0) ; <i32> [#uses=0]
> +  ret i32 0
> +  ret i32 0
> +  unreachable
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list