Skip to content

Commit da032b7

Browse files
authored
[RISCV][GISel] Use maskedValueIsZero in RISCVInstructionSelector::selectZExtBits. (#115244)
1 parent c6091cd commit da032b7

File tree

3 files changed

+64
-34
lines changed

3 files changed

+64
-34
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,9 @@ RISCVInstructionSelector::selectZExtBits(MachineOperand &Root,
261261
return {{[=](MachineInstrBuilder &MIB) { MIB.addReg(RegX); }}};
262262
}
263263

264-
// TODO: Use computeKnownBits.
264+
unsigned Size = MRI->getType(RootReg).getScalarSizeInBits();
265+
if (KB->maskedValueIsZero(RootReg, APInt::getBitsSetFrom(Size, Bits)))
266+
return {{[=](MachineInstrBuilder &MIB) { MIB.add(Root); }}};
265267

266268
return std::nullopt;
267269
}

llvm/test/CodeGen/RISCV/GlobalISel/rv32zbkb.ll

Lines changed: 60 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,16 @@ define i32 @pack_i32(i32 %a, i32 %b) nounwind {
2525
}
2626

2727
define i32 @pack_i32_2(i16 zeroext %a, i16 zeroext %b) nounwind {
28-
; CHECK-LABEL: pack_i32_2:
29-
; CHECK: # %bb.0:
30-
; CHECK-NEXT: slli a1, a1, 16
31-
; CHECK-NEXT: or a0, a1, a0
32-
; CHECK-NEXT: ret
28+
; RV32I-LABEL: pack_i32_2:
29+
; RV32I: # %bb.0:
30+
; RV32I-NEXT: slli a1, a1, 16
31+
; RV32I-NEXT: or a0, a1, a0
32+
; RV32I-NEXT: ret
33+
;
34+
; RV32ZBKB-LABEL: pack_i32_2:
35+
; RV32ZBKB: # %bb.0:
36+
; RV32ZBKB-NEXT: pack a0, a0, a1
37+
; RV32ZBKB-NEXT: ret
3338
%zexta = zext i16 %a to i32
3439
%zextb = zext i16 %b to i32
3540
%shl1 = shl i32 %zextb, 16
@@ -38,12 +43,18 @@ define i32 @pack_i32_2(i16 zeroext %a, i16 zeroext %b) nounwind {
3843
}
3944

4045
define i32 @pack_i32_3(i16 zeroext %0, i16 zeroext %1, i32 %2) {
41-
; CHECK-LABEL: pack_i32_3:
42-
; CHECK: # %bb.0:
43-
; CHECK-NEXT: slli a0, a0, 16
44-
; CHECK-NEXT: or a0, a0, a1
45-
; CHECK-NEXT: add a0, a0, a2
46-
; CHECK-NEXT: ret
46+
; RV32I-LABEL: pack_i32_3:
47+
; RV32I: # %bb.0:
48+
; RV32I-NEXT: slli a0, a0, 16
49+
; RV32I-NEXT: or a0, a0, a1
50+
; RV32I-NEXT: add a0, a0, a2
51+
; RV32I-NEXT: ret
52+
;
53+
; RV32ZBKB-LABEL: pack_i32_3:
54+
; RV32ZBKB: # %bb.0:
55+
; RV32ZBKB-NEXT: pack a0, a1, a0
56+
; RV32ZBKB-NEXT: add a0, a0, a2
57+
; RV32ZBKB-NEXT: ret
4758
%4 = zext i16 %0 to i32
4859
%5 = shl nuw i32 %4, 16
4960
%6 = zext i16 %1 to i32
@@ -175,11 +186,16 @@ define i64 @packh_i64_2(i64 %a, i64 %b) nounwind {
175186

176187

177188
define zeroext i16 @packh_i16(i8 zeroext %a, i8 zeroext %b) nounwind {
178-
; CHECK-LABEL: packh_i16:
179-
; CHECK: # %bb.0:
180-
; CHECK-NEXT: slli a1, a1, 8
181-
; CHECK-NEXT: or a0, a1, a0
182-
; CHECK-NEXT: ret
189+
; RV32I-LABEL: packh_i16:
190+
; RV32I: # %bb.0:
191+
; RV32I-NEXT: slli a1, a1, 8
192+
; RV32I-NEXT: or a0, a1, a0
193+
; RV32I-NEXT: ret
194+
;
195+
; RV32ZBKB-LABEL: packh_i16:
196+
; RV32ZBKB: # %bb.0:
197+
; RV32ZBKB-NEXT: packh a0, a0, a1
198+
; RV32ZBKB-NEXT: ret
183199
%zext = zext i8 %a to i16
184200
%zext1 = zext i8 %b to i16
185201
%shl = shl i16 %zext1, 8
@@ -189,13 +205,19 @@ define zeroext i16 @packh_i16(i8 zeroext %a, i8 zeroext %b) nounwind {
189205

190206

191207
define zeroext i16 @packh_i16_2(i8 zeroext %0, i8 zeroext %1, i8 zeroext %2) {
192-
; CHECK-LABEL: packh_i16_2:
193-
; CHECK: # %bb.0:
194-
; CHECK-NEXT: add a0, a1, a0
195-
; CHECK-NEXT: andi a0, a0, 255
196-
; CHECK-NEXT: slli a0, a0, 8
197-
; CHECK-NEXT: or a0, a0, a2
198-
; CHECK-NEXT: ret
208+
; RV32I-LABEL: packh_i16_2:
209+
; RV32I: # %bb.0:
210+
; RV32I-NEXT: add a0, a1, a0
211+
; RV32I-NEXT: andi a0, a0, 255
212+
; RV32I-NEXT: slli a0, a0, 8
213+
; RV32I-NEXT: or a0, a0, a2
214+
; RV32I-NEXT: ret
215+
;
216+
; RV32ZBKB-LABEL: packh_i16_2:
217+
; RV32ZBKB: # %bb.0:
218+
; RV32ZBKB-NEXT: add a0, a1, a0
219+
; RV32ZBKB-NEXT: packh a0, a2, a0
220+
; RV32ZBKB-NEXT: ret
199221
%4 = add i8 %1, %0
200222
%5 = zext i8 %4 to i16
201223
%6 = shl i16 %5, 8
@@ -205,14 +227,21 @@ define zeroext i16 @packh_i16_2(i8 zeroext %0, i8 zeroext %1, i8 zeroext %2) {
205227
}
206228

207229
define void @packh_i16_3(i8 zeroext %0, i8 zeroext %1, i8 zeroext %2, ptr %p) {
208-
; CHECK-LABEL: packh_i16_3:
209-
; CHECK: # %bb.0:
210-
; CHECK-NEXT: add a0, a1, a0
211-
; CHECK-NEXT: andi a0, a0, 255
212-
; CHECK-NEXT: slli a0, a0, 8
213-
; CHECK-NEXT: or a0, a0, a2
214-
; CHECK-NEXT: sh a0, 0(a3)
215-
; CHECK-NEXT: ret
230+
; RV32I-LABEL: packh_i16_3:
231+
; RV32I: # %bb.0:
232+
; RV32I-NEXT: add a0, a1, a0
233+
; RV32I-NEXT: andi a0, a0, 255
234+
; RV32I-NEXT: slli a0, a0, 8
235+
; RV32I-NEXT: or a0, a0, a2
236+
; RV32I-NEXT: sh a0, 0(a3)
237+
; RV32I-NEXT: ret
238+
;
239+
; RV32ZBKB-LABEL: packh_i16_3:
240+
; RV32ZBKB: # %bb.0:
241+
; RV32ZBKB-NEXT: add a0, a1, a0
242+
; RV32ZBKB-NEXT: packh a0, a2, a0
243+
; RV32ZBKB-NEXT: sh a0, 0(a3)
244+
; RV32ZBKB-NEXT: ret
216245
%4 = add i8 %1, %0
217246
%5 = zext i8 %4 to i16
218247
%6 = shl i16 %5, 8

llvm/test/CodeGen/RISCV/GlobalISel/rv64zbkb.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,7 @@ define i64 @pack_i64_3(ptr %0, ptr %1) {
130130
; RV64ZBKB: # %bb.0:
131131
; RV64ZBKB-NEXT: lwu a0, 0(a0)
132132
; RV64ZBKB-NEXT: lwu a1, 0(a1)
133-
; RV64ZBKB-NEXT: slli a0, a0, 32
134-
; RV64ZBKB-NEXT: or a0, a0, a1
133+
; RV64ZBKB-NEXT: pack a0, a1, a0
135134
; RV64ZBKB-NEXT: ret
136135
%3 = load i32, ptr %0, align 4
137136
%4 = zext i32 %3 to i64

0 commit comments

Comments
 (0)