[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 =
>AX?
>
>-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