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

Smith, Kevin B via llvm-dev llvm-dev at lists.llvm.org
Tue May 24 09:09:01 PDT 2016

Try using x86 mode rather than Intel64 mode.  I have definitely gotten it to use both ah and al in 32 bit x86 code generation.
In particular, I have seen that in loops for both the spec2000 and spec2006 versions of bzip.  It can happen, but it does only rarely.

Kevin Smith

>-----Original Message-----
>From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf Of
>Krzysztof Parzyszek via llvm-dev
>Sent: Tuesday, May 24, 2016 8:04 AM
>To: LLVM Dev <llvm-dev at lists.llvm.org>
>Subject: [llvm-dev] Liveness of AL, AH and AX in x86 backend
>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 =
>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

More information about the llvm-dev mailing list