Skip to content

Commit 10425de

Browse files
committedMar 9, 2017
[DAGCombiner] Do various combine on usubo.
Summary: This essentially does the same transform as for SUBC. Reviewers: jyknight, nemanjai, mkuper, spatel, RKSimon, zvi, bkramer Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D30437 llvm-svn: 297404
1 parent eef294c commit 10425de

File tree

2 files changed

+43
-29
lines changed

2 files changed

+43
-29
lines changed
 

‎llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

+34
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ namespace {
236236
SDValue visitSUB(SDNode *N);
237237
SDValue visitADDC(SDNode *N);
238238
SDValue visitSUBC(SDNode *N);
239+
SDValue visitUSUBO(SDNode *N);
239240
SDValue visitADDE(SDNode *N);
240241
SDValue visitSUBE(SDNode *N);
241242
SDValue visitMUL(SDNode *N);
@@ -1400,6 +1401,7 @@ SDValue DAGCombiner::visit(SDNode *N) {
14001401
case ISD::SUB: return visitSUB(N);
14011402
case ISD::ADDC: return visitADDC(N);
14021403
case ISD::SUBC: return visitSUBC(N);
1404+
case ISD::USUBO: return visitUSUBO(N);
14031405
case ISD::ADDE: return visitADDE(N);
14041406
case ISD::SUBE: return visitSUBE(N);
14051407
case ISD::MUL: return visitMUL(N);
@@ -2133,6 +2135,38 @@ SDValue DAGCombiner::visitSUBC(SDNode *N) {
21332135
return SDValue();
21342136
}
21352137

2138+
SDValue DAGCombiner::visitUSUBO(SDNode *N) {
2139+
SDValue N0 = N->getOperand(0);
2140+
SDValue N1 = N->getOperand(1);
2141+
EVT VT = N0.getValueType();
2142+
if (VT.isVector())
2143+
return SDValue();
2144+
2145+
EVT CarryVT = N->getValueType(1);
2146+
SDLoc DL(N);
2147+
2148+
// If the flag result is dead, turn this into an SUB.
2149+
if (!N->hasAnyUseOfValue(1))
2150+
return CombineTo(N, DAG.getNode(ISD::SUB, DL, VT, N0, N1),
2151+
DAG.getUNDEF(CarryVT));
2152+
2153+
// fold (usubo x, x) -> 0 + no borrow
2154+
if (N0 == N1)
2155+
return CombineTo(N, DAG.getConstant(0, DL, VT),
2156+
DAG.getConstant(0, DL, CarryVT));
2157+
2158+
// fold (usubo x, 0) -> x + no borrow
2159+
if (isNullConstant(N1))
2160+
return CombineTo(N, N0, DAG.getConstant(0, DL, CarryVT));
2161+
2162+
// Canonicalize (usubo -1, x) -> ~x, i.e. (xor x, -1) + no borrow
2163+
if (isAllOnesConstant(N0))
2164+
return CombineTo(N, DAG.getNode(ISD::XOR, DL, VT, N1, N0),
2165+
DAG.getConstant(0, DL, CarryVT));
2166+
2167+
return SDValue();
2168+
}
2169+
21362170
SDValue DAGCombiner::visitSUBE(SDNode *N) {
21372171
SDValue N0 = N->getOperand(0);
21382172
SDValue N1 = N->getOperand(1);

‎llvm/test/CodeGen/X86/xaluo.ll

+9-29
Original file line numberDiff line numberDiff line change
@@ -1372,43 +1372,23 @@ define {i64, i1} @uaddoovf(i64 %a, i64 %b) {
13721372
define {i64, i1} @usuboovf(i64 %a, i64 %b) {
13731373
; SDAG-LABEL: usuboovf:
13741374
; SDAG: ## BB#0:
1375-
; SDAG-NEXT: subq %rdi, %rdi
1376-
; SDAG-NEXT: sbbb %r8b, %r8b
1377-
; SDAG-NEXT: movq $-1, %rax
1378-
; SDAG-NEXT: subq %rsi, %rax
1379-
; SDAG-NEXT: sbbb %cl, %cl
1380-
; SDAG-NEXT: subq %rdi, %rax
1381-
; SDAG-NEXT: sbbb %dl, %dl
1382-
; SDAG-NEXT: orb %cl, %dl
1383-
; SDAG-NEXT: orb %r8b, %dl
1384-
; SDAG-NEXT: andb $1, %dl
1375+
; SDAG-NEXT: notq %rsi
1376+
; SDAG-NEXT: xorl %edx, %edx
1377+
; SDAG-NEXT: movq %rsi, %rax
13851378
; SDAG-NEXT: retq
13861379
;
13871380
; FAST-LABEL: usuboovf:
13881381
; FAST: ## BB#0:
1389-
; FAST-NEXT: subq %rdi, %rdi
1390-
; FAST-NEXT: sbbb %r8b, %r8b
1391-
; FAST-NEXT: movq $-1, %rax
1392-
; FAST-NEXT: subq %rsi, %rax
1393-
; FAST-NEXT: sbbb %cl, %cl
1394-
; FAST-NEXT: subq %rdi, %rax
1395-
; FAST-NEXT: sbbb %dl, %dl
1396-
; FAST-NEXT: orb %cl, %dl
1397-
; FAST-NEXT: orb %r8b, %dl
1398-
; FAST-NEXT: andb $1, %dl
1382+
; FAST-NEXT: notq %rsi
1383+
; FAST-NEXT: xorl %edx, %edx
1384+
; FAST-NEXT: movq %rsi, %rax
13991385
; FAST-NEXT: retq
14001386
;
14011387
; KNL-LABEL: usuboovf:
14021388
; KNL: ## BB#0:
1403-
; KNL-NEXT: subq %rdi, %rdi
1404-
; KNL-NEXT: sbbb %dl, %dl
1405-
; KNL-NEXT: movq $-1, %rax
1406-
; KNL-NEXT: subq %rsi, %rax
1407-
; KNL-NEXT: sbbb %cl, %cl
1408-
; KNL-NEXT: orb %dl, %cl
1409-
; KNL-NEXT: subq %rdi, %rax
1410-
; KNL-NEXT: sbbb %dl, %dl
1411-
; KNL-NEXT: orb %cl, %dl
1389+
; KNL-NEXT: notq %rsi
1390+
; KNL-NEXT: xorl %edx, %edx
1391+
; KNL-NEXT: movq %rsi, %rax
14121392
; KNL-NEXT: retq
14131393
%t0 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 %a)
14141394
%v0 = extractvalue {i64, i1} %t0, 0

0 commit comments

Comments
 (0)