[llvm] [AArch64] Consider COPY between disjoint register classes as expensive (PR #167661)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 12 03:39:37 PST 2025
================
@@ -0,0 +1,49 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -mtriple=aarch64 -run-pass=early-machinelicm -o - %s | FileCheck %s
+
+# This test verifies that cross-register-class copies (e.g., between GPR and FPR)
+# are hoisted out of loops by MachineLICM, as they translate to expensive
+# instructions like FMOV (2-6 cycles) on AArch64.
+
+--- |
+ define void @cross_regclass_copy_hoisted() {
+ ret void
+ }
+...
+---
+name: cross_regclass_copy_hoisted
+tracksRegLiveness: true
+body: |
+ ; CHECK-LABEL: name: cross_regclass_copy_hoisted
+ ; CHECK: bb.0:
+ ; CHECK-NEXT: successors: %bb.1(0x80000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 2143289344
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY [[MOVi32imm]]
+ ; CHECK-NEXT: [[FMOVS0_:%[0-9]+]]:fpr32 = FMOVS0
+ ; CHECK-NEXT: B %bb.1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.1:
+ ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: FCMPSrr [[COPY]], [[FMOVS0_]], implicit-def $nzcv, implicit $fpcr
+ ; CHECK-NEXT: Bcc 11, %bb.1, implicit $nzcv
+ ; CHECK-NEXT: B %bb.2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.2:
+ ; CHECK-NEXT: RET_ReallyLR
+ bb.0:
+ B %bb.1
+
+ bb.1:
+ ; High latency copy.
+ %0:gpr32 = MOVi32imm 2143289344
+ %1:fpr32 = COPY %0:gpr32
+ %2:fpr32 = FMOVS0
----------------
fhahn wrote:
Could you also add a test for a physical register?
https://github.com/llvm/llvm-project/pull/167661
More information about the llvm-commits
mailing list