[AArch64] Set COPY ZR isAsCheapAsAMove when needed.
authorHaicheng Wu <haicheng@codeaurora.org>
Fri, 15 Jul 2016 00:27:01 +0000 (00:27 +0000)
committerHaicheng Wu <haicheng@codeaurora.org>
Fri, 15 Jul 2016 00:27:01 +0000 (00:27 +0000)
If a subtarget has both ZCZeroing and CustomCheapAsMoveHandling features (now
only Kryo has both), set COPY (W|X)ZR isAsCheapAsAMove.

Differential Revision: http://reviews.llvm.org/D22360

llvm-svn: 275503

llvm/lib/Target/AArch64/AArch64InstrInfo.cpp

index 90d7df0..04fe3af 100644 (file)
@@ -624,11 +624,15 @@ bool AArch64InstrInfo::isAsCheapAsAMove(const MachineInstr &MI) const {
   case AArch64::MOVi64imm:
     return canBeExpandedToORR(MI, 64);
 
-  // It is cheap to move #0 to float registers if the subtarget has 
-  // ZeroCycleZeroing feature.
+  // It is cheap to zero out registers if the subtarget has ZeroCycleZeroing
+  // feature.
   case AArch64::FMOVS0:
   case AArch64::FMOVD0:
     return Subtarget.hasZeroCycleZeroing();
+  case TargetOpcode::COPY:
+    return (Subtarget.hasZeroCycleZeroing() &&
+            (MI.getOperand(1).getReg() == AArch64::WZR ||
+             MI.getOperand(1).getReg() == AArch64::XZR));
   }
 
   llvm_unreachable("Unknown opcode to check as cheap as a move!");