Skip to content

Commit 90109d4

Browse files
authored
[RISCV] Improve constant materialisation for stores of i8 negative constants (#92131)
This follows the same pattern as 20e6265. Although we can't reduce the number of instructions used, if we are able to use a sign-extended 6-bit immediate then the 16-bit c.li instruction can be selected (thus saving code size). Although this _could_ be gated so it only happens if C is enabled, I've opted not to because at worst it's neutral and it doesn't seem helpful to add unnecessary divergence between the RVC and non-RVC paths.
1 parent de14b74 commit 90109d4

8 files changed

+24
-20
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,11 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
902902
return;
903903
}
904904
int64_t Imm = ConstNode->getSExtValue();
905+
// If only the lower 8 bits are used, try to convert this to a simm6 by
906+
// sign-extending bit 7. This is neutral without the C extension, and
907+
// allows C.LI to be used if C is present.
908+
if (isUInt<8>(Imm) && isInt<6>(SignExtend64<8>(Imm)) && hasAllBUsers(Node))
909+
Imm = SignExtend64<8>(Imm);
905910
// If the upper XLen-16 bits are not used, try to convert this to a simm12
906911
// by sign extending bit 15.
907912
if (isUInt<16>(Imm) && isInt<12>(SignExtend64<16>(Imm)) &&

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class RISCVDAGToDAGISel : public SelectionDAGISel {
121121

122122
bool hasAllNBitUsers(SDNode *Node, unsigned Bits,
123123
const unsigned Depth = 0) const;
124+
bool hasAllBUsers(SDNode *Node) const { return hasAllNBitUsers(Node, 8); }
124125
bool hasAllHUsers(SDNode *Node) const { return hasAllNBitUsers(Node, 16); }
125126
bool hasAllWUsers(SDNode *Node) const { return hasAllNBitUsers(Node, 32); }
126127

llvm/test/CodeGen/RISCV/imm.ll

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,54 +1558,52 @@ define i64 @imm_2reg_1() nounwind {
15581558
ret i64 -1152921504301427080 ; 0xF000_0000_1234_5678
15591559
}
15601560

1561-
; TODO: Selecting -1 would be better in this case as it can be loaded with a
1562-
; 16 bit instruction when the compressed extension is enabled.
15631561
define void @imm_store_i8_neg1(ptr %p) nounwind {
15641562
; RV32I-LABEL: imm_store_i8_neg1:
15651563
; RV32I: # %bb.0:
1566-
; RV32I-NEXT: li a1, 255
1564+
; RV32I-NEXT: li a1, -1
15671565
; RV32I-NEXT: sb a1, 0(a0)
15681566
; RV32I-NEXT: ret
15691567
;
15701568
; RV64I-LABEL: imm_store_i8_neg1:
15711569
; RV64I: # %bb.0:
1572-
; RV64I-NEXT: li a1, 255
1570+
; RV64I-NEXT: li a1, -1
15731571
; RV64I-NEXT: sb a1, 0(a0)
15741572
; RV64I-NEXT: ret
15751573
;
15761574
; RV64IZBA-LABEL: imm_store_i8_neg1:
15771575
; RV64IZBA: # %bb.0:
1578-
; RV64IZBA-NEXT: li a1, 255
1576+
; RV64IZBA-NEXT: li a1, -1
15791577
; RV64IZBA-NEXT: sb a1, 0(a0)
15801578
; RV64IZBA-NEXT: ret
15811579
;
15821580
; RV64IZBB-LABEL: imm_store_i8_neg1:
15831581
; RV64IZBB: # %bb.0:
1584-
; RV64IZBB-NEXT: li a1, 255
1582+
; RV64IZBB-NEXT: li a1, -1
15851583
; RV64IZBB-NEXT: sb a1, 0(a0)
15861584
; RV64IZBB-NEXT: ret
15871585
;
15881586
; RV64IZBS-LABEL: imm_store_i8_neg1:
15891587
; RV64IZBS: # %bb.0:
1590-
; RV64IZBS-NEXT: li a1, 255
1588+
; RV64IZBS-NEXT: li a1, -1
15911589
; RV64IZBS-NEXT: sb a1, 0(a0)
15921590
; RV64IZBS-NEXT: ret
15931591
;
15941592
; RV64IXTHEADBB-LABEL: imm_store_i8_neg1:
15951593
; RV64IXTHEADBB: # %bb.0:
1596-
; RV64IXTHEADBB-NEXT: li a1, 255
1594+
; RV64IXTHEADBB-NEXT: li a1, -1
15971595
; RV64IXTHEADBB-NEXT: sb a1, 0(a0)
15981596
; RV64IXTHEADBB-NEXT: ret
15991597
;
16001598
; RV32-REMAT-LABEL: imm_store_i8_neg1:
16011599
; RV32-REMAT: # %bb.0:
1602-
; RV32-REMAT-NEXT: li a1, 255
1600+
; RV32-REMAT-NEXT: li a1, -1
16031601
; RV32-REMAT-NEXT: sb a1, 0(a0)
16041602
; RV32-REMAT-NEXT: ret
16051603
;
16061604
; RV64-REMAT-LABEL: imm_store_i8_neg1:
16071605
; RV64-REMAT: # %bb.0:
1608-
; RV64-REMAT-NEXT: li a1, 255
1606+
; RV64-REMAT-NEXT: li a1, -1
16091607
; RV64-REMAT-NEXT: sb a1, 0(a0)
16101608
; RV64-REMAT-NEXT: ret
16111609
store i8 -1, ptr %p

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fp-shuffles.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ define <4 x half> @shuffle_v4f16(<4 x half> %x, <4 x half> %y) {
1717
define <8 x float> @shuffle_v8f32(<8 x float> %x, <8 x float> %y) {
1818
; CHECK-LABEL: shuffle_v8f32:
1919
; CHECK: # %bb.0:
20-
; CHECK-NEXT: li a0, 236
20+
; CHECK-NEXT: li a0, -20
2121
; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma
2222
; CHECK-NEXT: vmv.s.x v0, a0
2323
; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-buildvec.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ define <4 x i8> @buildvec_vid_stepn3_add3_v4i8() {
260260
; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma
261261
; CHECK-NEXT: vmv.v.i v9, 3
262262
; CHECK-NEXT: vid.v v8
263-
; CHECK-NEXT: li a0, 253
263+
; CHECK-NEXT: li a0, -3
264264
; CHECK-NEXT: vmadd.vx v8, a0, v9
265265
; CHECK-NEXT: ret
266266
ret <4 x i8> <i8 3, i8 0, i8 -3, i8 -6>

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-shuffles.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ define <8 x i8> @concat_4xi8_start_undef(<8 x i8> %v, <8 x i8> %w) {
611611
define <8 x i8> @concat_4xi8_start_undef_at_start(<8 x i8> %v, <8 x i8> %w) {
612612
; CHECK-LABEL: concat_4xi8_start_undef_at_start:
613613
; CHECK: # %bb.0:
614-
; CHECK-NEXT: li a0, 224
614+
; CHECK-NEXT: li a0, -32
615615
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
616616
; CHECK-NEXT: vmv.s.x v0, a0
617617
; CHECK-NEXT: vslideup.vi v8, v9, 4, v0.t
@@ -682,7 +682,7 @@ define <8 x i8> @merge_non_contiguous_slideup_slidedown(<8 x i8> %v, <8 x i8> %w
682682
; CHECK: # %bb.0:
683683
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
684684
; CHECK-NEXT: vslidedown.vi v8, v8, 2
685-
; CHECK-NEXT: li a0, 234
685+
; CHECK-NEXT: li a0, -22
686686
; CHECK-NEXT: vmv.s.x v0, a0
687687
; CHECK-NEXT: vslideup.vi v8, v9, 1, v0.t
688688
; CHECK-NEXT: ret
@@ -699,7 +699,7 @@ define <8 x i8> @unmergable(<8 x i8> %v, <8 x i8> %w) {
699699
; CHECK-NEXT: lui a0, %hi(.LCPI46_0)
700700
; CHECK-NEXT: addi a0, a0, %lo(.LCPI46_0)
701701
; CHECK-NEXT: vle8.v v10, (a0)
702-
; CHECK-NEXT: li a0, 234
702+
; CHECK-NEXT: li a0, -22
703703
; CHECK-NEXT: vmv.s.x v0, a0
704704
; CHECK-NEXT: vrgather.vv v8, v9, v10, v0.t
705705
; CHECK-NEXT: ret

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-reduction-formation.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ define i32 @reduce_sum_16xi32_prefix4(ptr %p) {
160160
define i32 @reduce_sum_16xi32_prefix5(ptr %p) {
161161
; CHECK-LABEL: reduce_sum_16xi32_prefix5:
162162
; CHECK: # %bb.0:
163-
; CHECK-NEXT: li a1, 224
163+
; CHECK-NEXT: li a1, -32
164164
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
165165
; CHECK-NEXT: vmv.s.x v0, a1
166166
; CHECK-NEXT: vmv.v.i v8, -1
@@ -532,7 +532,7 @@ define i32 @reduce_xor_16xi32_prefix2(ptr %p) {
532532
define i32 @reduce_xor_16xi32_prefix5(ptr %p) {
533533
; CHECK-LABEL: reduce_xor_16xi32_prefix5:
534534
; CHECK: # %bb.0:
535-
; CHECK-NEXT: li a1, 224
535+
; CHECK-NEXT: li a1, -32
536536
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
537537
; CHECK-NEXT: vmv.s.x v0, a1
538538
; CHECK-NEXT: vmv.v.i v8, -1
@@ -620,7 +620,7 @@ define i32 @reduce_or_16xi32_prefix2(ptr %p) {
620620
define i32 @reduce_or_16xi32_prefix5(ptr %p) {
621621
; CHECK-LABEL: reduce_or_16xi32_prefix5:
622622
; CHECK: # %bb.0:
623-
; CHECK-NEXT: li a1, 224
623+
; CHECK-NEXT: li a1, -32
624624
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
625625
; CHECK-NEXT: vmv.s.x v0, a1
626626
; CHECK-NEXT: vmv.v.i v8, -1
@@ -757,7 +757,7 @@ define i32 @reduce_umax_16xi32_prefix2(ptr %p) {
757757
define i32 @reduce_umax_16xi32_prefix5(ptr %p) {
758758
; CHECK-LABEL: reduce_umax_16xi32_prefix5:
759759
; CHECK: # %bb.0:
760-
; CHECK-NEXT: li a1, 224
760+
; CHECK-NEXT: li a1, -32
761761
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
762762
; CHECK-NEXT: vmv.s.x v0, a1
763763
; CHECK-NEXT: vmv.v.i v8, -1

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ define void @merge_stores_i32_i64(ptr %p) {
419419
define void @store_large_constant(ptr %x) {
420420
; SLOW-LABEL: store_large_constant:
421421
; SLOW: # %bb.0:
422-
; SLOW-NEXT: li a1, 254
422+
; SLOW-NEXT: li a1, -2
423423
; SLOW-NEXT: sb a1, 7(a0)
424424
; SLOW-NEXT: li a1, 220
425425
; SLOW-NEXT: sb a1, 6(a0)

0 commit comments

Comments
 (0)