@@ -69,37 +69,82 @@ struct IgnoreMatch {
6969};
7070
7171template <typename ConstT>
72- Optional <ConstT> matchConstant (Register Reg, const MachineRegisterInfo &MRI);
72+ std::optional <ConstT> matchConstant (Register Reg, const MachineRegisterInfo &MRI);
7373
7474template <>
75- inline Optional<ValueAndVReg>
76- matchConstant<ValueAndVReg>(Register Reg, const MachineRegisterInfo &MRI) {
75+ inline std::optional<std::optional<ValueAndVReg>>
76+ matchConstant<std::optional<ValueAndVReg>>(Register Reg,
77+ const MachineRegisterInfo &MRI) {
7778 return getIConstantVRegValWithLookThrough (Reg, MRI);
7879}
7980
8081template <>
81- inline Optional <APInt> matchConstant<APInt>(Register Reg,
82+ inline std::optional <APInt> matchConstant<APInt>(Register Reg,
8283 const MachineRegisterInfo &MRI) {
83- return matchConstant<ValueAndVReg>(Reg, MRI).map (
84- [](ValueAndVReg &&ValAndVReg) { return ValAndVReg.Value ; });
84+ const auto & Val = matchConstant<std::optional<ValueAndVReg>>(Reg, MRI);
85+ if (Val.has_value ())
86+ return { Val.value ()->Value };
87+ return { std::nullopt };
8588}
8689
8790template <>
88- inline Optional <const IgnoreMatch>
91+ inline std::optional <const IgnoreMatch>
8992matchConstant<const IgnoreMatch>(Register Reg, const MachineRegisterInfo &MRI) {
90- return matchConstant<APInt>(Reg, MRI). map (
91- []( const APInt &) -> const IgnoreMatch { return {}; }) ;
93+ matchConstant<APInt>(Reg, MRI);
94+ return std::optional< const IgnoreMatch>{ IgnoreMatch{} } ;
9295}
9396
94- template <typename ConstT>
95- inline std::optional<ConstT> matchConstant (Register Reg,
96- const MachineRegisterInfo &MRI) {
97+ template <>
98+ inline std::optional<int64_t > matchConstant<int64_t >(Register Reg,
99+ const MachineRegisterInfo &MRI) {
100+ auto Val = matchConstant<APInt>(Reg, MRI);
101+ if (Val && Val->getBitWidth () <= 64 )
102+ return Val->getSExtValue ();
103+ return std::nullopt ;
104+ }
105+
106+ template <>
107+ inline std::optional<uint64_t > matchConstant<uint64_t >(Register Reg,
108+ const MachineRegisterInfo &MRI) {
109+ auto Val = matchConstant<APInt>(Reg, MRI);
110+ if (Val && Val->getBitWidth () <= 64 )
111+ return Val->getSExtValue ();
112+ return std::nullopt ;
113+ }
114+
115+ template <>
116+ inline std::optional<unsigned char > matchConstant<unsigned char >(Register Reg,
117+ const MachineRegisterInfo &MRI) {
97118 auto Val = matchConstant<APInt>(Reg, MRI);
98119 if (Val && Val->getBitWidth () <= 64 )
99120 return Val->getSExtValue ();
100121 return std::nullopt ;
101122}
102123
124+ template <>
125+ inline std::optional<unsigned int > matchConstant<unsigned int >(Register Reg,
126+ const MachineRegisterInfo &MRI) {
127+ auto Val = matchConstant<APInt>(Reg, MRI);
128+ if (Val && Val->getBitWidth () <= 64 )
129+ return Val->getSExtValue ();
130+ return std::nullopt ;
131+ }
132+
133+ template <>
134+ inline std::optional<bool > matchConstant<bool >(Register Reg,
135+ const MachineRegisterInfo &MRI) {
136+ auto Val = matchConstant<APInt>(Reg, MRI);
137+ if (Val && Val->getBitWidth () <= 64 )
138+ return Val->getSExtValue ();
139+ return std::nullopt ;
140+ }
141+
142+ template <>
143+ inline std::optional<ValueAndVReg> matchConstant<ValueAndVReg>(Register Reg,
144+ const MachineRegisterInfo &MRI) {
145+ return getIConstantVRegValWithLookThrough (Reg, MRI);
146+ }
147+
103148template <typename ConstT> struct ConstantMatch {
104149 ConstT &CR;
105150 ConstantMatch (ConstT &C) : CR(C) {}
@@ -165,10 +210,12 @@ struct GCstAndRegMatch {
165210 bool match (const MachineRegisterInfo &MRI, Register Reg) {
166211 ValReg = getIConstantVRegValWithLookThrough (Reg, MRI);
167212 return ValReg ? true : false ;
168- }
213+ }
214+ };
169215
170216template <typename ConstT> inline ConstantMatch<ConstT> m_ICst (ConstT &Cst) {
171217 return {Cst};
218+ }
172219
173220inline GCstAndRegMatch m_GCst (std::optional<ValueAndVReg> &ValReg) {
174221 return GCstAndRegMatch (ValReg);
0 commit comments