mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:43:36 +01:00
df85bc5230
When program is compiled for mips3 with n64 abi, wrong register class is used for creating an emergency spill slot. This patch fixes the correct register class to be chosen. This patch resolves PR35859. Thanks to John Baldwin for reporting the issue! Differential Revision: https://reviews.llvm.org/D47938 llvm-svn: 334419
97 lines
3.5 KiB
LLVM
97 lines
3.5 KiB
LLVM
; RUN: llc -march=mips64 -mcpu=mips3 < %s 2>&1 | FileCheck %s --check-prefix=CHECK
|
|
; This testcase is from PR35859.
|
|
; Check that spill slot has the correct size for mips3 and n64 ABI.
|
|
; Previously, this test case would fail during register
|
|
; scavenging due to wrong spill slot size.
|
|
|
|
; CHECK-NOT: Cannot scavenge register without an emergency spill slot!
|
|
|
|
@n = external local_unnamed_addr global i32*, align 8
|
|
|
|
define void @o(i32* nocapture readonly %a, i64* %b) local_unnamed_addr {
|
|
entry:
|
|
%0 = load i32, i32* undef, align 4
|
|
%and12 = and i32 %0, 67295
|
|
%1 = zext i32 %and12 to i64
|
|
%conv16 = sext i32 %0 to i64
|
|
%2 = ptrtoint i64* %b to i64
|
|
%mul22 = mul nsw i64 %1, %2
|
|
%mul23 = mul nsw i64 %conv16, %2
|
|
%tobool25 = icmp ne i64 %mul22, 0
|
|
%inc27 = zext i1 %tobool25 to i64
|
|
%3 = load i32*, i32** @n, align 8
|
|
%arrayidx36 = getelementptr inbounds i32, i32* %3, i64 4
|
|
store i32 0, i32* %arrayidx36, align 4
|
|
%spec.select = add i64 0, %mul23
|
|
%hi14.0 = add i64 %spec.select, %inc27
|
|
%add51 = add i64 %hi14.0, 0
|
|
%4 = load i32, i32* null, align 4
|
|
%and59 = and i32 %4, 67295
|
|
%5 = zext i32 %and59 to i64
|
|
%conv63 = sext i32 %4 to i64
|
|
%6 = load i64, i64* %b, align 8
|
|
%mul71 = mul nsw i64 %6, %5
|
|
%mul72 = mul nsw i64 %6, %conv63
|
|
%tobool74 = icmp ne i64 %mul71, 0
|
|
%inc76 = zext i1 %tobool74 to i64
|
|
%arrayidx85 = getelementptr inbounds i32, i32* %a, i64 5
|
|
%7 = load i32, i32* %arrayidx85, align 4
|
|
%and86 = and i32 %7, 67295
|
|
%conv90 = sext i32 %7 to i64
|
|
%8 = load i64, i64* undef, align 8
|
|
%mul99 = mul nsw i64 %8, %conv90
|
|
%9 = load i32, i32* undef, align 4
|
|
%and113 = and i32 %9, 67295
|
|
%tobool126 = icmp eq i32 %and113, 0
|
|
%spec.select397.v = select i1 %tobool126, i64 2, i64 3
|
|
%10 = load i32, i32* undef, align 4
|
|
%and138 = and i32 %10, 67295
|
|
%11 = zext i32 %and138 to i64
|
|
%conv142 = sext i32 %10 to i64
|
|
%12 = load i64, i64* null, align 8
|
|
%mul150 = mul nsw i64 %12, %11
|
|
%mul151 = mul nsw i64 %12, %conv142
|
|
%tobool153 = icmp ne i64 %mul150, 0
|
|
%inc155 = zext i1 %tobool153 to i64
|
|
%add157 = add nsw i64 0, %11
|
|
%spec.select398 = add i64 0, %mul72
|
|
%hi140.0 = add i64 %spec.select398, %8
|
|
%spec.select397 = add i64 %hi140.0, %mul99
|
|
%hi115.0 = add i64 %spec.select397, %inc76
|
|
%add100 = add i64 %hi115.0, 0
|
|
%spec.select396 = add i64 %add100, %12
|
|
%hi88.0 = add i64 %spec.select396, 0
|
|
%add73 = add i64 %hi88.0, %spec.select397.v
|
|
%spec.select395 = add i64 %add73, %mul151
|
|
%hi61.0 = add i64 %spec.select395, %inc155
|
|
%add83 = add i64 %hi61.0, 0
|
|
%add110 = add i64 %add83, 0
|
|
%add135 = add i64 %add110, 0
|
|
%add162 = add i64 %add135, 0
|
|
%13 = load i32, i32* null, align 4
|
|
%and165 = and i32 %13, 67295
|
|
%14 = zext i32 %and165 to i64
|
|
%conv169 = sext i32 %13 to i64
|
|
%mul175 = mul nsw i64 %14, %2
|
|
%mul176 = mul nsw i64 %conv169, %2
|
|
%tobool178 = icmp ne i64 %mul175, 0
|
|
%inc180 = zext i1 %tobool178 to i64
|
|
%add182 = sub nsw i64 0, %14
|
|
%tobool183 = icmp ne i64 %add162, %add182
|
|
%inc185 = zext i1 %tobool183 to i64
|
|
%add177 = add i64 %add51, %2
|
|
%spec.select399 = add i64 %add177, %mul176
|
|
%hi167.0 = add i64 %spec.select399, %inc180
|
|
%add187 = add i64 %hi167.0, %inc185
|
|
%tobool203 = icmp eq i32 %and86, 0
|
|
%spec.select400.v = select i1 %tobool203, i64 3, i64 4
|
|
%spec.select400 = add nsw i64 %spec.select400.v, 0
|
|
%tobool208 = icmp ne i64 %add187, 0
|
|
%inc210 = zext i1 %tobool208 to i64
|
|
%hi192.0 = add i64 %spec.select400, %add157
|
|
%add212 = add i64 %hi192.0, %inc210
|
|
%15 = inttoptr i64 %add212 to i32*
|
|
store i32* %15, i32** @n, align 8
|
|
ret void
|
|
}
|