Skip to content

Commit 875afa9

Browse files
authored
[X86][CodeGen] Add base atan2 intrinsic lowering (p4) (llvm#110760)
This change is part of this proposal: https://discourse.llvm.org/t/rfc-all-the-math-intrinsics/78294 Based on example PR llvm#96222 and fix PR llvm#101268, with some differences due to 2-arg intrinsic and intermediate refactor (RuntimeLibCalls.cpp). - Add llvm.experimental.constrained.atan2 - Intrinsics.td, ConstrainedOps.def, LangRef.rst - Add to ISDOpcodes.h and TargetSelectionDAG.td, connect to intrinsic in BasicTTIImpl.h, and LibFunc_ in SelectionDAGBuilder.cpp - Update LegalizeDAG.cpp, LegalizeFloatTypes.cpp, LegalizeVectorOps.cpp, and LegalizeVectorTypes.cpp - Update isKnownNeverNaN in SelectionDAG.cpp - Update SelectionDAGDumper.cpp - Update libcalls - RuntimeLibcalls.def, RuntimeLibcalls.cpp - TargetLoweringBase.cpp - Expand for vectors, promote f16 - X86ISelLowering.cpp - Expand f80, promote f32 to f64 for MSVC Part 4 for Implement the atan2 HLSL Function llvm#70096.
1 parent 835feaa commit 875afa9

24 files changed

+574
-4
lines changed

llvm/include/llvm/CodeGen/BasicTTIImpl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,6 +1998,9 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
19981998
case Intrinsic::atan:
19991999
ISD = ISD::FATAN;
20002000
break;
2001+
case Intrinsic::atan2:
2002+
ISD = ISD::FATAN2;
2003+
break;
20012004
case Intrinsic::sinh:
20022005
ISD = ISD::FSINH;
20032006
break;

llvm/include/llvm/CodeGen/ISDOpcodes.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ enum NodeType {
425425
STRICT_FASIN,
426426
STRICT_FACOS,
427427
STRICT_FATAN,
428+
STRICT_FATAN2,
428429
STRICT_FSINH,
429430
STRICT_FCOSH,
430431
STRICT_FTANH,
@@ -994,6 +995,8 @@ enum NodeType {
994995
FPOWI,
995996
/// FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
996997
FLDEXP,
998+
/// FATAN2 - atan2, inspired by libm.
999+
FATAN2,
9971000

9981001
/// FFREXP - frexp, extract fractional and exponent component of a
9991002
/// floating-point value. Returns the two components as separate return

llvm/include/llvm/IR/ConstrainedOps.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ CMP_INSTRUCTION(FCmp, 2, 0, experimental_constrained_fcmps, FSETCCS
7272
DAG_FUNCTION(acos, 1, 1, experimental_constrained_acos, FACOS)
7373
DAG_FUNCTION(asin, 1, 1, experimental_constrained_asin, FASIN)
7474
DAG_FUNCTION(atan, 1, 1, experimental_constrained_atan, FATAN)
75+
DAG_FUNCTION(atan2, 2, 1, experimental_constrained_atan2, FATAN2)
7576
DAG_FUNCTION(ceil, 1, 0, experimental_constrained_ceil, FCEIL)
7677
DAG_FUNCTION(cos, 1, 1, experimental_constrained_cos, FCOS)
7778
DAG_FUNCTION(cosh, 1, 1, experimental_constrained_cosh, FCOSH)

llvm/include/llvm/IR/Intrinsics.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,6 +1235,11 @@ let IntrProperties = [IntrInaccessibleMemOnly, IntrWillReturn, IntrStrictFP] in
12351235
[ LLVMMatchType<0>,
12361236
llvm_metadata_ty,
12371237
llvm_metadata_ty ]>;
1238+
def int_experimental_constrained_atan2 : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ],
1239+
[ LLVMMatchType<0>,
1240+
LLVMMatchType<0>,
1241+
llvm_metadata_ty,
1242+
llvm_metadata_ty ]>;
12381243
def int_experimental_constrained_sin : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ],
12391244
[ LLVMMatchType<0>,
12401245
llvm_metadata_ty,

llvm/include/llvm/IR/RuntimeLibcalls.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,11 @@ HANDLE_LIBCALL(ATAN_F64, "atan")
232232
HANDLE_LIBCALL(ATAN_F80, "atanl")
233233
HANDLE_LIBCALL(ATAN_F128,"atanl")
234234
HANDLE_LIBCALL(ATAN_PPCF128, "atanl")
235+
HANDLE_LIBCALL(ATAN2_F32, "atan2f")
236+
HANDLE_LIBCALL(ATAN2_F64, "atan2")
237+
HANDLE_LIBCALL(ATAN2_F80, "atan2l")
238+
HANDLE_LIBCALL(ATAN2_F128,"atan2l")
239+
HANDLE_LIBCALL(ATAN2_PPCF128, "atan2l")
235240
HANDLE_LIBCALL(SINCOS_F32, nullptr)
236241
HANDLE_LIBCALL(SINCOS_F64, nullptr)
237242
HANDLE_LIBCALL(SINCOS_F80, nullptr)

llvm/include/llvm/Target/TargetSelectionDAG.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@ def ftan : SDNode<"ISD::FTAN" , SDTFPUnaryOp>;
534534
def fasin : SDNode<"ISD::FASIN" , SDTFPUnaryOp>;
535535
def facos : SDNode<"ISD::FACOS" , SDTFPUnaryOp>;
536536
def fatan : SDNode<"ISD::FATAN" , SDTFPUnaryOp>;
537+
def fatan2 : SDNode<"ISD::FATAN2" , SDTFPBinOp>;
537538
def fsinh : SDNode<"ISD::FSINH" , SDTFPUnaryOp>;
538539
def fcosh : SDNode<"ISD::FCOSH" , SDTFPUnaryOp>;
539540
def ftanh : SDNode<"ISD::FTANH" , SDTFPUnaryOp>;
@@ -602,6 +603,8 @@ def strict_facos : SDNode<"ISD::STRICT_FACOS",
602603
SDTFPUnaryOp, [SDNPHasChain]>;
603604
def strict_fatan : SDNode<"ISD::STRICT_FATAN",
604605
SDTFPUnaryOp, [SDNPHasChain]>;
606+
def strict_fatan2 : SDNode<"ISD::STRICT_FATAN2",
607+
SDTFPBinOp, [SDNPHasChain]>;
605608
def strict_fsinh : SDNode<"ISD::STRICT_FSINH",
606609
SDTFPUnaryOp, [SDNPHasChain]>;
607610
def strict_fcosh : SDNode<"ISD::STRICT_FCOSH",
@@ -1588,6 +1591,9 @@ def any_facos : PatFrags<(ops node:$src),
15881591
def any_fatan : PatFrags<(ops node:$src),
15891592
[(strict_fatan node:$src),
15901593
(fatan node:$src)]>;
1594+
def any_fatan2 : PatFrags<(ops node:$src1, node:$src2),
1595+
[(strict_fatan2 node:$src1, node:$src2),
1596+
(fatan2 node:$src1, node:$src2)]>;
15911597
def any_fsinh : PatFrags<(ops node:$src),
15921598
[(strict_fsinh node:$src),
15931599
(fsinh node:$src)]>;

llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4600,6 +4600,11 @@ void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode *Node) {
46004600
ExpandFPLibCall(Node, RTLIB::ATAN_F32, RTLIB::ATAN_F64, RTLIB::ATAN_F80,
46014601
RTLIB::ATAN_F128, RTLIB::ATAN_PPCF128, Results);
46024602
break;
4603+
case ISD::FATAN2:
4604+
case ISD::STRICT_FATAN2:
4605+
ExpandFPLibCall(Node, RTLIB::ATAN2_F32, RTLIB::ATAN2_F64, RTLIB::ATAN2_F80,
4606+
RTLIB::ATAN2_F128, RTLIB::ATAN2_PPCF128, Results);
4607+
break;
46034608
case ISD::FSINH:
46044609
case ISD::STRICT_FSINH:
46054610
ExpandFPLibCall(Node, RTLIB::SINH_F32, RTLIB::SINH_F64, RTLIB::SINH_F80,
@@ -5486,6 +5491,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
54865491
case ISD::FMINIMUMNUM:
54875492
case ISD::FMAXIMUMNUM:
54885493
case ISD::FPOW:
5494+
case ISD::FATAN2:
54895495
Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
54905496
Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1));
54915497
Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2,
@@ -5502,6 +5508,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
55025508
case ISD::STRICT_FMAXNUM:
55035509
case ISD::STRICT_FREM:
55045510
case ISD::STRICT_FPOW:
5511+
case ISD::STRICT_FATAN2:
55055512
Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
55065513
{Node->getOperand(0), Node->getOperand(1)});
55075514
Tmp2 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},

llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) {
8484
case ISD::FASIN: R = SoftenFloatRes_FASIN(N); break;
8585
case ISD::STRICT_FATAN:
8686
case ISD::FATAN: R = SoftenFloatRes_FATAN(N); break;
87+
case ISD::STRICT_FATAN2:
88+
case ISD::FATAN2: R = SoftenFloatRes_FATAN2(N); break;
8789
case ISD::FCBRT: R = SoftenFloatRes_FCBRT(N); break;
8890
case ISD::STRICT_FCEIL:
8991
case ISD::FCEIL: R = SoftenFloatRes_FCEIL(N); break;
@@ -366,6 +368,13 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FATAN(SDNode *N) {
366368
RTLIB::ATAN_F80, RTLIB::ATAN_F128, RTLIB::ATAN_PPCF128));
367369
}
368370

371+
SDValue DAGTypeLegalizer::SoftenFloatRes_FATAN2(SDNode *N) {
372+
return SoftenFloatRes_Binary(
373+
N,
374+
GetFPLibCall(N->getValueType(0), RTLIB::ATAN2_F32, RTLIB::ATAN2_F64,
375+
RTLIB::ATAN2_F80, RTLIB::ATAN2_F128, RTLIB::ATAN2_PPCF128));
376+
}
377+
369378
SDValue DAGTypeLegalizer::SoftenFloatRes_FCBRT(SDNode *N) {
370379
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
371380
RTLIB::CBRT_F32,
@@ -1430,6 +1439,8 @@ void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) {
14301439
case ISD::FASIN: ExpandFloatRes_FASIN(N, Lo, Hi); break;
14311440
case ISD::STRICT_FATAN:
14321441
case ISD::FATAN: ExpandFloatRes_FATAN(N, Lo, Hi); break;
1442+
case ISD::STRICT_FATAN2:
1443+
case ISD::FATAN2: ExpandFloatRes_FATAN2(N, Lo, Hi); break;
14331444
case ISD::FCBRT: ExpandFloatRes_FCBRT(N, Lo, Hi); break;
14341445
case ISD::STRICT_FCEIL:
14351446
case ISD::FCEIL: ExpandFloatRes_FCEIL(N, Lo, Hi); break;
@@ -1631,6 +1642,15 @@ void DAGTypeLegalizer::ExpandFloatRes_FATAN(SDNode *N, SDValue &Lo,
16311642
Lo, Hi);
16321643
}
16331644

