Skip to content

Commit 0c1500e

Browse files
committed
[RISCV] Fix another RV32 Zdinx load/store addressing corner case.
RISCVExpandPseudoInsts makes sure the offset is divisible by 8 so we need to enforce that during isel.
1 parent aafaa69 commit 0c1500e

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2691,7 +2691,7 @@ bool RISCVDAGToDAGISel::SelectAddrRegImm(SDValue Addr, SDValue &Base,
26912691
Align Alignment = commonAlignment(
26922692
GA->getGlobal()->getPointerAlignment(DL), GA->getOffset());
26932693
if ((CVal == 0 || Alignment > CVal) &&
2694-
(!IsRV32Zdinx || Alignment > (CVal + 4))) {
2694+
(!IsRV32Zdinx || commonAlignment(Alignment, CVal) > 4)) {
26952695
int64_t CombinedOffset = CVal + GA->getOffset();
26962696
Base = Base.getOperand(0);
26972697
Offset = CurDAG->getTargetGlobalAddress(

llvm/test/CodeGen/RISCV/zdinx-boundary-check.ll

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,3 +493,67 @@ entry:
493493
store double %d, ptr %add.ptr, align 8
494494
ret void
495495
}
496+
497+
@f = global double 4.2, align 16
498+
499+
define double @foo13(ptr nocapture %p) nounwind {
500+
; RV32ZDINX-LABEL: foo13:
501+
; RV32ZDINX: # %bb.0: # %entry
502+
; RV32ZDINX-NEXT: addi sp, sp, -16
503+
; RV32ZDINX-NEXT: lui a0, %hi(f)
504+
; RV32ZDINX-NEXT: lw a1, %lo(f+8)(a0)
505+
; RV32ZDINX-NEXT: sw a1, 12(sp)
506+
; RV32ZDINX-NEXT: lw a0, %lo(f+4)(a0)
507+
; RV32ZDINX-NEXT: sw a0, 8(sp)
508+
; RV32ZDINX-NEXT: lw a0, 8(sp)
509+
; RV32ZDINX-NEXT: lw a1, 12(sp)
510+
; RV32ZDINX-NEXT: addi sp, sp, 16
511+
; RV32ZDINX-NEXT: ret
512+
;
513+
; RV32ZDINXUALIGNED-LABEL: foo13:
514+
; RV32ZDINXUALIGNED: # %bb.0: # %entry
515+
; RV32ZDINXUALIGNED-NEXT: lui a0, %hi(f)
516+
; RV32ZDINXUALIGNED-NEXT: addi a0, a0, %lo(f)
517+
; RV32ZDINXUALIGNED-NEXT: lw a1, 8(a0)
518+
; RV32ZDINXUALIGNED-NEXT: lw a0, 4(a0)
519+
; RV32ZDINXUALIGNED-NEXT: ret
520+
;
521+
; RV64ZDINX-LABEL: foo13:
522+
; RV64ZDINX: # %bb.0: # %entry
523+
; RV64ZDINX-NEXT: lui a0, %hi(f)
524+
; RV64ZDINX-NEXT: lwu a1, %lo(f+8)(a0)
525+
; RV64ZDINX-NEXT: lwu a0, %lo(f+4)(a0)
526+
; RV64ZDINX-NEXT: slli a1, a1, 32
527+
; RV64ZDINX-NEXT: or a0, a1, a0
528+
; RV64ZDINX-NEXT: ret
529+
entry:
530+
%add.ptr = getelementptr inbounds i8, ptr @f, i64 4
531+
%0 = load double, ptr %add.ptr, align 4
532+
ret double %0
533+
}
534+
535+
define double @foo14(ptr nocapture %p) nounwind {
536+
; RV32ZDINX-LABEL: foo14:
537+
; RV32ZDINX: # %bb.0: # %entry
538+
; RV32ZDINX-NEXT: lui a0, %hi(f)
539+
; RV32ZDINX-NEXT: lw a1, %lo(f+12)(a0)
540+
; RV32ZDINX-NEXT: lw a0, %lo(f+8)(a0)
541+
; RV32ZDINX-NEXT: ret
542+
;
543+
; RV32ZDINXUALIGNED-LABEL: foo14:
544+
; RV32ZDINXUALIGNED: # %bb.0: # %entry
545+
; RV32ZDINXUALIGNED-NEXT: lui a0, %hi(f)
546+
; RV32ZDINXUALIGNED-NEXT: lw a1, %lo(f+12)(a0)
547+
; RV32ZDINXUALIGNED-NEXT: lw a0, %lo(f+8)(a0)
548+
; RV32ZDINXUALIGNED-NEXT: ret
549+
;
550+
; RV64ZDINX-LABEL: foo14:
551+
; RV64ZDINX: # %bb.0: # %entry
552+
; RV64ZDINX-NEXT: lui a0, %hi(f)
553+
; RV64ZDINX-NEXT: ld a0, %lo(f+8)(a0)
554+
; RV64ZDINX-NEXT: ret
555+
entry:
556+
%add.ptr = getelementptr inbounds i8, ptr @f, i64 8
557+
%0 = load double, ptr %add.ptr, align 8
558+
ret double %0
559+
}

0 commit comments

Comments
 (0)