Skip to content

Commit e799ce2

Browse files
committed
[AArch64] Add zero cycle register move statistics
This patch adds zero cycle register move counters per register class, which improves the visiblity of this aspect of lowering at compile time.
1 parent f223411 commit e799ce2

File tree

1 file changed

+48
-2
lines changed

1 file changed

+48
-2
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.cpp

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "llvm/ADT/ArrayRef.h"
2222
#include "llvm/ADT/STLExtras.h"
2323
#include "llvm/ADT/SmallVector.h"
24+
#include "llvm/ADT/Statistic.h"
2425
#include "llvm/CodeGen/CFIInstBuilder.h"
2526
#include "llvm/CodeGen/LivePhysRegs.h"
2627
#include "llvm/CodeGen/MachineBasicBlock.h"
@@ -60,9 +61,22 @@
6061

6162
using namespace llvm;
6263

64+
#define DEBUG_TYPE "aarch64-instr-info"
65+
6366
#define GET_INSTRINFO_CTOR_DTOR
6467
#include "AArch64GenInstrInfo.inc"
6568

69+
STATISTIC(NumZeroCycleRegMoveGPR32,
70+
"Number of lowered zero cycle register moves of GPR32 class");
71+
STATISTIC(NumZeroCycleRegMoveGPR64,
72+
"Number of lowered zero cycle register moves of GPR64 class");
73+
STATISTIC(NumZeroCycleRegMoveFPR128,
74+
"Number of lowered zero cycle register moves of FPR128 class");
75+
STATISTIC(NumZeroCycleRegMoveFPR64,
76+
"Number of lowered zero cycle register moves of FPR64 class");
77+
STATISTIC(NumZeroCycleRegMoveFPR32,
78+
"Number of lowered zero cycle register moves of FPR32 class");
79+
6680
static cl::opt<unsigned>
6781
CBDisplacementBits("aarch64-cb-offset-bits", cl::Hidden, cl::init(9),
6882
cl::desc("Restrict range of CB instructions (DEBUG)"));
@@ -5061,11 +5075,15 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
50615075
.addImm(0)
50625076
.addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0))
50635077
.addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
5078+
++NumZeroCycleRegMoveGPR64;
50645079
} else {
50655080
BuildMI(MBB, I, DL, get(AArch64::ADDWri), DestReg)
50665081
.addReg(SrcReg, getKillRegState(KillSrc))
50675082
.addImm(0)
50685083
.addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
5084+
if (Subtarget.hasZeroCycleRegMoveGPR32()) {
5085+
++NumZeroCycleRegMoveGPR32;
5086+
}
50695087
}
50705088
} else if (SrcReg == AArch64::WZR && Subtarget.hasZeroCycleZeroingGP()) {
50715089
BuildMI(MBB, I, DL, get(AArch64::MOVZWi), DestReg)
@@ -5087,11 +5105,15 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
50875105
.addReg(AArch64::XZR)
50885106
.addReg(SrcRegX, RegState::Undef)
50895107
.addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
5108+
++NumZeroCycleRegMoveGPR64;
50905109
} else {
50915110
// Otherwise, expand to ORR WZR.
50925111
BuildMI(MBB, I, DL, get(AArch64::ORRWrr), DestReg)
50935112
.addReg(AArch64::WZR)
50945113
.addReg(SrcReg, getKillRegState(KillSrc));
5114+
if (Subtarget.hasZeroCycleRegMoveGPR32()) {
5115+
++NumZeroCycleRegMoveGPR32;
5116+
}
50955117
}
50965118
}
50975119
return;
@@ -5189,6 +5211,9 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
51895211
.addReg(SrcReg, getKillRegState(KillSrc))
51905212
.addImm(0)
51915213
.addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
5214+
if (Subtarget.hasZeroCycleRegMoveGPR64()) {
5215+
++NumZeroCycleRegMoveGPR64;
5216+
}
51925217
} else if (SrcReg == AArch64::XZR && Subtarget.hasZeroCycleZeroingGP()) {
51935218
BuildMI(MBB, I, DL, get(AArch64::MOVZXi), DestReg)
51945219
.addImm(0)
@@ -5198,6 +5223,9 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
51985223
BuildMI(MBB, I, DL, get(AArch64::ORRXrr), DestReg)
51995224
.addReg(AArch64::XZR)
52005225
.addReg(SrcReg, getKillRegState(KillSrc));
5226+
if (Subtarget.hasZeroCycleRegMoveGPR64()) {
5227+
++NumZeroCycleRegMoveGPR64;
5228+
}
52015229
}
52025230
return;
52035231
}
@@ -5284,11 +5312,14 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
52845312
.addReg(AArch64::Z0 + (DestReg - AArch64::Q0), RegState::Define)
52855313
.addReg(AArch64::Z0 + (SrcReg - AArch64::Q0))
52865314
.addReg(AArch64::Z0 + (SrcReg - AArch64::Q0));
5287-
else if (Subtarget.isNeonAvailable())
5315+
else if (Subtarget.isNeonAvailable()) {
52885316
BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
52895317
.addReg(SrcReg)
52905318
.addReg(SrcReg, getKillRegState(KillSrc));
5291-
else {
5319+
// if (Subtarget.hasZeroCycleRegMoveFPR128()) { need rebase
5320+
++NumZeroCycleRegMoveFPR128;
5321+
// }
5322+
} else {
52925323
BuildMI(MBB, I, DL, get(AArch64::STRQpre))
52935324
.addReg(AArch64::SP, RegState::Define)
52945325
.addReg(SrcReg, getKillRegState(KillSrc))
@@ -5307,6 +5338,9 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
53075338
AArch64::FPR64RegClass.contains(SrcReg)) {
53085339
BuildMI(MBB, I, DL, get(AArch64::FMOVDr), DestReg)
53095340
.addReg(SrcReg, getKillRegState(KillSrc));
5341+
if (Subtarget.hasZeroCycleRegMoveFPR64()) {
5342+
++NumZeroCycleRegMoveFPR64;
5343+
}
53105344
return;
53115345
}
53125346

@@ -5326,9 +5360,13 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
53265360
BuildMI(MBB, I, DL, get(AArch64::FMOVDr), DestRegD)
53275361
.addReg(SrcRegD, RegState::Undef)
53285362
.addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
5363+
++NumZeroCycleRegMoveFPR64;
53295364
} else {
53305365
BuildMI(MBB, I, DL, get(AArch64::FMOVSr), DestReg)
53315366
.addReg(SrcReg, getKillRegState(KillSrc));
5367+
if (Subtarget.hasZeroCycleRegMoveFPR32()) {
5368+
++NumZeroCycleRegMoveFPR32;
5369+
}
53325370
}
53335371
return;
53345372
}
@@ -5349,13 +5387,17 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
53495387
BuildMI(MBB, I, DL, get(AArch64::FMOVDr), DestRegD)
53505388
.addReg(SrcRegD, RegState::Undef)
53515389
.addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
5390+
++NumZeroCycleRegMoveFPR64;
53525391
} else {
53535392
DestReg = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
53545393
&AArch64::FPR32RegClass);
53555394
SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
53565395
&AArch64::FPR32RegClass);
53575396
BuildMI(MBB, I, DL, get(AArch64::FMOVSr), DestReg)
53585397
.addReg(SrcReg, getKillRegState(KillSrc));
5398+
if (Subtarget.hasZeroCycleRegMoveFPR32()) {
5399+
++NumZeroCycleRegMoveFPR32;
5400+
}
53595401
}
53605402
return;
53615403
}
@@ -5376,13 +5418,17 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
53765418
BuildMI(MBB, I, DL, get(AArch64::FMOVDr), DestRegD)
53775419
.addReg(SrcRegD, RegState::Undef)
53785420
.addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
5421+
++NumZeroCycleRegMoveFPR64;
53795422
} else {
53805423
DestReg = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
53815424
&AArch64::FPR32RegClass);
53825425
SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
53835426
&AArch64::FPR32RegClass);
53845427
BuildMI(MBB, I, DL, get(AArch64::FMOVSr), DestReg)
53855428
.addReg(SrcReg, getKillRegState(KillSrc));
5429+
if (Subtarget.hasZeroCycleRegMoveFPR32()) {
5430+
++NumZeroCycleRegMoveFPR32;
5431+
}
53865432
}
53875433
return;
53885434
}

0 commit comments

Comments
 (0)