From: Craig Topper Date: Tue, 20 Dec 2022 15:05:37 +0000 (-0800) Subject: [RISCV] Teach RISCVMergeBaseOffset to handle constant pools. X-Git-Tag: upstream/17.0.6~23108 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4a2e7da3ce3e8b6fa8d7d886be441dda42c18265;p=platform%2Fupstream%2Fllvm.git [RISCV] Teach RISCVMergeBaseOffset to handle constant pools. 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. Reviewed By: asb Differential Revision: https://reviews.llvm.org/D140341 --- diff --git a/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp b/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp index da1ada1..1436d3c 100644 --- a/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp +++ b/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp @@ -84,22 +84,23 @@ INITIALIZE_PASS(RISCVMergeBaseOffsetOpt, DEBUG_TYPE, // 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 @@ bool RISCVMergeBaseOffsetOpt::detectFoldable(MachineInstr &Hi, 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 @@ bool RISCVMergeBaseOffsetOpt::runOnMachineFunction(MachineFunction &Fn) { 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); } diff --git a/llvm/test/CodeGen/RISCV/codemodel-lowering.ll b/llvm/test/CodeGen/RISCV/codemodel-lowering.ll index a485660a..af66116 100644 --- a/llvm/test/CodeGen/RISCV/codemodel-lowering.ll +++ b/llvm/test/CodeGen/RISCV/codemodel-lowering.ll @@ -133,8 +133,7 @@ define float @lower_constantpool(float %a) nounwind { ; 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