Skip to content

Commit cedf2ea

Browse files
committed
[RISCV] Teach RISCVMergeBaseOffset to handle BlockAddress
We can get `BlockAddress` in user code via `Labels as Values` so we should be able to merge the access to `BlockAddress`. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D159429
1 parent 28efe4d commit cedf2ea

File tree

2 files changed

+18
-20
lines changed

2 files changed

+18
-20
lines changed

llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ bool RISCVMergeBaseOffsetOpt::detectFoldable(MachineInstr &Hi,
9494
if (HiOp1.getTargetFlags() != ExpectedFlags)
9595
return false;
9696

97-
if (!(HiOp1.isGlobal() || HiOp1.isCPI()) || HiOp1.getOffset() != 0)
97+
if (!(HiOp1.isGlobal() || HiOp1.isCPI() || HiOp1.isBlockAddress()) ||
98+
HiOp1.getOffset() != 0)
9899
return false;
99100

100101
Register HiDestReg = Hi.getOperand(0).getReg();
@@ -108,7 +109,8 @@ bool RISCVMergeBaseOffsetOpt::detectFoldable(MachineInstr &Hi,
108109
const MachineOperand &LoOp2 = Lo->getOperand(2);
109110
if (Hi.getOpcode() == RISCV::LUI) {
110111
if (LoOp2.getTargetFlags() != RISCVII::MO_LO ||
111-
!(LoOp2.isGlobal() || LoOp2.isCPI()) || LoOp2.getOffset() != 0)
112+
!(LoOp2.isGlobal() || LoOp2.isCPI() || LoOp2.isBlockAddress()) ||
113+
LoOp2.getOffset() != 0)
112114
return false;
113115
} else {
114116
assert(Hi.getOpcode() == RISCV::AUIPC);
@@ -120,8 +122,10 @@ bool RISCVMergeBaseOffsetOpt::detectFoldable(MachineInstr &Hi,
120122
if (HiOp1.isGlobal()) {
121123
LLVM_DEBUG(dbgs() << " Found lowered global address: "
122124
<< *HiOp1.getGlobal() << "\n");
123-
} else {
124-
assert(HiOp1.isCPI());
125+
} else if (HiOp1.isBlockAddress()) {
126+
LLVM_DEBUG(dbgs() << " Found lowered basic address: "
127+
<< *HiOp1.getBlockAddress() << "\n");
128+
} else if (HiOp1.isCPI()) {
125129
LLVM_DEBUG(dbgs() << " Found lowered constant pool: " << HiOp1.getIndex()
126130
<< "\n");
127131
}

llvm/test/CodeGen/RISCV/fold-addi-loadstore.ll

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -471,8 +471,7 @@ define dso_local ptr @load_ba_1() nounwind {
471471
; RV32I-MEDIUM-NEXT: # %bb.1: # %label
472472
; RV32I-MEDIUM-NEXT: .Lpcrel_hi12:
473473
; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp0)
474-
; RV32I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi12)
475-
; RV32I-MEDIUM-NEXT: lw a0, 0(a0)
474+
; RV32I-MEDIUM-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi12)(a0)
476475
; RV32I-MEDIUM-NEXT: ret
477476
;
478477
; RV64I-LABEL: load_ba_1:
@@ -489,8 +488,7 @@ define dso_local ptr @load_ba_1() nounwind {
489488
; RV64I-MEDIUM-NEXT: # %bb.1: # %label
490489
; RV64I-MEDIUM-NEXT: .Lpcrel_hi12:
491490
; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp0)
492-
; RV64I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi12)
493-
; RV64I-MEDIUM-NEXT: ld a0, 0(a0)
491+
; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi12)(a0)
494492
; RV64I-MEDIUM-NEXT: ret
495493
entry:
496494
br label %label
@@ -504,38 +502,34 @@ define dso_local ptr @load_ba_2() nounwind {
504502
; RV32I: # %bb.0: # %entry
505503
; RV32I-NEXT: .Ltmp1: # Block address taken
506504
; RV32I-NEXT: # %bb.1: # %label
507-
; RV32I-NEXT: lui a0, %hi(.Ltmp1)
508-
; RV32I-NEXT: addi a0, a0, %lo(.Ltmp1)
509-
; RV32I-NEXT: lw a0, 8(a0)
505+
; RV32I-NEXT: lui a0, %hi(.Ltmp1+8)
506+
; RV32I-NEXT: lw a0, %lo(.Ltmp1+8)(a0)
510507
; RV32I-NEXT: ret
511508
;
512509
; RV32I-MEDIUM-LABEL: load_ba_2:
513510
; RV32I-MEDIUM: # %bb.0: # %entry
514511
; RV32I-MEDIUM-NEXT: .Ltmp1: # Block address taken
515512
; RV32I-MEDIUM-NEXT: # %bb.1: # %label
516513
; RV32I-MEDIUM-NEXT: .Lpcrel_hi13:
517-
; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1)
518-
; RV32I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi13)
519-
; RV32I-MEDIUM-NEXT: lw a0, 8(a0)
514+
; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1+8)
515+
; RV32I-MEDIUM-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi13)(a0)
520516
; RV32I-MEDIUM-NEXT: ret
521517
;
522518
; RV64I-LABEL: load_ba_2:
523519
; RV64I: # %bb.0: # %entry
524520
; RV64I-NEXT: .Ltmp1: # Block address taken
525521
; RV64I-NEXT: # %bb.1: # %label
526-
; RV64I-NEXT: lui a0, %hi(.Ltmp1)
527-
; RV64I-NEXT: addi a0, a0, %lo(.Ltmp1)
528-
; RV64I-NEXT: ld a0, 8(a0)
522+
; RV64I-NEXT: lui a0, %hi(.Ltmp1+8)
523+
; RV64I-NEXT: ld a0, %lo(.Ltmp1+8)(a0)
529524
; RV64I-NEXT: ret
530525
;
531526
; RV64I-MEDIUM-LABEL: load_ba_2:
532527
; RV64I-MEDIUM: # %bb.0: # %entry
533528
; RV64I-MEDIUM-NEXT: .Ltmp1: # Block address taken
534529
; RV64I-MEDIUM-NEXT: # %bb.1: # %label
535530
; RV64I-MEDIUM-NEXT: .Lpcrel_hi13:
536-
; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1)
537-
; RV64I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi13)
538-
; RV64I-MEDIUM-NEXT: ld a0, 8(a0)
531+
; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1+8)
532+
; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi13)(a0)
539533
; RV64I-MEDIUM-NEXT: ret
540534
entry:
541535
br label %label

0 commit comments

Comments
 (0)