1645+
void DAGTypeLegalizer::ExpandFloatRes_FATAN2(SDNode *N, SDValue &Lo,
1646+
SDValue &Hi) {
1647+
ExpandFloatRes_Binary(N,
1648+
GetFPLibCall(N->getValueType(0), RTLIB::ATAN2_F32,
1649+
RTLIB::ATAN2_F64, RTLIB::ATAN2_F80,
1650+
RTLIB::ATAN2_F128, RTLIB::ATAN2_PPCF128),
1651+
Lo, Hi);
1652+
}
1653+
16341654
void DAGTypeLegalizer::ExpandFloatRes_FCBRT(SDNode *N, SDValue &Lo,
16351655
SDValue &Hi) {
16361656
ExpandFloatRes_Unary(N, GetFPLibCall(N->getValueType(0), RTLIB::CBRT_F32,
@@ -2673,6 +2693,7 @@ void DAGTypeLegalizer::PromoteFloatResult(SDNode *N, unsigned ResNo) {
26732693
case ISD::FMINNUM_IEEE:
26742694
case ISD::FMUL:
26752695
case ISD::FPOW:
2696+
case ISD::FATAN2:
26762697
case ISD::FREM:
26772698
case ISD::FSUB: R = PromoteFloatRes_BinOp(N); break;
26782699

@@ -3115,6 +3136,7 @@ void DAGTypeLegalizer::SoftPromoteHalfResult(SDNode *N, unsigned ResNo) {
31153136
case ISD::FMINNUM:
31163137
case ISD::FMUL:
31173138
case ISD::FPOW:
3139+
case ISD::FATAN2:
31183140
case ISD::FREM:
31193141
case ISD::FSUB: R = SoftPromoteHalfRes_BinOp(N); break;
31203142

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
567567
SDValue SoftenFloatRes_FACOS(SDNode *N);
568568
SDValue SoftenFloatRes_FASIN(SDNode *N);
569569
SDValue SoftenFloatRes_FATAN(SDNode *N);
570+
SDValue SoftenFloatRes_FATAN2(SDNode *N);
570571
SDValue SoftenFloatRes_FMINNUM(SDNode *N);
571572
SDValue SoftenFloatRes_FMAXNUM(SDNode *N);
572573
SDValue SoftenFloatRes_FMINIMUMNUM(SDNode *N);
@@ -661,6 +662,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
661662
void ExpandFloatRes_FACOS (SDNode *N, SDValue &Lo, SDValue &Hi);
662663
void ExpandFloatRes_FASIN (SDNode *N, SDValue &Lo, SDValue &Hi);
663664
void ExpandFloatRes_FATAN (SDNode *N, SDValue &Lo, SDValue &Hi);
665+
void ExpandFloatRes_FATAN2 (SDNode *N, SDValue &Lo, SDValue &Hi);
664666
void ExpandFloatRes_FMINNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
665667
void ExpandFloatRes_FMAXNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
666668
void ExpandFloatRes_FMINIMUMNUM(SDNode *N, SDValue &Lo, SDValue &Hi);

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
410410
case ISD::FASIN:
411411
case ISD::FACOS:
412412
case ISD::FATAN:
413+
case ISD::FATAN2:
413414
case ISD::FSINH:
414415
case ISD::FCOSH:
415416
case ISD::FTANH:

0 commit comments

Comments
 (0)