[llvm] a6c3ccd - [RISCV] Be more strict about LUI+ADDI macrofusion pre-RA.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 21 11:44:13 PDT 2022


Author: Craig Topper
Date: 2022-08-21T10:58:15-07:00
New Revision: a6c3ccd476d43305fc91f56c8066f913110ce078

URL: https://github.com/llvm/llvm-project/commit/a6c3ccd476d43305fc91f56c8066f913110ce078
DIFF: https://github.com/llvm/llvm-project/commit/a6c3ccd476d43305fc91f56c8066f913110ce078.diff

LOG: [RISCV] Be more strict about LUI+ADDI macrofusion pre-RA.

Don't macrofuse if the LUI has more than 1 user. That will likely
require the LUI to have a different destination register post-RA.
LUI+ADDI can only be fused if they write the same register.

Added: 
    

Modified: 
    llvm/lib/Target/RISCV/RISCVMacroFusion.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/RISCV/RISCVMacroFusion.cpp b/llvm/lib/Target/RISCV/RISCVMacroFusion.cpp
index 3b9177bc1635b..232f202f18159 100644
--- a/llvm/lib/Target/RISCV/RISCVMacroFusion.cpp
+++ b/llvm/lib/Target/RISCV/RISCVMacroFusion.cpp
@@ -45,9 +45,15 @@ static bool isLUIADDI(const MachineInstr *FirstMI,
   if (SecondMI.getOperand(1).getReg() != FirstDest)
     return false;
 
+  // If the input is virtual make sure this is the only user.
+  if (FirstDest.isVirtual()) {
+    auto &MRI = SecondMI.getMF()->getRegInfo();
+    return MRI.hasOneNonDBGUse(FirstDest);
+  }
+
   // If the FirstMI destination is non-virtual, it should match the SecondMI
   // destination.
-  return FirstDest.isVirtual() || SecondMI.getOperand(0).getReg() == FirstDest;
+  return SecondMI.getOperand(0).getReg() == FirstDest;
 }
 
 static bool shouldScheduleAdjacent(const TargetInstrInfo &TII,


        


More information about the llvm-commits mailing list