Skip to content

Commit a4ce8c7

Browse files
committed
[RISCV] Fold (sext_inreg (xor (setcc), -1), i1) -> (add (setcc), -1).
Fixes #153781.
1 parent daff757 commit a4ce8c7

File tree

6 files changed

+15
-16
lines changed

6 files changed

+15
-16
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: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,7 @@ define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
369369
; CHECK-LABEL: sexti1_i32_setcc:
370370
; CHECK: # %bb.0:
371371
; CHECK-NEXT: srli a0, a0, 31
372-
; CHECK-NEXT: not a0, a0
373-
; CHECK-NEXT: nds.bfos a0, a0, 0, 0
372+
; CHECK-NEXT: addi a0, a0, -1
374373
; CHECK-NEXT: zext.b a0, a0
375374
; CHECK-NEXT: ret
376375
%icmp = icmp sgt i32 %a, -1

llvm/test/CodeGen/RISCV/rv32xtheadbb.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,8 +326,7 @@ define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
326326
; RV32XTHEADBB-LABEL: sexti1_i32_setcc:
327327
; RV32XTHEADBB: # %bb.0:
328328
; RV32XTHEADBB-NEXT: srli a0, a0, 31
329-
; RV32XTHEADBB-NEXT: not a0, a0
330-
; RV32XTHEADBB-NEXT: th.ext a0, a0, 0, 0
329+
; RV32XTHEADBB-NEXT: addi a0, a0, -1
331330
; RV32XTHEADBB-NEXT: zext.b a0, a0
332331
; RV32XTHEADBB-NEXT: ret
333332
%icmp = icmp sgt i32 %a, -1

llvm/test/CodeGen/RISCV/rv64xandesperf.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,7 @@ define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
282282
; CHECK-LABEL: sexti1_i32_setcc:
283283
; CHECK: # %bb.0:
284284
; CHECK-NEXT: srli a0, a0, 63
285-
; CHECK-NEXT: not a0, a0
286-
; CHECK-NEXT: nds.bfos a0, a0, 0, 0
285+
; CHECK-NEXT: addi a0, a0, -1
287286
; CHECK-NEXT: zext.b a0, a0
288287
; CHECK-NEXT: ret
289288
%icmp = icmp sgt i32 %a, -1
@@ -353,8 +352,7 @@ define zeroext i8 @sexti1_i64_setcc(i64 %a) {
353352
; CHECK-LABEL: sexti1_i64_setcc:
354353
; CHECK: # %bb.0:
355354
; CHECK-NEXT: srli a0, a0, 63
356-
; CHECK-NEXT: not a0, a0
357-
; CHECK-NEXT: nds.bfos a0, a0, 0, 0
355+
; CHECK-NEXT: addi a0, a0, -1
358356
; CHECK-NEXT: zext.b a0, a0
359357
; CHECK-NEXT: ret
360358
%icmp = icmp sgt i64 %a, -1

llvm/test/CodeGen/RISCV/rv64xtheadbb.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -647,8 +647,7 @@ define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
647647
; RV64XTHEADBB-LABEL: sexti1_i32_setcc:
648648
; RV64XTHEADBB: # %bb.0:
649649
; RV64XTHEADBB-NEXT: srli a0, a0, 63
650-
; RV64XTHEADBB-NEXT: not a0, a0
651-
; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
650+
; RV64XTHEADBB-NEXT: addi a0, a0, -1
652651
; RV64XTHEADBB-NEXT: zext.b a0, a0
653652
; RV64XTHEADBB-NEXT: ret
654653
%icmp = icmp sgt i32 %a, -1
@@ -699,8 +698,7 @@ define zeroext i8 @sexti1_i64_setcc(i64 %a) {
699698
; RV64XTHEADBB-LABEL: sexti1_i64_setcc:
700699
; RV64XTHEADBB: # %bb.0:
701700
; RV64XTHEADBB-NEXT: srli a0, a0, 63
702-
; RV64XTHEADBB-NEXT: not a0, a0
703-
; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
701+
; RV64XTHEADBB-NEXT: addi a0, a0, -1
704702
; RV64XTHEADBB-NEXT: zext.b a0, a0
705703
; RV64XTHEADBB-NEXT: ret
706704
%icmp = icmp sgt i64 %a, -1

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,14 @@ define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
5959
; RV32XQCIBM-LABEL: sexti1_i32_setcc:
6060
; RV32XQCIBM: # %bb.0:
6161
; RV32XQCIBM-NEXT: srli a0, a0, 31
62-
; RV32XQCIBM-NEXT: not a0, a0
63-
; RV32XQCIBM-NEXT: qc.ext a0, a0, 1, 0
62+
; RV32XQCIBM-NEXT: addi a0, a0, -1
6463
; RV32XQCIBM-NEXT: qc.extu a0, a0, 8, 0
6564
; RV32XQCIBM-NEXT: ret
6665
;
6766
; RV32XQCIBMZBB-LABEL: sexti1_i32_setcc:
6867
; RV32XQCIBMZBB: # %bb.0:
6968
; RV32XQCIBMZBB-NEXT: srli a0, a0, 31
70-
; RV32XQCIBMZBB-NEXT: not a0, a0
71-
; RV32XQCIBMZBB-NEXT: qc.ext a0, a0, 1, 0
69+
; RV32XQCIBMZBB-NEXT: addi a0, a0, -1
7270
; RV32XQCIBMZBB-NEXT: qc.extu a0, a0, 8, 0
7371
; RV32XQCIBMZBB-NEXT: ret
7472
%icmp = icmp sgt i32 %a, -1

0 commit comments

Comments
 (0)