[llvm] [AArch64] Only clear kill flags if necessary when merging str (PR #69680)

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 1 11:46:04 PDT 2023


================
@@ -997,8 +997,17 @@ AArch64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
       //   STRWui %w0, ...
       //   USE %w1
       //   STRWui kill %w1  ; need to clear kill flag when moving STRWui upwards
-      RegOp0.setIsKill(false);
-      RegOp1.setIsKill(false);
+      for (auto It = std::next(I);
+           It != Paired && (RegOp0.isKill() || RegOp1.isKill()); ++It) {
+        auto ClearKill = [](MachineInstr &MI, MachineOperand &MOP,
+                            const TargetRegisterInfo *TRI) {
+          Register Reg = MOP.getReg();
+          if (MI.readsRegister(Reg, TRI))
+            MOP.setIsKill(false);
+        };
+        ClearKill(*It, RegOp0, TRI);
----------------
MatzeB wrote:

It's been a while since I worked on this, so I hope I am not missing anything. But intuitively you would only need to change the flags for operands that you move around the schedule (as in conceptually you are moving one store next to the other store before replacing it with the `strd`).

https://github.com/llvm/llvm-project/pull/69680


More information about the llvm-commits mailing list