[PATCH] D140341: [RISCV] Teach RISCVMergeBaseOffset to handle constant pools.

Craig Topper via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 19 12:47:36 PST 2022


craig.topper created this revision.
craig.topper added reviewers: asb, luismarques, jrtc27, kito-cheng.
Herald added subscribers: sunshaoce, VincentWu, StephenFan, vkmr, frasercrmck, evandro, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, shiva0217, niosHD, sabuasal, simoncook, johnrusso, rbar, hiraditya, arichardson.
Herald added a project: All.
craig.topper requested review of this revision.
Herald added subscribers: pcwang-thead, eopXD, MaskRay.
Herald added a project: LLVM.

Primarily this allows us to fold the addi from PseudoLLA expansion
into a load.

If the linker is able to GP relax the constant pool access we'll
end up with a GP relative load.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D140341

Files:
  llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
  llvm/test/CodeGen/RISCV/codemodel-lowering.ll


Index: llvm/test/CodeGen/RISCV/codemodel-lowering.ll
===================================================================
--- llvm/test/CodeGen/RISCV/codemodel-lowering.ll
+++ llvm/test/CodeGen/RISCV/codemodel-lowering.ll
@@ -133,8 +133,7 @@
 ; RV32I-MEDIUM:       # %bb.0:
 ; RV32I-MEDIUM-NEXT:  .Lpcrel_hi3:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.LCPI3_0)
-; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi3)
-; RV32I-MEDIUM-NEXT:    flw ft0, 0(a0)
+; RV32I-MEDIUM-NEXT:    flw ft0, %pcrel_lo(.Lpcrel_hi3)(a0)
 ; RV32I-MEDIUM-NEXT:    fadd.s fa0, fa0, ft0
 ; RV32I-MEDIUM-NEXT:    ret
   %1 = fadd float %a, 1.0
Index: llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
+++ llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
@@ -84,22 +84,23 @@
 // The pattern is only accepted if:
 //    1) The first instruction has only one use, which is the ADDI.
 //    2) The address operands have the appropriate type, reflecting the
-//       lowering of a global address using medlow or medany.
-//    3) The offset value in the Global Address is 0.
+//       lowering of a global address or constant pool using medlow or medany.
+//    3) The offset value in the Global Address or Constant Pool is 0.
 bool RISCVMergeBaseOffsetOpt::detectFoldable(MachineInstr &Hi,
                                              MachineInstr *&Lo) {
   if (Hi.getOpcode() == RISCV::LUI) {
     Register HiDestReg = Hi.getOperand(0).getReg();
     const MachineOperand &HiOp1 = Hi.getOperand(1);
-    if (HiOp1.getTargetFlags() != RISCVII::MO_HI || !HiOp1.isGlobal() ||
-        HiOp1.getOffset() != 0 || !MRI->hasOneUse(HiDestReg))
+    if (HiOp1.getTargetFlags() != RISCVII::MO_HI ||
+        !(HiOp1.isGlobal() || HiOp1.isCPI()) || HiOp1.getOffset() != 0 ||
+        !MRI->hasOneUse(HiDestReg))
       return false;
     Lo = &*MRI->use_instr_begin(HiDestReg);
     if (Lo->getOpcode() != RISCV::ADDI)
       return false;
     const MachineOperand &LoOp2 = Lo->getOperand(2);
-    if (LoOp2.getTargetFlags() != RISCVII::MO_LO || !LoOp2.isGlobal() ||
-        LoOp2.getOffset() != 0)
+    if (LoOp2.getTargetFlags() != RISCVII::MO_LO ||
+        !(LoOp2.isGlobal() || LoOp2.isCPI()) || LoOp2.getOffset() != 0)
       return false;
     return true;
   }
@@ -107,8 +108,9 @@
   if (Hi.getOpcode() == RISCV::AUIPC) {
     Register HiDestReg = Hi.getOperand(0).getReg();
     const MachineOperand &HiOp1 = Hi.getOperand(1);
-    if (HiOp1.getTargetFlags() != RISCVII::MO_PCREL_HI || !HiOp1.isGlobal() ||
-        HiOp1.getOffset() != 0 || !MRI->hasOneUse(HiDestReg))
+    if (HiOp1.getTargetFlags() != RISCVII::MO_PCREL_HI ||
+        !(HiOp1.isGlobal() || HiOp1.isCPI()) || HiOp1.getOffset() != 0 ||
+        !MRI->hasOneUse(HiDestReg))
       return false;
     Lo = &*MRI->use_instr_begin(HiDestReg);
     if (Lo->getOpcode() != RISCV::ADDI)
@@ -432,8 +434,14 @@
       MachineInstr *Lo = nullptr;
       if (!detectFoldable(Hi, Lo))
         continue;
-      LLVM_DEBUG(dbgs() << "  Found lowered global address: "
-                        << *Hi.getOperand(1).getGlobal() << "\n");
+      if (Hi.getOperand(1).isGlobal()) {
+        LLVM_DEBUG(dbgs() << "  Found lowered global address: "
+                          << *Hi.getOperand(1).getGlobal() << "\n");
+      } else {
+        assert(Hi.getOperand(1).isCPI());
+        LLVM_DEBUG(dbgs() << "  Found lowered constant pool: "
+                          << Hi.getOperand(1).getIndex() << "\n");
+      }
       MadeChange |= detectAndFoldOffset(Hi, *Lo);
       MadeChange |= foldIntoMemoryOps(Hi, *Lo);
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140341.484043.patch
Type: text/x-patch
Size: 3672 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221219/e8a88985/attachment.bin>


More information about the llvm-commits mailing list