Skip to content

Commit 17a12a2

Browse files
committed
[RISCV] Add test case to show bad codegen for unaligned i64 store of a large constant.
On the first split we create two i32 trunc stores and a srl to shift the high part down. The srl gets constant folded, but to produce a new i32 constant. But the truncstore for the low store still uses the original constant. This original constant then gets converted to a constant pool before we revisit the stores to further split them. The constant pool prevents further constant folding of the additional srls. After legalization is done, we run DAGCombiner and get some constant folding of srl via computeKnownBits which can peek through the constant pool load. This can create new constants that also need a constant pool.
1 parent 14882d6 commit 17a12a2

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

llvm/test/CodeGen/RISCV/unaligned-load-store.ll

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,3 +415,75 @@ define void @merge_stores_i32_i64(ptr %p) {
415415
store i32 0, ptr %p2
416416
ret void
417417
}
418+
419+
; FIXME: We shouldn't generate multiple constant pools entries with shifted
420+
; values.
421+
;.LCPI0_0:
422+
; .quad 280223976814164 # 0xfedcba987654
423+
;.LCPI0_1:
424+
; .quad 71737338064426034 # 0xfedcba98765432
425+
;.LCPI0_2:
426+
; .quad -81985529216486896 # 0xfedcba9876543210
427+
define void @store_large_constant(ptr %x) {
428+
; RV32I-LABEL: store_large_constant:
429+
; RV32I: # %bb.0:
430+
; RV32I-NEXT: li a1, 254
431+
; RV32I-NEXT: sb a1, 7(a0)
432+
; RV32I-NEXT: li a1, 220
433+
; RV32I-NEXT: sb a1, 6(a0)
434+
; RV32I-NEXT: li a1, 186
435+
; RV32I-NEXT: sb a1, 5(a0)
436+
; RV32I-NEXT: li a1, 152
437+
; RV32I-NEXT: sb a1, 4(a0)
438+
; RV32I-NEXT: li a1, 118
439+
; RV32I-NEXT: sb a1, 3(a0)
440+
; RV32I-NEXT: li a1, 84
441+
; RV32I-NEXT: sb a1, 2(a0)
442+
; RV32I-NEXT: li a1, 50
443+
; RV32I-NEXT: sb a1, 1(a0)
444+
; RV32I-NEXT: li a1, 16
445+
; RV32I-NEXT: sb a1, 0(a0)
446+
; RV32I-NEXT: ret
447+
;
448+
; RV64I-LABEL: store_large_constant:
449+
; RV64I: # %bb.0:
450+
; RV64I-NEXT: li a1, 254
451+
; RV64I-NEXT: sb a1, 7(a0)
452+
; RV64I-NEXT: li a1, 220
453+
; RV64I-NEXT: sb a1, 6(a0)
454+
; RV64I-NEXT: li a1, 186
455+
; RV64I-NEXT: sb a1, 5(a0)
456+
; RV64I-NEXT: li a1, 152
457+
; RV64I-NEXT: sb a1, 4(a0)
458+
; RV64I-NEXT: li a1, 118
459+
; RV64I-NEXT: lui a2, %hi(.LCPI16_0)
460+
; RV64I-NEXT: ld a2, %lo(.LCPI16_0)(a2)
461+
; RV64I-NEXT: lui a3, %hi(.LCPI16_1)
462+
; RV64I-NEXT: ld a3, %lo(.LCPI16_1)(a3)
463+
; RV64I-NEXT: lui a4, %hi(.LCPI16_2)
464+
; RV64I-NEXT: ld a4, %lo(.LCPI16_2)(a4)
465+
; RV64I-NEXT: sb a1, 3(a0)
466+
; RV64I-NEXT: sb a2, 2(a0)
467+
; RV64I-NEXT: sb a3, 1(a0)
468+
; RV64I-NEXT: sb a4, 0(a0)
469+
; RV64I-NEXT: ret
470+
;
471+
; RV32I-FAST-LABEL: store_large_constant:
472+
; RV32I-FAST: # %bb.0:
473+
; RV32I-FAST-NEXT: lui a1, 1043916
474+
; RV32I-FAST-NEXT: addi a1, a1, -1384
475+
; RV32I-FAST-NEXT: sw a1, 4(a0)
476+
; RV32I-FAST-NEXT: lui a1, 484675
477+
; RV32I-FAST-NEXT: addi a1, a1, 528
478+
; RV32I-FAST-NEXT: sw a1, 0(a0)
479+
; RV32I-FAST-NEXT: ret
480+
;
481+
; RV64I-FAST-LABEL: store_large_constant:
482+
; RV64I-FAST: # %bb.0:
483+
; RV64I-FAST-NEXT: lui a1, %hi(.LCPI16_0)
484+
; RV64I-FAST-NEXT: ld a1, %lo(.LCPI16_0)(a1)
485+
; RV64I-FAST-NEXT: sd a1, 0(a0)
486+
; RV64I-FAST-NEXT: ret
487+
store i64 18364758544493064720, ptr %x, align 1
488+
ret void
489+
}

0 commit comments

Comments
 (0)