Skip to content

Commit

Permalink
[AArch64][GlobalISel] Fix regbankselect for G_FCMP with vector destin…
Browse files Browse the repository at this point in the history
…ations

These should always go to a FPR, since they always use the vector registers.

Differential Revision: https://reviews.llvm.org/D100885
  • Loading branch information
Jessica Paquette committed Apr 22, 2021
1 parent 6cb7599 commit 3011aa1
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
9 changes: 7 additions & 2 deletions llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -719,10 +719,15 @@ AArch64RegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
break;
OpRegBankIdx = {PMI_FirstGPR, PMI_FirstFPR};
break;
case TargetOpcode::G_FCMP:
OpRegBankIdx = {PMI_FirstGPR,
case TargetOpcode::G_FCMP: {
// If the result is a vector, it must use a FPR.
AArch64GenRegisterBankInfo::PartialMappingIdx Idx0 =
MRI.getType(MI.getOperand(0).getReg()).isVector() ? PMI_FirstFPR
: PMI_FirstGPR;
OpRegBankIdx = {Idx0,
/* Predicate */ PMI_None, PMI_FirstFPR, PMI_FirstFPR};
break;
}
case TargetOpcode::G_BITCAST:
// This is going to be a cross register bank copy and this is expensive.
if (OpRegBankIdx[0] != OpRegBankIdx[1])
Expand Down
26 changes: 26 additions & 0 deletions llvm/test/CodeGen/AArch64/GlobalISel/regbank-fcmp.mir
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple=aarch64 -run-pass=regbankselect -verify-machineinstrs %s -o - | FileCheck %s

...
---
name: vector
legalized: true
tracksRegLiveness: true
body: |
bb.0:
liveins: $q0, $q1
; Vectors should always end up on a FPR.
; CHECK-LABEL: name: vector
; CHECK: liveins: $q0, $q1
; CHECK: %x:fpr(<2 x s64>) = COPY $q0
; CHECK: %y:fpr(<2 x s64>) = COPY $q1
; CHECK: %fcmp:fpr(<2 x s64>) = G_FCMP floatpred(olt), %x(<2 x s64>), %y
; CHECK: $q0 = COPY %fcmp(<2 x s64>)
; CHECK: RET_ReallyLR implicit $q0
%x:_(<2 x s64>) = COPY $q0
%y:_(<2 x s64>) = COPY $q1
%fcmp:_(<2 x s64>) = G_FCMP floatpred(olt), %x:_(<2 x s64>), %y:_
$q0 = COPY %fcmp
RET_ReallyLR implicit $q0
...

0 comments on commit 3011aa1

Please sign in to comment.