Skip to content
  • Chris Lattner's avatar
    implement enough of the memset inference algorithm to recognize and insert · 29e14edc
    Chris Lattner authored
    memsets.  This is still missing one important validity check, but this is enough
    to compile stuff like this:
    
    void test0(std::vector<char> &X) {
      for (std::vector<char>::iterator I = X.begin(), E = X.end(); I != E; ++I)
        *I = 0;
    }
    
    void test1(std::vector<int> &X) {
      for (long i = 0, e = X.size(); i != e; ++i)
        X[i] = 0x01010101;
    }
    
    With:
     $ clang t.cpp -S -o - -O2 -emit-llvm | opt -loop-idiom | opt -O3 | llc 
    
    to:
    
    __Z5test0RSt6vectorIcSaIcEE:            ## @_Z5test0RSt6vectorIcSaIcEE
    ## BB#0:                                ## %entry
    	subq	$8, %rsp
    	movq	(%rdi), %rax
    	movq	8(%rdi), %rsi
    	cmpq	%rsi, %rax
    	je	LBB0_2
    ## BB#1:                                ## %bb.nph
    	subq	%rax, %rsi
    	movq	%rax, %rdi
    	callq	___bzero
    LBB0_2:                                 ## %for.end
    	addq	$8, %rsp
    	ret
    ...
    __Z5test1RSt6vectorIiSaIiEE:            ## @_Z5test1RSt6vectorIiSaIiEE
    ## BB#0:                                ## %entry
    	subq	$8, %rsp
    	movq	(%rdi), %rax
    	movq	8(%rdi), %rdx
    	subq	%rax, %rdx
    	cmpq	$4, %rdx
    	jb	LBB1_2
    ## BB#1:                                ## %for.body.preheader
    	andq	$-4, %rdx
    	movl	$1, %esi
    	movq	%rax, %rdi
    	callq	_memset
    LBB1_2:                                 ## %for.end
    	addq	$8, %rsp
    	ret
    
    llvm-svn: 122573
    29e14edc
Loading