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

Quentin Colombet via llvm-dev llvm-dev at lists.llvm.org
Tue May 24 10:40:22 PDT 2016


Hi Krzysztof,

> On May 24, 2016, at 8:03 AM, Krzysztof Parzyszek via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> 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?

Try enabling the sub-register liveness feature. I am guessing we think we cannot use the same register for the low and high part.
Though, I would need to see the machine instrs to be sure.

>  Does it know that AH:AL = AX?

Yes it does.

Cheers,
-Quentin
> 
> -Krzysztof
> 
> 
> 
> -- 
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list