Skip to content

Commit fd9a006

Browse files
committed
[RISCV] Improve constant materialisation of for stores of i8 negative constants
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 used. 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 fd9a006

File tree

8 files changed

+24
-20
lines changed

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)