[PATCH] D11467: enable coalescing of COPY and MOVi32imm
Lawrence Hu
lawrence at codeaurora.org
Thu Jul 23 10:46:14 PDT 2015
hulx2000 created this revision.
hulx2000 added reviewers: zinob, apazos, mcrosier, t.p.northover, qcolombet.
hulx2000 added a subscriber: llvm-commits.
hulx2000 set the repository for this revision to rL LLVM.
Herald added subscribers: srhines, danalbert, tberghammer.
This patch eanble register coalescing to coalesce the following:
%vreg2<def> = MOVi32imm 1; GPR32:%vreg2
%W1<def> = COPY %vreg2; GPR32:%vreg2
into:
%W1<def> = MOVi32imm 1
Repository:
rL LLVM
http://reviews.llvm.org/D11467
Files:
lib/Target/AArch64/AArch64InstrInfo.cpp
test/CodeGen/AArch64/arm64-coalescing-MOVi32imm.ll
Index: test/CodeGen/AArch64/arm64-coalescing-MOVi32imm.ll
===================================================================
--- /dev/null
+++ 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
+}
+
Index: lib/Target/AArch64/AArch64InstrInfo.cpp
===================================================================
--- lib/Target/AArch64/AArch64InstrInfo.cpp
+++ lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -533,6 +533,14 @@
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 @@
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!");
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11467.30503.patch
Type: text/x-patch
Size: 1827 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150723/3d1cdbc0/attachment.bin>
More information about the llvm-commits
mailing list