Skip to content

Commit 5f17702

Browse files
committed
[PowerPC] Combine sub within setcc back to sext
1 parent 70c3e30 commit 5f17702

File tree

2 files changed

+72
-39
lines changed

2 files changed

+72
-39
lines changed

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14406,15 +14406,18 @@ SDValue PPCTargetLowering::DAGCombineExtBoolTrunc(SDNode *N,
1440614406
ShiftCst);
1440714407
}
1440814408

14409-
SDValue PPCTargetLowering::combineSetCC(SDNode *N,
14410-
DAGCombinerInfo &DCI) const {
14411-
assert(N->getOpcode() == ISD::SETCC &&
14412-
"Should be called with a SETCC node");
14409+
SDValue PPCTargetLowering::combineSetCC(SDNode *N, DAGCombinerInfo &DCI) const {
14410+
assert(N->getOpcode() == ISD::SETCC && "Should be called with a SETCC node");
1441314411

1441414412
ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
14413+
SDValue LHS = N->getOperand(0);
14414+
SDValue RHS = N->getOperand(1);
14415+
SDLoc DL(N);
14416+
SelectionDAG &DAG = DCI.DAG;
14417+
EVT VT = N->getValueType(0);
14418+
EVT OpVT = LHS.getValueType();
14419+
1441514420
if (CC == ISD::SETNE || CC == ISD::SETEQ) {
14416-
SDValue LHS = N->getOperand(0);
14417-
SDValue RHS = N->getOperand(1);
1441814421

1441914422
// If there is a '0 - y' pattern, canonicalize the pattern to the RHS.
1442014423
if (LHS.getOpcode() == ISD::SUB && isNullConstant(LHS.getOperand(0)) &&
@@ -14425,15 +14428,52 @@ SDValue PPCTargetLowering::combineSetCC(SDNode *N,
1442514428
// x != 0-y --> x+y != 0
1442614429
if (RHS.getOpcode() == ISD::SUB && isNullConstant(RHS.getOperand(0)) &&
1442714430
RHS.hasOneUse()) {
14428-
SDLoc DL(N);
14429-
SelectionDAG &DAG = DCI.DAG;
14430-
EVT VT = N->getValueType(0);
14431-
EVT OpVT = LHS.getValueType();
1443214431
SDValue Add = DAG.getNode(ISD::ADD, DL, OpVT, LHS, RHS.getOperand(1));
1443314432
return DAG.getSetCC(DL, VT, Add, DAG.getConstant(0, DL, OpVT), CC);
1443414433
}
1443514434
}
1443614435

14436+
if (CC == ISD::SETULT && isa<ConstantSDNode>(RHS)) {
14437+
uint64_t RHSVal = cast<ConstantSDNode>(RHS)->getZExtValue();
14438+
if (LHS.getOpcode() == ISD::ADD && isa<ConstantSDNode>(LHS.getOperand(1))) {
14439+
uint64_t Addend = cast<ConstantSDNode>(LHS.getOperand(1))->getZExtValue();
14440+
if (OpVT == MVT::i64) {
14441+
uint64_t ShiftVal = ~Addend + 1;
14442+
uint64_t CmpVal = ~RHSVal + 1;
14443+
if (isPowerOf2_64(ShiftVal) && ShiftVal << 1 == CmpVal) {
14444+
unsigned DestBits = Log2_64(CmpVal);
14445+
if (DestBits == 8 || DestBits == 16 || DestBits == 32) {
14446+
SDValue Conv = DAG.getSExtOrTrunc(
14447+
DAG.getSExtOrTrunc(LHS.getOperand(0), DL,
14448+
MVT::getIntegerVT(DestBits)),
14449+
DL, OpVT);
14450+
return DAG.getSetCC(DL, VT, LHS.getOperand(0), Conv, ISD::SETNE);
14451+
}
14452+
}
14453+
} else if (OpVT == MVT::i32) {
14454+
if (RHSVal == 0xffffff00 && Addend == 0xffffff80) {
14455+
SDValue Conv = DAG.getSExtOrTrunc(
14456+
DAG.getSExtOrTrunc(LHS.getOperand(0), DL, MVT::i8), DL, OpVT);
14457+
return DAG.getSetCC(DL, VT, LHS.getOperand(0), Conv, ISD::SETNE);
14458+
}
14459+
}
14460+
} else if (LHS.getOpcode() == ISD::SRL &&
14461+
LHS.getOperand(0).getOpcode() == ISD::ADD &&
14462+
isa<ConstantSDNode>(LHS.getOperand(1)) &&
14463+
isa<ConstantSDNode>(LHS.getOperand(0).getOperand(1))) {
14464+
if (RHSVal == 0xffff &&
14465+
cast<ConstantSDNode>(LHS.getOperand(1))->getZExtValue() == 16 &&
14466+
cast<ConstantSDNode>(LHS.getOperand(0).getOperand(1))
14467+
->getZExtValue() == 0xffff8000) {
14468+
SDValue Conv = DAG.getSExtOrTrunc(
14469+
DAG.getSExtOrTrunc(LHS.getOperand(0).getOperand(0), DL, MVT::i16),
14470+
DL, OpVT);
14471+
return DAG.getSetCC(DL, VT, LHS.getOperand(0).getOperand(0), Conv,
14472+
ISD::SETNE);
14473+
}
14474+
}
14475+
}
14476+
1443714477
return DAGCombineTruncBoolExt(N, DCI);
1443814478
}
1443914479

llvm/test/CodeGen/PowerPC/setcc-to-sub.ll

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,10 @@ entry:
9292
define zeroext i1 @test5(i64 %a) {
9393
; CHECK-LABEL: test5:
9494
; CHECK: # %bb.0: # %entry
95-
; CHECK-NEXT: li 4, -1
96-
; CHECK-NEXT: addis 3, 3, -32768
97-
; CHECK-NEXT: rldic 4, 4, 32, 0
98-
; CHECK-NEXT: subc 4, 3, 4
99-
; CHECK-NEXT: subfe 3, 3, 3
100-
; CHECK-NEXT: neg 3, 3
95+
; CHECK-NEXT: extsw 4, 3
96+
; CHECK-NEXT: xor 3, 3, 4
97+
; CHECK-NEXT: addic 4, 3, -1
98+
; CHECK-NEXT: subfe 3, 4, 3
10199
; CHECK-NEXT: blr
102100
entry:
103101
%0 = add i64 %a, -2147483648
@@ -108,11 +106,10 @@ entry:
108106
define zeroext i1 @test6(i64 %a) {
109107
; CHECK-LABEL: test6:
110108
; CHECK: # %bb.0: # %entry
111-
; CHECK-NEXT: addi 3, 3, -32768
112-
; CHECK-NEXT: lis 4, -1
113-
; CHECK-NEXT: subc 4, 3, 4
114-
; CHECK-NEXT: subfe 3, 3, 3
115-
; CHECK-NEXT: neg 3, 3
109+
; CHECK-NEXT: extsh 4, 3
110+
; CHECK-NEXT: xor 3, 3, 4
111+
; CHECK-NEXT: addic 4, 3, -1
112+
; CHECK-NEXT: subfe 3, 4, 3
116113
; CHECK-NEXT: blr
117114
entry:
118115
%0 = add i64 %a, -32768
@@ -123,11 +120,10 @@ entry:
123120
define zeroext i1 @test7(i64 %a) {
124121
; CHECK-LABEL: test7:
125122
; CHECK: # %bb.0: # %entry
126-
; CHECK-NEXT: addi 3, 3, -128
127-
; CHECK-NEXT: li 4, -256
128-
; CHECK-NEXT: subc 4, 3, 4
129-
; CHECK-NEXT: subfe 3, 3, 3
130-
; CHECK-NEXT: neg 3, 3
123+
; CHECK-NEXT: extsb 4, 3
124+
; CHECK-NEXT: xor 3, 3, 4
125+
; CHECK-NEXT: addic 4, 3, -1
126+
; CHECK-NEXT: subfe 3, 4, 3
131127
; CHECK-NEXT: blr
132128
entry:
133129
%0 = add i64 %a, -128
@@ -138,12 +134,11 @@ entry:
138134
define zeroext i1 @test8(i32 %a) {
139135
; CHECK-LABEL: test8:
140136
; CHECK: # %bb.0: # %entry
141-
; CHECK-NEXT: addi 3, 3, -32768
142-
; CHECK-NEXT: lis 4, -1
143-
; CHECK-NEXT: rlwinm 3, 3, 16, 16, 31
144-
; CHECK-NEXT: ori 4, 4, 1
145-
; CHECK-NEXT: add 3, 3, 4
146-
; CHECK-NEXT: rldicl 3, 3, 1, 63
137+
; CHECK-NEXT: extsh 4, 3
138+
; CHECK-NEXT: xor 3, 3, 4
139+
; CHECK-NEXT: cntlzw 3, 3
140+
; CHECK-NEXT: srwi 3, 3, 5
141+
; CHECK-NEXT: xori 3, 3, 1
147142
; CHECK-NEXT: blr
148143
entry:
149144
%0 = add i32 %a, -32768
@@ -154,13 +149,11 @@ entry:
154149
define zeroext i1 @test9(i32 %a) {
155150
; CHECK-LABEL: test9:
156151
; CHECK: # %bb.0: # %entry
157-
; CHECK-NEXT: lis 4, -256
158-
; CHECK-NEXT: addi 3, 3, -128
159-
; CHECK-NEXT: ori 4, 4, 1
160-
; CHECK-NEXT: clrldi 3, 3, 32
161-
; CHECK-NEXT: rldic 4, 4, 8, 0
162-
; CHECK-NEXT: add 3, 3, 4
163-
; CHECK-NEXT: rldicl 3, 3, 1, 63
152+
; CHECK-NEXT: extsb 4, 3
153+
; CHECK-NEXT: xor 3, 3, 4
154+
; CHECK-NEXT: cntlzw 3, 3
155+
; CHECK-NEXT: srwi 3, 3, 5
156+
; CHECK-NEXT: xori 3, 3, 1
164157
; CHECK-NEXT: blr
165158
entry:
166159
%0 = add i32 %a, -128

0 commit comments

Comments
 (0)