LLVM: lib/Target/NVPTX/NVVMIntrRange.cpp Source File (original) (raw)

61 struct Vector3 {

62 unsigned X, Y, Z;

63 };

64

65

67 return false;

68

72

73

74 if (!(OverallReqNTID || OverallMaxNTID || OverallClusterRank))

75 return false;

76

77 const unsigned FunctionNTID = OverallReqNTID.value_or(

78 OverallMaxNTID.value_or(std::numeric_limits::max()));

79

80 const unsigned FunctionClusterRank =

81 OverallClusterRank.value_or(std::numeric_limits::max());

82

83 const Vector3 MaxBlockSize{std::min(1024u, FunctionNTID),

84 std::min(1024u, FunctionNTID),

85 std::min(64u, FunctionNTID)};

86

87

88

89 const Vector3 MaxClusterRank{std::min(0x7fffffffu, FunctionClusterRank),

90 std::min(0xffffu, FunctionClusterRank),

91 std::min(0xffffu, FunctionClusterRank)};

92

93 const auto ProccessIntrinsic = [&](IntrinsicInst *II) -> bool {

94 switch (II->getIntrinsicID()) {

95

96 case Intrinsic::nvvm_read_ptx_sreg_tid_x:

97 return addRangeAttr(0, MaxBlockSize.X, II);

98 case Intrinsic::nvvm_read_ptx_sreg_tid_y:

99 return addRangeAttr(0, MaxBlockSize.Y, II);

100 case Intrinsic::nvvm_read_ptx_sreg_tid_z:

101 return addRangeAttr(0, MaxBlockSize.Z, II);

102

103

104 case Intrinsic::nvvm_read_ptx_sreg_ntid_x:

105 return addRangeAttr(1, MaxBlockSize.X + 1, II);

106 case Intrinsic::nvvm_read_ptx_sreg_ntid_y:

107 return addRangeAttr(1, MaxBlockSize.Y + 1, II);

108 case Intrinsic::nvvm_read_ptx_sreg_ntid_z:

109 return addRangeAttr(1, MaxBlockSize.Z + 1, II);

110

111

112 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_x:

113 return addRangeAttr(0, MaxClusterRank.X, II);

114 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_y:

115 return addRangeAttr(0, MaxClusterRank.Y, II);

116 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_z:

117 return addRangeAttr(0, MaxClusterRank.Z, II);

118 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_x:

119 return addRangeAttr(1, MaxClusterRank.X + 1, II);

120 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_y:

121 return addRangeAttr(1, MaxClusterRank.Y + 1, II);

122 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_z:

123 return addRangeAttr(1, MaxClusterRank.Z + 1, II);

124

125 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctarank:

126 if (OverallClusterRank)

127 return addRangeAttr(0, FunctionClusterRank, II);

128 break;

129 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctarank:

130 if (OverallClusterRank)

131 return addRangeAttr(1, FunctionClusterRank + 1, II);

132 break;

133 default:

134 return false;

135 }

136 return false;

137 };

138

139

143 Changed |= ProccessIntrinsic(II);

144

146}