Skip to content

Commit 1efa7fc

Browse files
committed
fold select_cc seteq (and x, 1) 0, 0, -1 -> neg(and(x, 1))
1 parent e848959 commit 1efa7fc

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28963,6 +28963,16 @@ SDValue DAGCombiner::SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
2896328963
if (SDValue V = foldSelectCCToShiftAnd(DL, N0, N1, N2, N3, CC))
2896428964
return V;
2896528965

28966+
// fold select_cc seteq (and x, 1), 0, 0, -1 -> neg(and(x, 1))
28967+
if (CC == ISD::SETEQ && N0->getOpcode() == ISD::AND &&
28968+
N0->getValueType(0) == VT && isNullConstant(N1) &&
28969+
isAllOnesConstant(N2) && isOneConstant(N0->getOperand(1))) {
28970+
SDValue AndLHS = N0->getOperand(0);
28971+
SDValue Neg =
28972+
DAG.getNode(ISD::AND, DL, VT, AndLHS, DAG.getConstant(1, DL, VT));
28973+
return DAG.getNegative(Neg, DL, VT);
28974+
}
28975+
2896628976
// fold (select_cc seteq (and x, y), 0, 0, A) -> (and (sra (shl x)) A)
2896728977
// where y is has a single bit set.
2896828978
// A plaintext description would be, we can turn the SELECT_CC into an AND

llvm/test/CodeGen/RISCV/pr148084.ll

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@ define fastcc void @search_tx_type() #0 {
1010
; CHECK: # %bb.0: # %._crit_edge.i
1111
; CHECK-NEXT: # %bb.1: # %bb
1212
; CHECK-NEXT: lbu a1, 0(zero)
13-
; CHECK-NEXT: lw a0, 0(zero)
1413
; CHECK-NEXT: lh a2, 0(zero)
14+
; CHECK-NEXT: lw a0, 0(zero)
1515
; CHECK-NEXT: seqz a1, a1
16-
; CHECK-NEXT: srai a3, a0, 63
1716
; CHECK-NEXT: addi a1, a1, -1
1817
; CHECK-NEXT: and a1, a1, a2
19-
; CHECK-NEXT: andi a2, a1, 1
20-
; CHECK-NEXT: addi a2, a2, -1
21-
; CHECK-NEXT: or a3, a3, a0
18+
; CHECK-NEXT: slli a2, a1, 63
19+
; CHECK-NEXT: srai a2, a2, 63
20+
; CHECK-NEXT: srai a3, a0, 63
2221
; CHECK-NEXT: or a2, a2, a3
2322
; CHECK-NEXT: bgez a2, .LBB0_3
2423
; CHECK-NEXT: # %bb.2:
@@ -36,14 +35,13 @@ define fastcc void @search_tx_type() #0 {
3635
; CHECK-NEXT: # %bb.6: # %bb
3736
; CHECK-NEXT: mv a3, a2
3837
; CHECK-NEXT: .LBB0_7: # %bb
39-
; CHECK-NEXT: andi a5, a1, 8
40-
; CHECK-NEXT: sext.w a4, a3
38+
; CHECK-NEXT: andi a4, a1, 8
4139
; CHECK-NEXT: mv a2, a3
42-
; CHECK-NEXT: beqz a5, .LBB0_9
40+
; CHECK-NEXT: beqz a4, .LBB0_9
4341
; CHECK-NEXT: # %bb.8: # %bb
4442
; CHECK-NEXT: mv a2, a0
4543
; CHECK-NEXT: .LBB0_9: # %bb
46-
; CHECK-NEXT: blt a4, a0, .LBB0_11
44+
; CHECK-NEXT: blt a3, a0, .LBB0_11
4745
; CHECK-NEXT: # %bb.10: # %bb
4846
; CHECK-NEXT: mv a2, a3
4947
; CHECK-NEXT: .LBB0_11: # %bb

0 commit comments

Comments
 (0)