[Hexagon] Handle returning small structures by value

This is compliant with the official ABI, but allows experimentation with
calling conventions.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275822 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Krzysztof Parzyszek 2016-07-18 17:30:41 +00:00
parent f94271deae
commit 4cb51c5c01
2 changed files with 25 additions and 1 deletions

View File

@ -447,7 +447,13 @@ static bool RetCC_Hexagon32(unsigned ValNo, MVT ValVT,
MVT LocVT, CCValAssign::LocInfo LocInfo,
ISD::ArgFlagsTy ArgFlags, CCState &State) {
if (LocVT == MVT::i32 || LocVT == MVT::f32) {
if (unsigned Reg = State.AllocateReg(Hexagon::R0)) {
// Note that use of registers beyond R1 is not ABI compliant. However there
// are (experimental) IR passes which generate internal functions that
// return structs using these additional registers.
static const uint16_t RegList[] = { Hexagon::R0, Hexagon::R1,
Hexagon::R2, Hexagon::R3,
Hexagon::R4, Hexagon::R5};
if (unsigned Reg = State.AllocateReg(RegList)) {
State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
return false;
}

View File

@ -0,0 +1,18 @@
; RUN: llc -march=hexagon < %s | FileCheck %s
; CHECK: r0 = add(r0, r1)
; Allow simple structures to be returned by value.
%s = type { i32, i32 }
declare %s @foo() #0
define i32 @fred() #0 {
%t0 = call %s @foo()
%x = extractvalue %s %t0, 0
%y = extractvalue %s %t0, 1
%r = add i32 %x, %y
ret i32 %r
}
attributes #0 = { nounwind }