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"
6061
6162using 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+
6680static 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