Skip to content

Commit 2b4fff6

Browse files
authored
[TargetLowering] Only freeze LHS and RHS if they are used multiple times in expandABD (#156193)
Not all paths in expandABD are using LHS and RHS twice.
1 parent 917f078 commit 2b4fff6

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9733,43 +9733,46 @@ SDValue TargetLowering::expandABS(SDNode *N, SelectionDAG &DAG,
97339733
SDValue TargetLowering::expandABD(SDNode *N, SelectionDAG &DAG) const {
97349734
SDLoc dl(N);
97359735
EVT VT = N->getValueType(0);
9736-
SDValue LHS = DAG.getFreeze(N->getOperand(0));
9737-
SDValue RHS = DAG.getFreeze(N->getOperand(1));
9736+
SDValue LHS = N->getOperand(0);
9737+
SDValue RHS = N->getOperand(1);
97389738
bool IsSigned = N->getOpcode() == ISD::ABDS;
97399739

97409740
// abds(lhs, rhs) -> sub(smax(lhs,rhs), smin(lhs,rhs))
97419741
// abdu(lhs, rhs) -> sub(umax(lhs,rhs), umin(lhs,rhs))
97429742
unsigned MaxOpc = IsSigned ? ISD::SMAX : ISD::UMAX;
97439743
unsigned MinOpc = IsSigned ? ISD::SMIN : ISD::UMIN;
97449744
if (isOperationLegal(MaxOpc, VT) && isOperationLegal(MinOpc, VT)) {
9745+
LHS = DAG.getFreeze(LHS);
9746+
RHS = DAG.getFreeze(RHS);
97459747
SDValue Max = DAG.getNode(MaxOpc, dl, VT, LHS, RHS);
97469748
SDValue Min = DAG.getNode(MinOpc, dl, VT, LHS, RHS);
97479749
return DAG.getNode(ISD::SUB, dl, VT, Max, Min);
97489750
}
97499751

97509752
// abdu(lhs, rhs) -> or(usubsat(lhs,rhs), usubsat(rhs,lhs))
9751-
if (!IsSigned && isOperationLegal(ISD::USUBSAT, VT))
9753+
if (!IsSigned && isOperationLegal(ISD::USUBSAT, VT)) {
9754+
LHS = DAG.getFreeze(LHS);
9755+
RHS = DAG.getFreeze(RHS);
97529756
return DAG.getNode(ISD::OR, dl, VT,
97539757
DAG.getNode(ISD::USUBSAT, dl, VT, LHS, RHS),
97549758
DAG.getNode(ISD::USUBSAT, dl, VT, RHS, LHS));
9759+
}
97559760

97569761
// If the subtract doesn't overflow then just use abs(sub())
9757-
// NOTE: don't use frozen operands for value tracking.
9758-
bool IsNonNegative = DAG.SignBitIsZero(N->getOperand(1)) &&
9759-
DAG.SignBitIsZero(N->getOperand(0));
9762+
bool IsNonNegative = DAG.SignBitIsZero(LHS) && DAG.SignBitIsZero(RHS);
97609763

9761-
if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, N->getOperand(0),
9762-
N->getOperand(1)))
9764+
if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, LHS, RHS))
97639765
return DAG.getNode(ISD::ABS, dl, VT,
97649766
DAG.getNode(ISD::SUB, dl, VT, LHS, RHS));
97659767

9766-
if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, N->getOperand(1),
9767-
N->getOperand(0)))
9768+
if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, RHS, LHS))
97689769
return DAG.getNode(ISD::ABS, dl, VT,
97699770
DAG.getNode(ISD::SUB, dl, VT, RHS, LHS));
97709771

97719772
EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
97729773
ISD::CondCode CC = IsSigned ? ISD::CondCode::SETGT : ISD::CondCode::SETUGT;
9774+
LHS = DAG.getFreeze(LHS);
9775+
RHS = DAG.getFreeze(RHS);
97739776
SDValue Cmp = DAG.getSetCC(dl, CCVT, LHS, RHS, CC);
97749777

97759778
// Branchless expansion iff cmp result is allbits:

llvm/test/CodeGen/Thumb2/abds-crash.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ define void @vp8_rd_pick_inter_mode() {
99
; CHECK-NEXT: push {r4, lr}
1010
; CHECK-NEXT: movs r4, #0
1111
; CHECK-NEXT: ldr r0, [r0]
12-
; CHECK-NEXT: ldr r1, [r4]
13-
; CHECK-NEXT: movs r2, #180
14-
; CHECK-NEXT: str r0, [r2]
15-
; CHECK-NEXT: movs r2, #188
12+
; CHECK-NEXT: ldr r2, [r4]
13+
; CHECK-NEXT: movs r1, #180
14+
; CHECK-NEXT: str r0, [r1]
15+
; CHECK-NEXT: movs r1, #188
1616
; CHECK-NEXT: sxth r0, r0
17-
; CHECK-NEXT: str r1, [r2]
18-
; CHECK-NEXT: sxth r1, r1
17+
; CHECK-NEXT: str r2, [r1]
18+
; CHECK-NEXT: sxth r1, r2
1919
; CHECK-NEXT: subs r0, r0, r1
2020
; CHECK-NEXT: it mi
2121
; CHECK-NEXT: rsbmi r0, r0, #0

0 commit comments

Comments
 (0)