diff options
author | Joel Jones <joelkevinjones@gmail.com> | 2017-08-05 04:30:55 +0000 |
---|---|---|
committer | Joel Jones <joelkevinjones@gmail.com> | 2017-08-05 04:30:55 +0000 |
commit | a4861e0c2b35948a206ebf150403704b718395ee (patch) | |
tree | 3ad51d1c40fe3530dbeca42b586f67b561931e07 /lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp | |
parent | d2f3f4a06ac5ae96f421684a350756e20289797b (diff) |
[AArch64] LSE Atomics reorg - part 1
Add memory synchronization semantics to LSE Atomics.
The memory semantics feature will be added in a subsequent patch.
In this patch, several corrections were added to the existing LSE Atomics
implementation, based on the ARM Errata D11904 from 05/12/2017.
Patch by: steleman
Differential Revision: https://reviews.llvm.org/D35319
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310167 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp')
-rw-r--r-- | lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp | 112 |
1 files changed, 64 insertions, 48 deletions
diff --git a/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp b/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp index 64ea76dbeb7..5d8b4b69593 100644 --- a/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp +++ b/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp @@ -55,6 +55,8 @@ public: AU.setPreservesCFG(); MachineFunctionPass::getAnalysisUsage(AU); } + + bool shouldSkip(const MachineInstr &MI, const MachineFunction &MF) const; }; char AArch64DeadRegisterDefinitions::ID = 0; } // end anonymous namespace @@ -69,6 +71,63 @@ static bool usesFrameIndex(const MachineInstr &MI) { return false; } +bool +AArch64DeadRegisterDefinitions::shouldSkip(const MachineInstr &MI, + const MachineFunction &MF) const { + if (!MF.getSubtarget<AArch64Subtarget>().hasLSE()) + return false; + +#define CASE_AARCH64_ATOMIC_(PREFIX) \ + case AArch64::PREFIX##X: \ + case AArch64::PREFIX##W: \ + case AArch64::PREFIX##H: \ + case AArch64::PREFIX##B + + for (const MachineMemOperand *MMO : MI.memoperands()) { + if (MMO->isAtomic()) { + unsigned Opcode = MI.getOpcode(); + switch (Opcode) { + default: + return false; + break; + + CASE_AARCH64_ATOMIC_(LDADDA): + CASE_AARCH64_ATOMIC_(LDADDAL): + + CASE_AARCH64_ATOMIC_(LDCLRA): + CASE_AARCH64_ATOMIC_(LDCLRAL): + + CASE_AARCH64_ATOMIC_(LDEORA): + CASE_AARCH64_ATOMIC_(LDEORAL): + + CASE_AARCH64_ATOMIC_(LDSETA): + CASE_AARCH64_ATOMIC_(LDSETAL): + + CASE_AARCH64_ATOMIC_(LDSMAXA): + CASE_AARCH64_ATOMIC_(LDSMAXAL): + + CASE_AARCH64_ATOMIC_(LDSMINA): + CASE_AARCH64_ATOMIC_(LDSMINAL): + + CASE_AARCH64_ATOMIC_(LDUMAXA): + CASE_AARCH64_ATOMIC_(LDUMAXAL): + + CASE_AARCH64_ATOMIC_(LDUMINA): + CASE_AARCH64_ATOMIC_(LDUMINAL): + + CASE_AARCH64_ATOMIC_(SWPA): + CASE_AARCH64_ATOMIC_(SWPAL): + return true; + break; + } + } + } + +#undef CASE_AARCH64_ATOMIC_ + + return false; +} + void AArch64DeadRegisterDefinitions::processMachineBasicBlock( MachineBasicBlock &MBB) { const MachineFunction &MF = *MBB.getParent(); @@ -86,55 +145,12 @@ void AArch64DeadRegisterDefinitions::processMachineBasicBlock( DEBUG(dbgs() << " Ignoring, XZR or WZR already used by the instruction\n"); continue; } - if (MF.getSubtarget<AArch64Subtarget>().hasLSE()) { - // XZ/WZ for LSE can only be used when acquire semantics are not used, - // LDOPAL WZ is an invalid opcode. - switch (MI.getOpcode()) { - case AArch64::CASALB: - case AArch64::CASALH: - case AArch64::CASALW: - case AArch64::CASALX: - case AArch64::SWPALB: - case AArch64::SWPALH: - case AArch64::SWPALW: - case AArch64::SWPALX: - case AArch64::LDADDALB: - case AArch64::LDADDALH: - case AArch64::LDADDALW: - case AArch64::LDADDALX: - case AArch64::LDCLRALB: - case AArch64::LDCLRALH: - case AArch64::LDCLRALW: - case AArch64::LDCLRALX: - case AArch64::LDEORALB: - case AArch64::LDEORALH: - case AArch64::LDEORALW: - case AArch64::LDEORALX: - case AArch64::LDSETALB: - case AArch64::LDSETALH: - case AArch64::LDSETALW: - case AArch64::LDSETALX: - case AArch64::LDSMINALB: - case AArch64::LDSMINALH: - case AArch64::LDSMINALW: - case AArch64::LDSMINALX: - case AArch64::LDSMAXALB: - case AArch64::LDSMAXALH: - case AArch64::LDSMAXALW: - case AArch64::LDSMAXALX: - case AArch64::LDUMINALB: - case AArch64::LDUMINALH: - case AArch64::LDUMINALW: - case AArch64::LDUMINALX: - case AArch64::LDUMAXALB: - case AArch64::LDUMAXALH: - case AArch64::LDUMAXALW: - case AArch64::LDUMAXALX: - continue; - default: - break; - } + + if (shouldSkip(MI, MF)) { + DEBUG(dbgs() << " Ignoring, Atomic instruction with acquire semantics using WZR/XZR\n"); + continue; } + const MCInstrDesc &Desc = MI.getDesc(); for (int I = 0, E = Desc.getNumDefs(); I != E; ++I) { MachineOperand &MO = MI.getOperand(I); |