llvm-6502/test/CodeGen/ARM/2013-04-05-Small-ByVal-Structs-PR15293.ll
Stepan Dyatkovskiy 46abfcf418 For ARM backend, fixed "byval" attribute support.
Now even the small structures could be passed within byval (small enough
to be stored in GPRs).
In regression tests next function prototypes are checked:

PR15293:
  %artz = type { i32 }
  define void @foo(%artz* byval %s)
  define void @foo2(%artz* byval %s, i32 %p, %artz* byval %s2)
foo: "s" stored in R0
foo2: "s" stored in R0, "s2" stored in R2.

Next AAPCS rules are checked:
5.5 Parameters Passing, C.4 and C.5,
"ParamSize" is parameter size in 32bit words:
-- NSAA != 0, NCRN < R4 and NCRN+ParamSize > R4.
   Parameter should be sent to the stack; NCRN := R4.
-- NSAA != 0, and NCRN < R4, NCRN+ParamSize < R4.
   Parameter stored in GPRs; NCRN += ParamSize.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181148 91177308-0d34-0410-b5e6-96231b3b80d8
2013-05-05 07:48:36 +00:00

74 lines
1.4 KiB
LLVM

;PR15293: ARM codegen ice - expected larger existing stack allocation
;RUN: llc -mtriple=arm-linux-gnueabihf < %s | FileCheck %s
;CHECK: foo:
;CHECK: sub sp, sp, #8
;CHECK: push {r11, lr}
;CHECK: str r0, [sp, #12]
;CHECK: add r0, sp, #12
;CHECK: bl fooUseParam
;CHECK: pop {r11, lr}
;CHECK: add sp, sp, #8
;CHECK: mov pc, lr
;CHECK: foo2:
;CHECK: sub sp, sp, #16
;CHECK: push {r11, lr}
;CHECK: str r0, [sp, #12]
;CHECK: add r0, sp, #12
;CHECK: str r2, [sp, #16]
;CHECK: bl fooUseParam
;CHECK: add r0, sp, #16
;CHECK: bl fooUseParam
;CHECK: pop {r11, lr}
;CHECK: add sp, sp, #16
;CHECK: mov pc, lr
;CHECK: doFoo:
;CHECK: push {r11, lr}
;CHECK: ldr r0,
;CHECK: ldr r0, [r0]
;CHECK: bl foo
;CHECK: pop {r11, lr}
;CHECK: mov pc, lr
;CHECK: doFoo2:
;CHECK: push {r11, lr}
;CHECK: ldr r0,
;CHECK: mov r1, #0
;CHECK: ldr r0, [r0]
;CHECK: mov r2, r0
;CHECK: bl foo2
;CHECK: pop {r11, lr}
;CHECK: mov pc, lr
%artz = type { i32 }
@static_val = constant %artz { i32 777 }
declare void @fooUseParam(%artz* )
define void @foo(%artz* byval %s) {
call void @fooUseParam(%artz* %s)
ret void
}
define void @foo2(%artz* byval %s, i32 %p, %artz* byval %s2) {
call void @fooUseParam(%artz* %s)
call void @fooUseParam(%artz* %s2)
ret void
}
define void @doFoo() {
call void @foo(%artz* byval @static_val)
ret void
}
define void @doFoo2() {
call void @foo2(%artz* byval @static_val, i32 0, %artz* byval @static_val)
ret void
}