Skip to content
This repository has been archived by the owner on Mar 28, 2020. It is now read-only.

Commit

Permalink
[PowerPC] Support multiple return values with fast isel
Browse files Browse the repository at this point in the history
Using an LLVM IR aggregate return value type containing three
or more integer values causes an abort in the fast isel pass.

This patch adds two more registers to RetCC_PPC64_ELF_FIS to
allow returning up to four integers with fast isel, just the
same as is currently supported with regular isel (RetCC_PPC).

This is needed for Swift and (possibly) other non-clang frontends.

Fixes PR26190.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272005 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
uweigand committed Jun 7, 2016
1 parent c1e27cc commit d7ad443
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/Target/PowerPC/PPCCallingConv.td
Expand Up @@ -112,7 +112,7 @@ def RetCC_PPC64_ELF_FIS : CallingConv<[
CCIfType<[i8], CCPromoteToType<i64>>,
CCIfType<[i16], CCPromoteToType<i64>>,
CCIfType<[i32], CCPromoteToType<i64>>,
CCIfType<[i64], CCAssignToReg<[X3, X4]>>,
CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>,
CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
CCIfType<[f32], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
Expand Down
21 changes: 21 additions & 0 deletions test/CodeGen/PowerPC/multi-return.ll
@@ -0,0 +1,21 @@
; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -O0 < %s | FileCheck %s
; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -O2 < %s | FileCheck %s

; Verify that returning multiple return values in registers works,
; both with fast-isel and regular isel.

define { i32, i32, i32, i32 } @foo() nounwind {
%A1 = insertvalue { i32, i32, i32, i32 } undef, i32 1, 0
%A2 = insertvalue { i32, i32, i32, i32 } %A1, i32 2, 1
%A3 = insertvalue { i32, i32, i32, i32 } %A2, i32 3, 2
%A4 = insertvalue { i32, i32, i32, i32 } %A3, i32 4, 3
ret { i32, i32, i32, i32 } %A4
}

; CHECK-LABEL: foo:
; CHECK: li 3, 1
; CHECK: li 4, 2
; CHECK: li 5, 3
; CHECK: li 6, 4
; CHECK: blr

0 comments on commit d7ad443

Please sign in to comment.