forked from OSchip/llvm-project
[LegalizeTypes][NVPTX] Remove extra compare from fallback code for ISD::ADD in ExpandIntRes_ADDSUB.
This is the ultimate fallback code if UADDO isn't supported. If the target uses 0/1 we used one compare, but if the target doesn't use 0/1 we emitted two compares. Regardless of boolean constants we should only need to check that the Result is less than one of the original operands. So we only need one compare. Reviewed By: spatel Differential Revision: https://reviews.llvm.org/D133708
This commit is contained in:
parent
393a17b5d1
commit
efd5acf120
|
@ -2988,23 +2988,17 @@ void DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N,
|
|||
if (N->getOpcode() == ISD::ADD) {
|
||||
Lo = DAG.getNode(ISD::ADD, dl, NVT, LoOps);
|
||||
Hi = DAG.getNode(ISD::ADD, dl, NVT, makeArrayRef(HiOps, 2));
|
||||
SDValue Cmp1 = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[0],
|
||||
ISD::SETULT);
|
||||
SDValue Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[0],
|
||||
ISD::SETULT);
|
||||
|
||||
if (BoolType == TargetLoweringBase::ZeroOrOneBooleanContent) {
|
||||
SDValue Carry = DAG.getZExtOrTrunc(Cmp1, dl, NVT);
|
||||
Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry);
|
||||
return;
|
||||
}
|
||||
SDValue Carry;
|
||||
if (BoolType == TargetLoweringBase::ZeroOrOneBooleanContent)
|
||||
Carry = DAG.getZExtOrTrunc(Cmp, dl, NVT);
|
||||
else
|
||||
Carry = DAG.getSelect(dl, NVT, Cmp, DAG.getConstant(1, dl, NVT),
|
||||
DAG.getConstant(0, dl, NVT));
|
||||
|
||||
SDValue Carry1 = DAG.getSelect(dl, NVT, Cmp1,
|
||||
DAG.getConstant(1, dl, NVT),
|
||||
DAG.getConstant(0, dl, NVT));
|
||||
SDValue Cmp2 = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[1],
|
||||
ISD::SETULT);
|
||||
SDValue Carry2 = DAG.getSelect(dl, NVT, Cmp2,
|
||||
DAG.getConstant(1, dl, NVT), Carry1);
|
||||
Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry2);
|
||||
Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry);
|
||||
} else {
|
||||
Lo = DAG.getNode(ISD::SUB, dl, NVT, LoOps);
|
||||
Hi = DAG.getNode(ISD::SUB, dl, NVT, makeArrayRef(HiOps, 2));
|
||||
|
|
|
@ -7,10 +7,9 @@ target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
|||
; COMMON-LABEL: test_add
|
||||
define i128 @test_add(i128 %a, i128 %b) {
|
||||
; NOCARRY: add.s64
|
||||
; NOCARRY-NEXT: setp.lt.u64
|
||||
; NOCARRY-NEXT: add.s64
|
||||
; NOCARRY-NEXT: setp.lt.u64
|
||||
; NOCARRY-NEXT: selp.u64
|
||||
; NOCARRY-NEXT: selp.b64
|
||||
; NOCARRY-NEXT: add.s64
|
||||
|
||||
; CARRY: add.cc.s64
|
||||
|
|
Loading…
Reference in New Issue