[llvm-dev] Liveness of AL, AH and AX in x86 backend

Krzysztof Parzyszek via llvm-dev llvm-dev at lists.llvm.org
Tue May 24 08:03:54 PDT 2016


I'm trying to see how the x86 backend deals with the relationship 
between AL, AH and AX, but I can't get it to generate any code that 
would expose an interesting scenario.

For example, I wrote this piece:

typedef struct {
   char x, y;
} struct_t;

struct_t z;

struct_t foo(char *p) {
   struct_t s;
   s.x = *p++;
   s.y = *p;
   z = s;
   s.x++;
   return s;
}

But the output at -O2 is

foo:                                    # @foo
         .cfi_startproc
# BB#0:                                 # %entry
         movb    (%rdi), %al
         movzbl  1(%rdi), %ecx
         movb    %al, z(%rip)
         movb    %cl, z+1(%rip)
         incb    %al
         shll    $8, %ecx
         movzbl  %al, %eax
         orl     %ecx, %eax
         retq


I was hoping it would do something along the lines of

   movb (%rdi), %al
   movb 1(%rdi), %ah
   movh %ax, z(%rip)
   incb %al
   retq


Why is the x86 backend not getting this code?  Does it know that AH:AL = AX?

-Krzysztof



-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, 
hosted by The Linux Foundation


More information about the llvm-dev mailing list