summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-04-13 16:25:39 +0000
committerTim Northover <tnorthover@apple.com>2016-04-13 16:25:39 +0000
commitb8a1ecfc62dc36cc7cc736e0c29493f276d4620e (patch)
tree0f838da11988c8af73b411af2fa4db57dd0b571e /llvm/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp
parenteb4d5a9b0b30d6754e5308dc3650ffe609cc1d07 (diff)
downloadbcm5719-llvm-b8a1ecfc62dc36cc7cc736e0c29493f276d4620e.tar.gz
bcm5719-llvm-b8a1ecfc62dc36cc7cc736e0c29493f276d4620e.zip
AArch64: don't create instructions that write to xzr/wzr twice.
These are unpredictable even on AArch64. Patch by Yichao Yu. llvm-svn: 266206
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp')
-rw-r--r--llvm/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp b/llvm/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp
index fe850ecd140..54825c427a6 100644
--- a/llvm/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp
+++ b/llvm/lib/Target/AArch64/AArch64DeadRegisterDefinitionsPass.cpp
@@ -93,6 +93,12 @@ bool AArch64DeadRegisterDefinitions::processMachineBasicBlock(
DEBUG(dbgs() << " Ignoring, operand is frame index\n");
continue;
}
+ if (MI.definesRegister(AArch64::XZR) || MI.definesRegister(AArch64::WZR)) {
+ // It is not allowed to write to the same register (not even the zero
+ // register) twice in a single instruction.
+ DEBUG(dbgs() << " Ignoring, XZR or WZR already used by the instruction\n");
+ continue;
+ }
for (int i = 0, e = MI.getDesc().getNumDefs(); i != e; ++i) {
MachineOperand &MO = MI.getOperand(i);
if (MO.isReg() && MO.isDead() && MO.isDef()) {
@@ -128,6 +134,8 @@ bool AArch64DeadRegisterDefinitions::processMachineBasicBlock(
MO.setReg(NewReg);
DEBUG(MI.print(dbgs()));
++NumDeadDefsReplaced;
+ // Only replace one dead register, see check for zero register above.
+ break;
}
}
}
OpenPOWER on IntegriCloud