[llvm] [AArch64][GISel] Use Register instead of MCRegister for markPhysRegUsed in CallLowering. (PR #122853)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 13 22:19:09 PST 2025


https://github.com/topperc updated https://github.com/llvm/llvm-project/pull/122853

>From 1cfae92cc97f20f55b240808c2e899521ad9a3fa Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Mon, 13 Jan 2025 19:44:38 -0800
Subject: [PATCH 1/2] [AArch64][GISel] Use Register instead of MCRegister for
 markPhysRegUsed in CallLowering.

For "returned" attribute arguments, the physical register is a
virtual register which shouldn't be stored in MCRegister. This
moves the conversion from Register to MCRegister into the derived
classes of IncomingArgHandler. The derived class ReturnedArgCallReturnHandler
does not use the register so no MCRegister is created in that case.
---
 llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
index 15f1c99e87246b..3fceb922f35520 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
@@ -207,14 +207,14 @@ struct IncomingArgHandler : public CallLowering::IncomingValueHandler {
   /// How the physical register gets marked varies between formal
   /// parameters (it's a basic-block live-in), and a call instruction
   /// (it's an implicit-def of the BL).
-  virtual void markPhysRegUsed(MCRegister PhysReg) = 0;
+  virtual void markPhysRegUsed(Register PhysReg) = 0;
 };
 
 struct FormalArgHandler : public IncomingArgHandler {
   FormalArgHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI)
       : IncomingArgHandler(MIRBuilder, MRI) {}
 
-  void markPhysRegUsed(MCRegister PhysReg) override {
+  void markPhysRegUsed(Register PhysReg) override {
     MIRBuilder.getMRI()->addLiveIn(PhysReg);
     MIRBuilder.getMBB().addLiveIn(PhysReg);
   }
@@ -225,7 +225,7 @@ struct CallReturnHandler : public IncomingArgHandler {
                     MachineInstrBuilder MIB)
       : IncomingArgHandler(MIRBuilder, MRI), MIB(MIB) {}
 
-  void markPhysRegUsed(MCRegister PhysReg) override {
+  void markPhysRegUsed(Register PhysReg) override {
     MIB.addDef(PhysReg, RegState::Implicit);
   }
 
@@ -239,7 +239,7 @@ struct ReturnedArgCallReturnHandler : public CallReturnHandler {
                                MachineInstrBuilder MIB)
       : CallReturnHandler(MIRBuilder, MRI, MIB) {}
 
-  void markPhysRegUsed(MCRegister PhysReg) override {}
+  void markPhysRegUsed(Register PhysReg) override {}
 };
 
 struct OutgoingArgHandler : public CallLowering::OutgoingValueHandler {

>From a9214861a5b1828c2e673b7d7f9f567f03648731 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Mon, 13 Jan 2025 22:17:38 -0800
Subject: [PATCH 2/2] fixup! Use asMCReg to check the conversion from Register
 to MCRegister.

---
 llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
index 3fceb922f35520..f63d94793e8bd9 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
@@ -215,8 +215,8 @@ struct FormalArgHandler : public IncomingArgHandler {
       : IncomingArgHandler(MIRBuilder, MRI) {}
 
   void markPhysRegUsed(Register PhysReg) override {
-    MIRBuilder.getMRI()->addLiveIn(PhysReg);
-    MIRBuilder.getMBB().addLiveIn(PhysReg);
+    MIRBuilder.getMRI()->addLiveIn(PhysReg.asMCReg());
+    MIRBuilder.getMBB().addLiveIn(PhysReg.asMCReg());
   }
 };
 



More information about the llvm-commits mailing list