[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