[llvm-dev] llc generating code that writes below the stack pointer on darwin/x86-64
Jonas Maebe via llvm-dev
llvm-dev at lists.llvm.org
Sun Nov 13 09:12:24 PST 2016
Hi,
Is there something wrong with my inline assembly below?
***
target datalayout =
"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.5"
define void @"\01_SYSTEM_$$_SETMXCSR$LONGWORD"(i32 %p.w) nobuiltin {
; [71] procedure SetMXCSR(w : dword);
%tmp.1 = alloca i32, align 4
; Var w located at %tmp.1
; [72] begin
store i32 %p.w, i32* %tmp.1, align 4
; [73] defaultmxcsr:=w;
%reg.1_16 = load i32, i32* %tmp.1, align 4
store i32 %reg.1_16, i32* @"\01_TC_$SYSTEM_$$_DEFAULTMXCSR",
align 4
; [75] ldmxcsr w
call void asm sideeffect "#
[math.inc]\0A\09ldmxcsr\09$0\0A","=*m,~{memory},~{fpsr},~{flags},~{rax},~{rcx},~{rdx},~{rsi},~{rdi},~{r8},~{r9},~{r10},~{r11}"(i32*
%tmp.1)
; [77] end;
br label %Lj1135
Lj1135:
ret void
}
@"\01_TC_$SYSTEM_$$_DEFAULTMXCSR" = global i32 6400, align 4
***
I know the clobber list is overly conservative, but it's automatically
generated by our compiler, which does not have the necessary information
to reduce it.
The resulting assembly generated by llc -O2 is:
***
.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 5
.globl _SYSTEM_$$_SETMXCSR$LONGWORD
.p2align 4, 0x90
_SYSTEM_$$_SETMXCSR$LONGWORD: ##
@"\01_SYSTEM_$$_SETMXCSR$LONGWORD"
.cfi_startproc
## BB#0:
movl %edi, -4(%rsp)
movl %edi, _TC_$SYSTEM_$$_DEFAULTMXCSR(%rip)
## InlineAsm Start
## [math.inc]
ldmxcsr -4(%rsp)
## CPU ATHLON64
## InlineAsm End
retq
.cfi_endproc
.section __DATA,__data
.globl _TC_$SYSTEM_$$_DEFAULTMXCSR ##
@"\01_TC_$SYSTEM_$$_DEFAULTMXCSR"
.p2align 2
_TC_$SYSTEM_$$_DEFAULTMXCSR:
.long 6400 ## 0x1900
.subsections_via_symbols
***
This code use a negative stack offset, which is forbidden on x86-64
(there's no red zone). This happens with llc from llvm 3.7, 3.8 and 3.9.
Thanks,
Jonas
More information about the llvm-dev
mailing list