@@ -59,7 +59,10 @@ class LegalizerHelper {
5959 MachineRegisterInfo &MRI;
6060 const LegalizerInfo &LI;
6161 const TargetLowering &TLI;
62- GISelValueTracking *VT;
62+
63+ // FIXME: Should probably make Libcalls mandatory
64+ const LibcallLoweringInfo *Libcalls = nullptr ;
65+ GISelValueTracking *VT = nullptr ;
6366
6467public:
6568 enum LegalizeResult {
@@ -78,12 +81,15 @@ class LegalizerHelper {
7881 // / Expose LegalizerInfo so the clients can re-use.
7982 const LegalizerInfo &getLegalizerInfo () const { return LI; }
8083 const TargetLowering &getTargetLowering () const { return TLI; }
84+ const LibcallLoweringInfo *getLibcallLoweringInfo () { return Libcalls; }
8185 GISelValueTracking *getValueTracking () const { return VT; }
8286
8387 LLVM_ABI LegalizerHelper (MachineFunction &MF, GISelChangeObserver &Observer,
84- MachineIRBuilder &B);
88+ MachineIRBuilder &B,
89+ const LibcallLoweringInfo *Libcalls = nullptr );
8590 LLVM_ABI LegalizerHelper (MachineFunction &MF, const LegalizerInfo &LI,
8691 GISelChangeObserver &Observer, MachineIRBuilder &B,
92+ const LibcallLoweringInfo *Libcalls = nullptr ,
8793 GISelValueTracking *VT = nullptr );
8894
8995 // / Replace \p MI by a sequence of legal instructions that can implement the
@@ -178,6 +184,37 @@ class LegalizerHelper {
178184 // / def by inserting a G_BITCAST from \p CastTy
179185 LLVM_ABI void bitcastDst (MachineInstr &MI, LLT CastTy, unsigned OpIdx);
180186
187+ // Useful for libcalls where all operands have the same type.
188+ LLVM_ABI LegalizeResult
189+ simpleLibcall (MachineInstr &MI, MachineIRBuilder &MIRBuilder, unsigned Size,
190+ Type *OpType, LostDebugLocObserver &LocObserver) const ;
191+
192+ LLVM_ABI LegalizeResult conversionLibcall (MachineInstr &MI, Type *ToType,
193+ Type *FromType,
194+ LostDebugLocObserver &LocObserver,
195+ bool IsSigned = false ) const ;
196+
197+ // / Helper function that creates a libcall to the given \p Name using the
198+ // / given calling convention \p CC.
199+ LLVM_ABI LegalizeResult createLibcall (const char *Name,
200+ const CallLowering::ArgInfo &Result,
201+ ArrayRef<CallLowering::ArgInfo> Args,
202+ CallingConv::ID CC,
203+ LostDebugLocObserver &LocObserver,
204+ MachineInstr *MI = nullptr ) const ;
205+
206+ // / Helper function that creates the given libcall.
207+ LLVM_ABI LegalizeResult createLibcall (RTLIB::Libcall Libcall,
208+ const CallLowering::ArgInfo &Result,
209+ ArrayRef<CallLowering::ArgInfo> Args,
210+ LostDebugLocObserver &LocObserver,
211+ MachineInstr *MI = nullptr ) const ;
212+
213+ // / Create a libcall to memcpy et al.
214+ LLVM_ABI LegalizeResult
215+ createMemLibcall (MachineRegisterInfo &MRI, MachineInstr &MI,
216+ LostDebugLocObserver &LocObserver) const ;
217+
181218private:
182219 LegalizeResult
183220 widenScalarMergeValues (MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
@@ -278,17 +315,13 @@ class LegalizerHelper {
278315 bool IsVolatile);
279316
280317 // Implements floating-point environment read/write via library function call.
281- LegalizeResult createGetStateLibcall (MachineIRBuilder &MIRBuilder,
282- MachineInstr &MI,
318+ LegalizeResult createGetStateLibcall (MachineInstr &MI,
283319 LostDebugLocObserver &LocObserver);
284- LegalizeResult createSetStateLibcall (MachineIRBuilder &MIRBuilder,
285- MachineInstr &MI,
320+ LegalizeResult createSetStateLibcall (MachineInstr &MI,
286321 LostDebugLocObserver &LocObserver);
287- LegalizeResult createResetStateLibcall (MachineIRBuilder &MIRBuilder,
288- MachineInstr &MI,
322+ LegalizeResult createResetStateLibcall (MachineInstr &MI,
289323 LostDebugLocObserver &LocObserver);
290- LegalizeResult createFCMPLibcall (MachineIRBuilder &MIRBuilder,
291- MachineInstr &MI,
324+ LegalizeResult createFCMPLibcall (MachineInstr &MI,
292325 LostDebugLocObserver &LocObserver);
293326
294327 MachineInstrBuilder
@@ -539,26 +572,6 @@ class LegalizerHelper {
539572 LLVM_ABI LegalizeResult lowerVAArg (MachineInstr &MI);
540573};
541574
542- // / Helper function that creates a libcall to the given \p Name using the given
543- // / calling convention \p CC.
544- LLVM_ABI LegalizerHelper::LegalizeResult
545- createLibcall (MachineIRBuilder &MIRBuilder, const char *Name,
546- const CallLowering::ArgInfo &Result,
547- ArrayRef<CallLowering::ArgInfo> Args, CallingConv::ID CC,
548- LostDebugLocObserver &LocObserver, MachineInstr *MI = nullptr );
549-
550- // / Helper function that creates the given libcall.
551- LLVM_ABI LegalizerHelper::LegalizeResult
552- createLibcall (MachineIRBuilder &MIRBuilder, RTLIB::Libcall Libcall,
553- const CallLowering::ArgInfo &Result,
554- ArrayRef<CallLowering::ArgInfo> Args,
555- LostDebugLocObserver &LocObserver, MachineInstr *MI = nullptr );
556-
557- // / Create a libcall to memcpy et al.
558- LLVM_ABI LegalizerHelper::LegalizeResult
559- createMemLibcall (MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
560- MachineInstr &MI, LostDebugLocObserver &LocObserver);
561-
562575} // End namespace llvm.
563576
564577#endif
0 commit comments