diff --git a/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp b/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp --- a/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp +++ b/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp @@ -94,7 +94,8 @@ if (HiOp1.getTargetFlags() != ExpectedFlags) return false; - if (!(HiOp1.isGlobal() || HiOp1.isCPI()) || HiOp1.getOffset() != 0) + if (!(HiOp1.isGlobal() || HiOp1.isCPI() || HiOp1.isBlockAddress()) || + HiOp1.getOffset() != 0) return false; Register HiDestReg = Hi.getOperand(0).getReg(); @@ -108,7 +109,8 @@ const MachineOperand &LoOp2 = Lo->getOperand(2); if (Hi.getOpcode() == RISCV::LUI) { if (LoOp2.getTargetFlags() != RISCVII::MO_LO || - !(LoOp2.isGlobal() || LoOp2.isCPI()) || LoOp2.getOffset() != 0) + !(LoOp2.isGlobal() || LoOp2.isCPI() || LoOp2.isBlockAddress()) || + LoOp2.getOffset() != 0) return false; } else { assert(Hi.getOpcode() == RISCV::AUIPC); @@ -120,8 +122,10 @@ if (HiOp1.isGlobal()) { LLVM_DEBUG(dbgs() << " Found lowered global address: " << *HiOp1.getGlobal() << "\n"); - } else { - assert(HiOp1.isCPI()); + } else if (HiOp1.isBlockAddress()) { + LLVM_DEBUG(dbgs() << " Found lowered basic address: " + << *HiOp1.getBlockAddress() << "\n"); + } else if (HiOp1.isCPI()) { LLVM_DEBUG(dbgs() << " Found lowered constant pool: " << HiOp1.getIndex() << "\n"); } diff --git a/llvm/test/CodeGen/RISCV/fold-addi-loadstore.ll b/llvm/test/CodeGen/RISCV/fold-addi-loadstore.ll --- a/llvm/test/CodeGen/RISCV/fold-addi-loadstore.ll +++ b/llvm/test/CodeGen/RISCV/fold-addi-loadstore.ll @@ -471,8 +471,7 @@ ; RV32I-MEDIUM-NEXT: # %bb.1: # %label ; RV32I-MEDIUM-NEXT: .Lpcrel_hi12: ; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp0) -; RV32I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi12) -; RV32I-MEDIUM-NEXT: lw a0, 0(a0) +; RV32I-MEDIUM-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi12)(a0) ; RV32I-MEDIUM-NEXT: ret ; ; RV64I-LABEL: load_ba_1: @@ -489,8 +488,7 @@ ; RV64I-MEDIUM-NEXT: # %bb.1: # %label ; RV64I-MEDIUM-NEXT: .Lpcrel_hi12: ; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp0) -; RV64I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi12) -; RV64I-MEDIUM-NEXT: ld a0, 0(a0) +; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi12)(a0) ; RV64I-MEDIUM-NEXT: ret entry: br label %label @@ -504,9 +502,8 @@ ; RV32I: # %bb.0: # %entry ; RV32I-NEXT: .Ltmp1: # Block address taken ; RV32I-NEXT: # %bb.1: # %label -; RV32I-NEXT: lui a0, %hi(.Ltmp1) -; RV32I-NEXT: addi a0, a0, %lo(.Ltmp1) -; RV32I-NEXT: lw a0, 8(a0) +; RV32I-NEXT: lui a0, %hi(.Ltmp1+8) +; RV32I-NEXT: lw a0, %lo(.Ltmp1+8)(a0) ; RV32I-NEXT: ret ; ; RV32I-MEDIUM-LABEL: load_ba_2: @@ -514,18 +511,16 @@ ; RV32I-MEDIUM-NEXT: .Ltmp1: # Block address taken ; RV32I-MEDIUM-NEXT: # %bb.1: # %label ; RV32I-MEDIUM-NEXT: .Lpcrel_hi13: -; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1) -; RV32I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi13) -; RV32I-MEDIUM-NEXT: lw a0, 8(a0) +; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1+8) +; RV32I-MEDIUM-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi13)(a0) ; RV32I-MEDIUM-NEXT: ret ; ; RV64I-LABEL: load_ba_2: ; RV64I: # %bb.0: # %entry ; RV64I-NEXT: .Ltmp1: # Block address taken ; RV64I-NEXT: # %bb.1: # %label -; RV64I-NEXT: lui a0, %hi(.Ltmp1) -; RV64I-NEXT: addi a0, a0, %lo(.Ltmp1) -; RV64I-NEXT: ld a0, 8(a0) +; RV64I-NEXT: lui a0, %hi(.Ltmp1+8) +; RV64I-NEXT: ld a0, %lo(.Ltmp1+8)(a0) ; RV64I-NEXT: ret ; ; RV64I-MEDIUM-LABEL: load_ba_2: @@ -533,9 +528,8 @@ ; RV64I-MEDIUM-NEXT: .Ltmp1: # Block address taken ; RV64I-MEDIUM-NEXT: # %bb.1: # %label ; RV64I-MEDIUM-NEXT: .Lpcrel_hi13: -; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1) -; RV64I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi13) -; RV64I-MEDIUM-NEXT: ld a0, 8(a0) +; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1+8) +; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi13)(a0) ; RV64I-MEDIUM-NEXT: ret entry: br label %label