[PowerPC] Support multiple return values with fast isel

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
This commit is contained in:
Ulrich Weigand 2016-06-07 12:48:22 +00:00
parent c1e27cc453
commit d7ad443387
2 changed files with 22 additions and 1 deletions

View File

@ -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]>>,

View File

@ -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