compilium icon indicating copy to clipboard operation
compilium copied to clipboard

Restore registers appropriately in early returns

Open hikalium opened this issue 5 years ago • 1 comments

$ ./compilium
int main() {
  int a = 1;
  return a + 2;
}
Preprocess begin
Parse begin
[
 FuncDef <main> : function<returns: int, args: []>{
  [
   (op=<> R=(op= R=(op=<a>))),
   (op=<return> R=(op=<+> L=(op=<a>) R=(op=<2>)))
  ]
 }
]

Analyze begin
`a` has a type: int
[
 FuncDef <main> : function<returns: int, args: []>{
  [
   (op=<> R=(op= R=(op=<a>))),
   (op=<return> R=(op=<+>:int reg: 1 L=(op=<a>:lvalue<int> reg: 1) R=(op=<2>:int reg: 2)))
  ]
 }
]

.intel_syntax noprefix
.text
.global _main
_main:
push rbp
mov rbp, rsp
push r12
push r13
push r14
push r15
lea rdi, [rbp - 4]
mov rsi, 1
mov [rdi], esi # 4 byte store
lea rdi, [rbp - 4]
movsxd rdi, dword ptr[rdi]
mov rsi, 2
add rdi, rsi
mov rax, rdi
mov rsp, rbp
pop rbp
ret
pop r15
pop r14
pop r13
pop r12
mov rsp, rbp
pop rbp
ret
.data

hikalium avatar Oct 24 '20 05:10 hikalium

pop r15
pop r14
pop r13
pop r12

should also be done in early returns.

hikalium avatar Oct 24 '20 05:10 hikalium