summaryrefslogtreecommitdiff
path: root/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp
diff options
context:
space:
mode:
authorJoel Jones <joelkevinjones@gmail.com>2017-08-05 04:30:55 +0000
committerJoel Jones <joelkevinjones@gmail.com>2017-08-05 04:30:55 +0000
commita4861e0c2b35948a206ebf150403704b718395ee (patch)
tree3ad51d1c40fe3530dbeca42b586f67b561931e07 /lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp
parentd2f3f4a06ac5ae96f421684a350756e20289797b (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.cpp112
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);