1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-22 20:43:44 +02:00
llvm-mirror/test/CodeGen/X86/hipe-prologue.ll
Michael Kuperstein 9b69e7166c [X86] Extract HiPE prologue constants into metadata
X86FrameLowering::adjustForHiPEPrologue() contains a hard-coded offset
into an Erlang Runtime System-internal data structure (the PCB). As the
layout of this data structure is prone to change, this poses problems
for maintaining compatibility.

To address this problem, the compiler can produce this information as
module-level named metadata. For example (where P_NSP_LIMIT is the
offending offset):

!hipe.literals = !{ !2, !3, !4 }
!2 = !{ !"P_NSP_LIMIT", i32 152 }
!3 = !{ !"X86_LEAF_WORDS", i32 24 }
!4 = !{ !"AMD64_LEAF_WORDS", i32 24 }

Patch by Magnus Lang

Differential Revision: http://reviews.llvm.org/D20363

llvm-svn: 273593
2016-06-23 18:17:25 +00:00

73 lines
2.2 KiB
LLVM

; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux
; RUN: llc < %s -mtriple=x86_64-linux-gnu -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
; The HiPE compiler (i.e., the native code compiler of the Erlang/OTP system)
; adds a custom assembly prologue in order to efficiently manipulate the stack
; at runtime.
; Just to prevent the alloca from being optimized away.
declare void @dummy_use(i32*, i32)
define {i32, i32} @test_basic(i32 %hp, i32 %p) {
; X32-Linux-LABEL: test_basic:
; X32-Linux-NOT: calll inc_stack_0
; X64-Linux-LABEL: test_basic:
; X64-Linux-NOT: callq inc_stack_0
%mem = alloca i32, i32 10
call void @dummy_use (i32* %mem, i32 10)
%1 = insertvalue {i32, i32} undef, i32 %hp, 0
%2 = insertvalue {i32, i32} %1, i32 %p, 1
ret {i32, i32} %1
}
define cc 11 {i32, i32} @test_basic_hipecc(i32 %hp, i32 %p) {
; X32-Linux-LABEL: test_basic_hipecc:
; X32-Linux: leal -140(%esp), %ebx
; X32-Linux-NEXT: cmpl 120(%ebp), %ebx
; X32-Linux-NEXT: jb .LBB1_1
; X32-Linux: ret
; X32-Linux: .LBB1_1:
; X32-Linux-NEXT: calll inc_stack_0
; X64-Linux-LABEL: test_basic_hipecc:
; X64-Linux: leaq -184(%rsp), %r14
; X64-Linux-NEXT: cmpq 120(%rbp), %r14
; X64-Linux-NEXT: jb .LBB1_1
; X64-Linux: ret
; X64-Linux: .LBB1_1:
; X64-Linux-NEXT: callq inc_stack_0
%mem = alloca i32, i32 10
call void @dummy_use (i32* %mem, i32 10)
%1 = insertvalue {i32, i32} undef, i32 %hp, 0
%2 = insertvalue {i32, i32} %1, i32 %p, 1
ret {i32, i32} %2
}
define cc 11 {i32,i32,i32} @test_nocall_hipecc(i32 %hp,i32 %p,i32 %x,i32 %y) {
; X32-Linux-LABEL: test_nocall_hipecc:
; X32-Linux-NOT: calll inc_stack_0
; X64-Linux-LABEL: test_nocall_hipecc:
; X64-Linux-NOT: callq inc_stack_0
%1 = add i32 %x, %y
%2 = mul i32 42, %1
%3 = sub i32 24, %2
%4 = insertvalue {i32, i32, i32} undef, i32 %hp, 0
%5 = insertvalue {i32, i32, i32} %4, i32 %p, 1
%6 = insertvalue {i32, i32, i32} %5, i32 %p, 2
ret {i32, i32, i32} %6
}
!hipe.literals = !{ !0, !1, !2 }
!0 = !{ !"P_NSP_LIMIT", i32 120 }
!1 = !{ !"X86_LEAF_WORDS", i32 24 }
!2 = !{ !"AMD64_LEAF_WORDS", i32 18 }