From 8d5c72d5135f9d11f2b3791c9b6cffba291a11fd Mon Sep 17 00:00:00 2001 From: Weiming Zhao Date: Thu, 23 Jul 2015 19:24:53 +0000 Subject: [PATCH] This patch eanble register coalescing to coalesce the following: %vreg2 = MOVi32imm 1; GPR32:%vreg2 %W1 = COPY %vreg2; GPR32:%vreg2 into: %W1 = MOVi32imm 1 Patched by Lawrence Hu (lawrence@codeaurora.org) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243033 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AArch64/AArch64InstrInfo.cpp | 14 ++++++++++++++ .../AArch64/arm64-coalescing-MOVi32imm.ll | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 test/CodeGen/AArch64/arm64-coalescing-MOVi32imm.ll diff --git a/lib/Target/AArch64/AArch64InstrInfo.cpp b/lib/Target/AArch64/AArch64InstrInfo.cpp index f5b0c8b450a..66b89366c2d 100644 --- a/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -533,6 +533,14 @@ void AArch64InstrInfo::insertSelect(MachineBasicBlock &MBB, CC); } +/// Returns true if a MOVi32imm or MOVi64imm can be expanded to an ORRxx. +static bool canBeExpandedToORR(const MachineInstr *MI, unsigned BitSize) { + uint64_t Imm = MI->getOperand(1).getImm(); + uint64_t UImm = Imm << (64 - BitSize) >> (64 - BitSize); + uint64_t Encoding; + return AArch64_AM::processLogicalImmediate(UImm, BitSize, Encoding); +} + // FIXME: this implementation should be micro-architecture dependent, so a // micro-architecture target hook should be introduced here in future. bool AArch64InstrInfo::isAsCheapAsAMove(const MachineInstr *MI) const { @@ -573,6 +581,12 @@ bool AArch64InstrInfo::isAsCheapAsAMove(const MachineInstr *MI) const { case AArch64::ORRWrr: case AArch64::ORRXrr: return true; + // If MOVi32imm or MOVi64imm can be expanded into ORRWri or + // ORRXri, it is as cheap as MOV + case AArch64::MOVi32imm: + return canBeExpandedToORR(MI, 32); + case AArch64::MOVi64imm: + return canBeExpandedToORR(MI, 64); } llvm_unreachable("Unknown opcode to check as cheap as a move!"); diff --git a/test/CodeGen/AArch64/arm64-coalescing-MOVi32imm.ll b/test/CodeGen/AArch64/arm64-coalescing-MOVi32imm.ll new file mode 100644 index 00000000000..2adbcdf3795 --- /dev/null +++ b/test/CodeGen/AArch64/arm64-coalescing-MOVi32imm.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s | FileCheck %s + +; CHECK: orr w0, wzr, #0x1 +; CHECK-NEXT : bl foo +; CHECK-NEXT : orr w0, wzr, #0x1 +; CHECK-NEXT : bl foo + +target triple = "aarch64--linux-android" +declare i32 @foo(i32) + +; Function Attrs: nounwind uwtable +define i32 @main() { +entry: + %call = tail call i32 @foo(i32 1) + %call1 = tail call i32 @foo(i32 1) + ret i32 0 +} + -- 2.34.1