mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-18 17:39:04 +00:00
Allow AArch64FastISel to degrade graceully in the presence of an MVT::i128
Currently AArch64FastISel crashes if it tries to extend an integer into an MVT::i128. This can happen by creating 128 bit integers like so: typedef unsigned int uint128_t __attribute__((mode(TI))); typedef int sint128_t __attribute__((mode(TI))); This patch makes EmitIntExt check for their presence and then falls back to SelectionDAG. Tests included. rdar://17516686 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212492 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
80c193dec7
commit
e7f8191b18
@ -1750,6 +1750,12 @@ unsigned AArch64FastISel::Emiti1Ext(unsigned SrcReg, MVT DestVT, bool isZExt) {
|
|||||||
unsigned AArch64FastISel::EmitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
|
unsigned AArch64FastISel::EmitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
|
||||||
bool isZExt) {
|
bool isZExt) {
|
||||||
assert(DestVT != MVT::i1 && "ZeroExt/SignExt an i1?");
|
assert(DestVT != MVT::i1 && "ZeroExt/SignExt an i1?");
|
||||||
|
|
||||||
|
// FastISel does not have plumbing to deal with an MVT::i128, if we see one
|
||||||
|
// so rather than return one we need to bail out to SelectionDAG.
|
||||||
|
if (DestVT == MVT::i128)
|
||||||
|
return 0;
|
||||||
|
|
||||||
unsigned Opc;
|
unsigned Opc;
|
||||||
unsigned Imm = 0;
|
unsigned Imm = 0;
|
||||||
|
|
||||||
|
18
test/CodeGen/AArch64/i128-fast-isel-fallback.ll
Normal file
18
test/CodeGen/AArch64/i128-fast-isel-fallback.ll
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
; RUN: llc -O0 -mtriple=arm64-apple-ios7.0 -mcpu=generic < %s | FileCheck %s
|
||||||
|
|
||||||
|
; Function Attrs: nounwind ssp
|
||||||
|
define void @test1() {
|
||||||
|
%1 = sext i32 0 to i128
|
||||||
|
call void @test2(i128 %1)
|
||||||
|
ret void
|
||||||
|
|
||||||
|
; The i128 is 0 so the we can test to make sure it is propogated into the x
|
||||||
|
; registers that make up the i128 pair
|
||||||
|
|
||||||
|
; CHECK: mov x0, xzr
|
||||||
|
; CHECK: mov x1, x0
|
||||||
|
; CHECK: bl _test2
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @test2(i128)
|
Loading…
Reference in New Issue
Block a user