[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