Skip to content

Commit c6ce937

Browse files
authored
[Hexagon] Implement @llvm.readsteadycounter() (#93247)
This commit was inspired by @kparzysz's ab57c2b ([Hexagon] Implement @llvm.readcyclecounter(), 2017-02-22)
1 parent bb02bf7 commit c6ce937

File tree

4 files changed

+34
-0
lines changed

4 files changed

+34
-0
lines changed

llvm/lib/Target/Hexagon/HexagonISelLowering.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,18 @@ SDValue HexagonTargetLowering::LowerREADCYCLECOUNTER(SDValue Op,
732732
return DAG.getNode(HexagonISD::READCYCLE, dl, VTs, Chain);
733733
}
734734

735+
// Custom-handle ISD::READSTEADYCOUNTER because the target-independent SDNode
736+
// is marked as having side-effects, while the register read on Hexagon does
737+
// not have any. TableGen refuses to accept the direct pattern from that node
738+
// to the A4_tfrcpp.
739+
SDValue HexagonTargetLowering::LowerREADSTEADYCOUNTER(SDValue Op,
740+
SelectionDAG &DAG) const {
741+
SDValue Chain = Op.getOperand(0);
742+
SDLoc dl(Op);
743+
SDVTList VTs = DAG.getVTList(MVT::i64, MVT::Other);
744+
return DAG.getNode(HexagonISD::READTIMER, dl, VTs, Chain);
745+
}
746+
735747
SDValue HexagonTargetLowering::LowerINTRINSIC_VOID(SDValue Op,
736748
SelectionDAG &DAG) const {
737749
SDValue Chain = Op.getOperand(0);
@@ -1507,6 +1519,7 @@ HexagonTargetLowering::HexagonTargetLowering(const TargetMachine &TM,
15071519
setOperationAction(ISD::INLINEASM_BR, MVT::Other, Custom);
15081520
setOperationAction(ISD::PREFETCH, MVT::Other, Custom);
15091521
setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Custom);
1522+
setOperationAction(ISD::READSTEADYCOUNTER, MVT::i64, Custom);
15101523
setOperationAction(ISD::INTRINSIC_VOID, MVT::Other, Custom);
15111524
setOperationAction(ISD::EH_RETURN, MVT::Other, Custom);
15121525
setOperationAction(ISD::GLOBAL_OFFSET_TABLE, MVT::i32, Custom);
@@ -1932,6 +1945,7 @@ const char* HexagonTargetLowering::getTargetNodeName(unsigned Opcode) const {
19321945
case HexagonISD::VINSERTW0: return "HexagonISD::VINSERTW0";
19331946
case HexagonISD::VROR: return "HexagonISD::VROR";
19341947
case HexagonISD::READCYCLE: return "HexagonISD::READCYCLE";
1948+
case HexagonISD::READTIMER: return "HexagonISD::READTIMER";
19351949
case HexagonISD::PTRUE: return "HexagonISD::PTRUE";
19361950
case HexagonISD::PFALSE: return "HexagonISD::PFALSE";
19371951
case HexagonISD::D2P: return "HexagonISD::D2P";
@@ -3389,6 +3403,7 @@ HexagonTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
33893403
case ISD::INTRINSIC_VOID: return LowerINTRINSIC_VOID(Op, DAG);
33903404
case ISD::PREFETCH: return LowerPREFETCH(Op, DAG);
33913405
case ISD::READCYCLECOUNTER: return LowerREADCYCLECOUNTER(Op, DAG);
3406+
case ISD::READSTEADYCOUNTER: return LowerREADSTEADYCOUNTER(Op, DAG);
33923407
break;
33933408
}
33943409

llvm/lib/Target/Hexagon/HexagonISelLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ enum NodeType : unsigned {
7777
EH_RETURN,
7878
DCFETCH,
7979
READCYCLE,
80+
READTIMER,
8081
PTRUE,
8182
PFALSE,
8283
D2P, // Convert 8-byte value to 8-bit predicate register. [*]
@@ -207,6 +208,7 @@ class HexagonTargetLowering : public TargetLowering {
207208
SDValue LowerFDIV(SDValue Op, SelectionDAG &DAG) const;
208209
SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG) const;
209210
SDValue LowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
211+
SDValue LowerREADSTEADYCOUNTER(SDValue Op, SelectionDAG &DAG) const;
210212
SDValue LowerEH_LABEL(SDValue Op, SelectionDAG &DAG) const;
211213
SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
212214
SDValue

llvm/lib/Target/Hexagon/HexagonPatterns.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3392,6 +3392,12 @@ def HexagonREADCYCLE: SDNode<"HexagonISD::READCYCLE", SDTInt64Leaf,
33923392

33933393
def: Pat<(HexagonREADCYCLE), (A4_tfrcpp UPCYCLE)>;
33943394

3395+
// Read time counter.
3396+
def HexagonREADTIMER: SDNode<"HexagonISD::READTIMER", SDTInt64Leaf,
3397+
[SDNPHasChain]>;
3398+
3399+
def: Pat<(HexagonREADTIMER), (A4_tfrcpp UTIMER)>;
3400+
33953401
// The declared return value of the store-locked intrinsics is i32, but
33963402
// the instructions actually define i1. To avoid register copies from
33973403
// IntRegs to PredRegs and back, fold the entire pattern checking the
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
; RUN: llc -march=hexagon < %s | FileCheck %s
3+
4+
; CHECK-LABEL: test_readsteadycounter
5+
; CHECK: r1:0 = c31:30
6+
define i64 @test_readsteadycounter() nounwind {
7+
%t0 = call i64 @llvm.readsteadycounter()
8+
ret i64 %t0
9+
}
10+
11+
declare i64 @llvm.readsteadycounter()

0 commit comments

Comments
 (0)