Skip to content

Commit c84a43f

Browse files
authored
[RISCV] Fold (sext_inreg (xor (setcc), -1), i1) -> (add (setcc), -1). (#153855)
This improves all 3 vendor extensions that make sext_inreg i1 legal Fixes #153781.
1 parent ca8ee49 commit c84a43f

File tree

6 files changed

+133
-0
lines changed

6 files changed

+133
-0
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16660,6 +16660,13 @@ performSIGN_EXTEND_INREGCombine(SDNode *N, SelectionDAG &DAG,
1666016660
return DAG.getNode(RISCVISD::SLLW, SDLoc(N), VT, Src.getOperand(0),
1666116661
Src.getOperand(1));
1666216662

16663+
// Fold (sext_inreg (xor (setcc), -1), i1) -> (add (setcc), -1)
16664+
if (Opc == ISD::XOR && SrcVT == MVT::i1 &&
16665+
isAllOnesConstant(Src.getOperand(1)) &&
16666+
Src.getOperand(0).getOpcode() == ISD::SETCC)
16667+
return DAG.getNode(ISD::ADD, SDLoc(N), VT, Src.getOperand(0),
16668+
DAG.getAllOnesConstant(SDLoc(N), VT));
16669+
1666316670
return SDValue();
1666416671
}
1666516672

llvm/test/CodeGen/RISCV/rv32xandesperf.ll

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,19 @@ define i32 @sexti1_i32_2(i1 %a) {
364364
ret i32 %1
365365
}
366366

367+
; Make sure we don't use not+nds.bfos
368+
define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
369+
; CHECK-LABEL: sexti1_i32_setcc:
370+
; CHECK: # %bb.0:
371+
; CHECK-NEXT: srli a0, a0, 31
372+
; CHECK-NEXT: addi a0, a0, -1
373+
; CHECK-NEXT: zext.b a0, a0
374+
; CHECK-NEXT: ret
375+
%icmp = icmp sgt i32 %a, -1
376+
%sext = sext i1 %icmp to i8
377+
ret i8 %sext
378+
}
379+
367380
define i32 @sexti8_i32(i32 %a) {
368381
; CHECK-LABEL: sexti8_i32:
369382
; CHECK: # %bb.0:

llvm/test/CodeGen/RISCV/rv32xtheadbb.ll

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,26 @@ define i32 @sexti1_i32_2(i1 %a) nounwind {
314314
ret i32 %sext
315315
}
316316

317+
; Make sure we don't use not+th.ext
318+
define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
319+
; RV32I-LABEL: sexti1_i32_setcc:
320+
; RV32I: # %bb.0:
321+
; RV32I-NEXT: srli a0, a0, 31
322+
; RV32I-NEXT: addi a0, a0, -1
323+
; RV32I-NEXT: zext.b a0, a0
324+
; RV32I-NEXT: ret
325+
;
326+
; RV32XTHEADBB-LABEL: sexti1_i32_setcc:
327+
; RV32XTHEADBB: # %bb.0:
328+
; RV32XTHEADBB-NEXT: srli a0, a0, 31
329+
; RV32XTHEADBB-NEXT: addi a0, a0, -1
330+
; RV32XTHEADBB-NEXT: zext.b a0, a0
331+
; RV32XTHEADBB-NEXT: ret
332+
%icmp = icmp sgt i32 %a, -1
333+
%sext = sext i1 %icmp to i8
334+
ret i8 %sext
335+
}
336+
317337
define i32 @sextb_i32(i32 %a) nounwind {
318338
; RV32I-LABEL: sextb_i32:
319339
; RV32I: # %bb.0:

llvm/test/CodeGen/RISCV/rv64xandesperf.ll

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,19 @@ define signext i32 @sexti1_i32_2(i1 %a) {
277277
ret i32 %1
278278
}
279279

280+
; Make sure we don't use not+nds.bfos
281+
define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
282+
; CHECK-LABEL: sexti1_i32_setcc:
283+
; CHECK: # %bb.0:
284+
; CHECK-NEXT: srli a0, a0, 63
285+
; CHECK-NEXT: addi a0, a0, -1
286+
; CHECK-NEXT: zext.b a0, a0
287+
; CHECK-NEXT: ret
288+
%icmp = icmp sgt i32 %a, -1
289+
%sext = sext i1 %icmp to i8
290+
ret i8 %sext
291+
}
292+
280293
define signext i32 @sexti8_i32(i32 signext %a) {
281294
; CHECK-LABEL: sexti8_i32:
282295
; CHECK: # %bb.0:
@@ -334,6 +347,19 @@ define i64 @sexti1_i64_2(i1 %a) {
334347
ret i64 %1
335348
}
336349

350+
; Make sure we don't use not+nds.bfos
351+
define zeroext i8 @sexti1_i64_setcc(i64 %a) {
352+
; CHECK-LABEL: sexti1_i64_setcc:
353+
; CHECK: # %bb.0:
354+
; CHECK-NEXT: srli a0, a0, 63
355+
; CHECK-NEXT: addi a0, a0, -1
356+
; CHECK-NEXT: zext.b a0, a0
357+
; CHECK-NEXT: ret
358+
%icmp = icmp sgt i64 %a, -1
359+
%sext = sext i1 %icmp to i8
360+
ret i8 %sext
361+
}
362+
337363
define i64 @sexti8_i64(i64 %a) {
338364
; CHECK-LABEL: sexti8_i64:
339365
; CHECK: # %bb.0:

llvm/test/CodeGen/RISCV/rv64xtheadbb.ll

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,26 @@ define signext i32 @sexti1_i32_2(i1 %a) nounwind {
635635
ret i32 %sext
636636
}
637637

638+
; Make sure we don't use not+th.ext
639+
define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
640+
; RV64I-LABEL: sexti1_i32_setcc:
641+
; RV64I: # %bb.0:
642+
; RV64I-NEXT: srli a0, a0, 63
643+
; RV64I-NEXT: addi a0, a0, -1
644+
; RV64I-NEXT: zext.b a0, a0
645+
; RV64I-NEXT: ret
646+
;
647+
; RV64XTHEADBB-LABEL: sexti1_i32_setcc:
648+
; RV64XTHEADBB: # %bb.0:
649+
; RV64XTHEADBB-NEXT: srli a0, a0, 63
650+
; RV64XTHEADBB-NEXT: addi a0, a0, -1
651+
; RV64XTHEADBB-NEXT: zext.b a0, a0
652+
; RV64XTHEADBB-NEXT: ret
653+
%icmp = icmp sgt i32 %a, -1
654+
%sext = sext i1 %icmp to i8
655+
ret i8 %sext
656+
}
657+
638658
define i64 @sexti1_i64(i64 %a) nounwind {
639659
; RV64I-LABEL: sexti1_i64:
640660
; RV64I: # %bb.0:
@@ -666,6 +686,26 @@ define i64 @sexti1_i64_2(i1 %a) nounwind {
666686
ret i64 %sext
667687
}
668688

689+
; Make sure we don't use not+th.ext
690+
define zeroext i8 @sexti1_i64_setcc(i64 %a) {
691+
; RV64I-LABEL: sexti1_i64_setcc:
692+
; RV64I: # %bb.0:
693+
; RV64I-NEXT: srli a0, a0, 63
694+
; RV64I-NEXT: addi a0, a0, -1
695+
; RV64I-NEXT: zext.b a0, a0
696+
; RV64I-NEXT: ret
697+
;
698+
; RV64XTHEADBB-LABEL: sexti1_i64_setcc:
699+
; RV64XTHEADBB: # %bb.0:
700+
; RV64XTHEADBB-NEXT: srli a0, a0, 63
701+
; RV64XTHEADBB-NEXT: addi a0, a0, -1
702+
; RV64XTHEADBB-NEXT: zext.b a0, a0
703+
; RV64XTHEADBB-NEXT: ret
704+
%icmp = icmp sgt i64 %a, -1
705+
%sext = sext i1 %icmp to i8
706+
ret i8 %sext
707+
}
708+
669709
define signext i32 @sextb_i32(i32 signext %a) nounwind {
670710
; RV64I-LABEL: sextb_i32:
671711
; RV64I: # %bb.0:

llvm/test/CodeGen/RISCV/xqcibm-extract.ll

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,33 @@ define i32 @sexti1_i32_2(i32 %a) {
4747
ret i32 %shr
4848
}
4949

50+
; Make sure we don't use not+qc.ext
51+
define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
52+
; RV32I-LABEL: sexti1_i32_setcc:
53+
; RV32I: # %bb.0:
54+
; RV32I-NEXT: srli a0, a0, 31
55+
; RV32I-NEXT: addi a0, a0, -1
56+
; RV32I-NEXT: zext.b a0, a0
57+
; RV32I-NEXT: ret
58+
;
59+
; RV32XQCIBM-LABEL: sexti1_i32_setcc:
60+
; RV32XQCIBM: # %bb.0:
61+
; RV32XQCIBM-NEXT: srli a0, a0, 31
62+
; RV32XQCIBM-NEXT: addi a0, a0, -1
63+
; RV32XQCIBM-NEXT: qc.extu a0, a0, 8, 0
64+
; RV32XQCIBM-NEXT: ret
65+
;
66+
; RV32XQCIBMZBB-LABEL: sexti1_i32_setcc:
67+
; RV32XQCIBMZBB: # %bb.0:
68+
; RV32XQCIBMZBB-NEXT: srli a0, a0, 31
69+
; RV32XQCIBMZBB-NEXT: addi a0, a0, -1
70+
; RV32XQCIBMZBB-NEXT: qc.extu a0, a0, 8, 0
71+
; RV32XQCIBMZBB-NEXT: ret
72+
%icmp = icmp sgt i32 %a, -1
73+
%sext = sext i1 %icmp to i8
74+
ret i8 %sext
75+
}
76+
5077

5178
define i32 @sexti8_i32(i8 %a) nounwind {
5279
; RV32I-LABEL: sexti8_i32:

0 commit comments

Comments
 (0)