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

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 23 17:32:27 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) || MI.modifiesRegister(Reg, TRI))
----------------
MatzeB wrote:

A `readsRegister` check should be enough I think? I guess you could technically have a "use" by having a subregister def, but for that to make sense we would either need to have another real use within the sequence that will get catched by `MI::readsRegister` anyway or the operands cannot have been a `kill` in the first place.

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


More information about the llvm-commits mailing list