//===- NVPTXProxyRegErasure.cpp - NVPTX Proxy Register Instruction Erasure -==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // The pass is needed to remove ProxyReg instructions and restore related // registers. The instructions were needed at instruction selection stage to // make sure that callseq_end nodes won't be removed as "dead nodes". This can // happen when we expand instructions into libcalls and the call site doesn't // care about the libcall chain. Call site cares about data flow only, and the // latest data flow node happens to be before callseq_end. Therefore the node // becomes dangling and "dead". The ProxyReg acts like an additional data flow // node *after* the callseq_end in the chain and ensures that everything will be // preserved. // //===----------------------------------------------------------------------===// #include "NVPTX.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/TargetRegisterInfo.h" usingnamespacellvm; namespace llvm { void initializeNVPTXProxyRegErasurePass(PassRegistry &); } namespace { struct NVPTXProxyRegErasure : public MachineFunctionPass { … }; } // namespace char NVPTXProxyRegErasure::ID = …; INITIALIZE_PASS(…) bool NVPTXProxyRegErasure::runOnMachineFunction(MachineFunction &MF) { … } MachineFunctionPass *llvm::createNVPTXProxyRegErasurePass() { … }