Skip to content

Commit 92af8b4

Browse files
committed
[TargetLowering][SelectionDAG] Exploit nneg Flag in UINT_TO_FP
1. Propogate the nneg flag in WidenVecRes 2. Use SINT_TO_FP in expandUINT_TO_FP when possible.
1 parent 68e4518 commit 92af8b4

File tree

3 files changed

+29
-11
lines changed

3 files changed

+29
-11
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5205,7 +5205,7 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {
52055205
if (N->getOpcode() == ISD::ZERO_EXTEND &&
52065206
getTypeAction(InVT) == TargetLowering::TypePromoteInteger &&
52075207
TLI.getTypeToTransformTo(Ctx, InVT).getScalarSizeInBits() !=
5208-
WidenVT.getScalarSizeInBits()) {
5208+
WidenVT.getScalarSizeInBits()) {
52095209
InOp = ZExtPromotedInteger(InOp);
52105210
InVT = InOp.getValueType();
52115211
if (WidenVT.getScalarSizeInBits() < InVT.getScalarSizeInBits())
@@ -5222,7 +5222,7 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {
52225222
InVTEC = InVT.getVectorElementCount();
52235223
if (InVTEC == WidenEC) {
52245224
if (N->getNumOperands() == 1)
5225-
return DAG.getNode(Opcode, DL, WidenVT, InOp);
5225+
return DAG.getNode(Opcode, DL, WidenVT, InOp, Flags);
52265226
if (N->getNumOperands() == 3) {
52275227
assert(N->isVPOpcode() && "Expected VP opcode");
52285228
SDValue Mask =
@@ -5258,7 +5258,7 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {
52585258
Ops[0] = InOp;
52595259
SDValue InVec = DAG.getNode(ISD::CONCAT_VECTORS, DL, InWidenVT, Ops);
52605260
if (N->getNumOperands() == 1)
5261-
return DAG.getNode(Opcode, DL, WidenVT, InVec);
5261+
return DAG.getNode(Opcode, DL, WidenVT, InVec, Flags);
52625262
return DAG.getNode(Opcode, DL, WidenVT, InVec, N->getOperand(1), Flags);
52635263
}
52645264

@@ -5267,7 +5267,7 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {
52675267
DAG.getVectorIdxConstant(0, DL));
52685268
// Extract the input and convert the shorten input vector.
52695269
if (N->getNumOperands() == 1)
5270-
return DAG.getNode(Opcode, DL, WidenVT, InVal);
5270+
return DAG.getNode(Opcode, DL, WidenVT, InVal, Flags);
52715271
return DAG.getNode(Opcode, DL, WidenVT, InVal, N->getOperand(1), Flags);
52725272
}
52735273
}
@@ -5282,7 +5282,7 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {
52825282
SDValue Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, InEltVT, InOp,
52835283
DAG.getVectorIdxConstant(i, DL));
52845284
if (N->getNumOperands() == 1)
5285-
Ops[i] = DAG.getNode(Opcode, DL, EltVT, Val);
5285+
Ops[i] = DAG.getNode(Opcode, DL, EltVT, Val, Flags);
52865286
else
52875287
Ops[i] = DAG.getNode(Opcode, DL, EltVT, Val, N->getOperand(1), Flags);
52885288
}

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8361,18 +8361,26 @@ bool TargetLowering::expandFP_TO_UINT(SDNode *Node, SDValue &Result,
83618361
}
83628362

83638363
bool TargetLowering::expandUINT_TO_FP(SDNode *Node, SDValue &Result,
8364-
SDValue &Chain,
8365-
SelectionDAG &DAG) const {
8364+
SDValue &Chain, SelectionDAG &DAG) const {
8365+
SDValue Src = Node->getOperand(0);
8366+
EVT SrcVT = Src.getValueType();
8367+
EVT DstVT = Node->getValueType(0);
8368+
8369+
// If the input is known to be non-negative and SINT_TO_FP is legal then use
8370+
// it.
8371+
if (Node->getFlags().hasNonNeg() &&
8372+
isOperationLegalOrCustom(ISD::SINT_TO_FP, DstVT)) {
8373+
Result =
8374+
DAG.getNode(ISD::SINT_TO_FP, SDLoc(Node), DstVT, Node->getOperand(0));
8375+
return true;
8376+
}
8377+
83668378
// This transform is not correct for converting 0 when rounding mode is set
83678379
// to round toward negative infinity which will produce -0.0. So disable under
83688380
// strictfp.
83698381
if (Node->isStrictFPOpcode())
83708382
return false;
83718383

8372-
SDValue Src = Node->getOperand(0);
8373-
EVT SrcVT = Src.getValueType();
8374-
EVT DstVT = Node->getValueType(0);
8375-
83768384
if (SrcVT.getScalarType() != MVT::i64 || DstVT.getScalarType() != MVT::f64)
83778385
return false;
83788386

llvm/test/CodeGen/VE/Scalar/cast.ll

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,16 @@ define float @ull2f(i64 %x) {
568568
ret float %r
569569
}
570570

571+
define float @ull2f_nneg(i64 %x) {
572+
; CHECK-LABEL: ull2f_nneg:
573+
; CHECK: # %bb.0:
574+
; CHECK-NEXT: cvt.d.l %s0, %s0
575+
; CHECK-NEXT: cvt.s.d %s0, %s0
576+
; CHECK-NEXT: b.l.t (, %s10)
577+
%r = uitofp nneg i64 %x to float
578+
ret float %r
579+
}
580+
571581
define double @ull2d(i64 %x) {
572582
; CHECK-LABEL: ull2d:
573583
; CHECK: # %bb.0:

0 commit comments

Comments
 (0)