Skip to content
  • Chris Lattner's avatar
    Improve GVN to be able to forward substitute a small load · 0a9616d9
    Chris Lattner authored
    from a piece of a large store when both are in the same block.
    
    This allows clang to compile the testcase in PR4216 to this code:
    
    _test_bitfield:
    	movl	4(%esp), %eax
    	movl	%eax, %ecx
    	andl	$-65536, %ecx
    	orl	$32962, %eax
    	andl	$40186, %eax
    	orl	%ecx, %eax
    	ret
    
    This is not ideal, but is a whole lot better than the code produced
    by llvm-gcc:
    
    _test_bitfield:
    	movw	$-32574, %ax
    	orw	4(%esp), %ax
    	andw	$-25350, %ax
    	movw	%ax, 4(%esp)
    	movw	7(%esp), %cx
    	shlw	$8, %cx
    	movzbl	6(%esp), %edx
    	orw	%cx, %dx
    	movzwl	%dx, %ecx
    	shll	$16, %ecx
    	movzwl	%ax, %eax
    	orl	%ecx, %eax
    	ret
    
    and dramatically better than that produced by gcc 4.2:
    
    _test_bitfield:
    	pushl	%ebx
    	call	L3
    "L00000000001$pb":
    L3:
    	popl	%ebx
    	movl	8(%esp), %eax
    	leal	0(,%eax,4), %edx
    	sarb	$7, %dl
    	movl	%eax, %ecx
    	andl	$7168, %ecx
    	andl	$-7201, %ebx
    	movzbl	%dl, %edx
    	andl	$1, %edx
    	sall	$5, %edx
    	orl	%ecx, %ebx
    	orl	%edx, %ebx
    	andl	$24, %eax
    	andl	$-58336, %ebx
    	orl	%eax, %ebx
    	orl	$32962, %ebx
    	movl	%ebx, %eax
    	popl	%ebx
    	ret
    
    llvm-svn: 82439
    0a9616d9
Loading