[LLVMdev] Scheduling quirks

Jasper Neumann jn at sirrida.de
Wed Jan 22 10:03:37 PST 2014

Hello Andrew!

int test_scheduler(int x) {
  return ((x>>2) & 15) ^ ((x>>3) & 31);
	movl	%edi, %eax
	shrl	$2, %eax
	andl	$15, %eax
	shrl	$3, %edi
	andl	$31, %edi
	xorl	%eax, %edi
	movl	%edi, %eax
instead of
	movl	%edi, %eax
	shrl	$3, %edi    # modify source instead of copy
	shrl	$2, %eax    # modifications interlaced
	andl	$31, %edi
	andl	$15, %eax
	xorl	%edi, %eax    # we need %eax here

 > In your example, we're copying from/to argument/return registers,
 > hence the extra copies.

This might be the reason for the final move.
However a simple peephole optimizer could catch this case.

 > [...] Do you still see the extra copies on LLVM trunk?

I retested this with a fresh checkout and compile of trunk (svn 199769) 
and got the same result.

BTW: Providing e.g. -march=atom helps a bit by sporting the expected 
interleaving for this example but IMHO this ought to be the case even 
without explicitely specifying a processor type.

The missed optimization regarding the modification of a copy occurs 
quite often and costs a cycle on almost all x86 processors.

Best regards

More information about the llvm-dev mailing list