Skip to content

Commit c95f5bb

Browse files
authored
[AArch64][GlobalISel] Prevented llvm.aarch64.neon.saddlp/uaddlp fallback (#160883)
Prevented fallback on G_SADDLP/G_UADDLP instructions that return one-element i64 vectors, caused due to incorrect Register Bank Selection.
1 parent edb4319 commit c95f5bb

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed

llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,8 @@ bool AArch64RegisterBankInfo::onlyDefinesFP(const MachineInstr &MI,
590590
unsigned Depth) const {
591591
switch (MI.getOpcode()) {
592592
case AArch64::G_DUP:
593+
case AArch64::G_SADDLP:
594+
case AArch64::G_UADDLP:
593595
case TargetOpcode::G_SITOFP:
594596
case TargetOpcode::G_UITOFP:
595597
case TargetOpcode::G_EXTRACT_VECTOR_ELT:
@@ -798,6 +800,8 @@ AArch64RegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
798800
if (Ty.isVector())
799801
OpRegBankIdx[Idx] = PMI_FirstFPR;
800802
else if (isPreISelGenericFloatingPointOpcode(Opc) ||
803+
(MO.isDef() && onlyDefinesFP(MI, MRI, TRI)) ||
804+
(MO.isUse() && onlyUsesFP(MI, MRI, TRI)) ||
801805
Ty.getSizeInBits() > 64)
802806
OpRegBankIdx[Idx] = PMI_FirstFPR;
803807
else
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
2+
# RUN: llc -mtriple=aarch64 -run-pass=regbankselect -verify-machineinstrs %s -o - | FileCheck %s
3+
4+
---
5+
name: saddlp1d
6+
legalized: true
7+
regBankSelected: false
8+
tracksRegLiveness: true
9+
body: |
10+
bb.1.entry:
11+
liveins: $x0
12+
13+
; CHECK-LABEL: name: saddlp1d
14+
; CHECK: liveins: $x0
15+
; CHECK-NEXT: {{ $}}
16+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(p0) = COPY $x0
17+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:fpr(<2 x s32>) = G_LOAD [[COPY]](p0) :: (load (<2 x s32>))
18+
; CHECK-NEXT: [[SADDLP:%[0-9]+]]:fpr(s64) = G_SADDLP [[LOAD]]
19+
; CHECK-NEXT: $d0 = COPY [[SADDLP]](s64)
20+
; CHECK-NEXT: RET_ReallyLR implicit $d0
21+
%0:_(p0) = COPY $x0
22+
%1:_(<2 x s32>) = G_LOAD %0(p0) :: (load (<2 x s32>))
23+
%2:_(s64) = G_SADDLP %1
24+
$d0 = COPY %2(s64)
25+
RET_ReallyLR implicit $d0
26+
...
27+
---
28+
name: uaddlp1d
29+
legalized: true
30+
regBankSelected: false
31+
failedISel: false
32+
tracksRegLiveness: true
33+
body: |
34+
bb.1.entry:
35+
liveins: $x0
36+
37+
; CHECK-LABEL: name: uaddlp1d
38+
; CHECK: liveins: $x0
39+
; CHECK-NEXT: {{ $}}
40+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(p0) = COPY $x0
41+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:fpr(<2 x s32>) = G_LOAD [[COPY]](p0) :: (load (<2 x s32>))
42+
; CHECK-NEXT: [[UADDLP:%[0-9]+]]:fpr(s64) = G_UADDLP [[LOAD]]
43+
; CHECK-NEXT: $d0 = COPY [[UADDLP]](s64)
44+
; CHECK-NEXT: RET_ReallyLR implicit $d0
45+
%0:_(p0) = COPY $x0
46+
%1:_(<2 x s32>) = G_LOAD %0(p0) :: (load (<2 x s32>))
47+
%2:_(s64) = G_UADDLP %1
48+
$d0 = COPY %2(s64)
49+
RET_ReallyLR implicit $d0
50+
...

llvm/test/CodeGen/AArch64/arm64-vadd.ll

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
22
; RUN: llc < %s -mtriple=arm64-eabi | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3-
; RUN: llc < %s -mtriple=arm64-eabi -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4-
5-
; CHECK-GI: warning: Instruction selection used fallback path for saddlp1d
6-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uaddlp1d
3+
; RUN: llc < %s -mtriple=arm64-eabi -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
74

85
define <8 x i8> @addhn8b(ptr %A, ptr %B) nounwind {
96
; CHECK-LABEL: addhn8b:

0 commit comments

Comments
 (0)