//== WebAssemblyMemIntrinsicResults.cpp - Optimize memory intrinsic results ==// // // 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 // //===----------------------------------------------------------------------===// /// /// \file /// This file implements an optimization pass using memory intrinsic results. /// /// Calls to memory intrinsics (memcpy, memmove, memset) return the destination /// address. They are in the form of /// %dst_new = call @memcpy %dst, %src, %len /// where %dst and %dst_new registers contain the same value. /// /// This is to enable an optimization wherein uses of the %dst register used in /// the parameter can be replaced by uses of the %dst_new register used in the /// result, making the %dst register more likely to be single-use, thus more /// likely to be useful to register stackifying, and potentially also exposing /// the call instruction itself to register stackifying. These both can reduce /// local.get/local.set traffic. /// /// The LLVM intrinsics for these return void so they can't use the returned /// attribute and consequently aren't handled by the OptimizeReturned pass. /// //===----------------------------------------------------------------------===// #include "MCTargetDesc/WebAssemblyMCTargetDesc.h" #include "WebAssembly.h" #include "WebAssemblyMachineFunctionInfo.h" #include "WebAssemblySubtarget.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/CodeGen/LiveIntervals.h" #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" usingnamespacellvm; #define DEBUG_TYPE … namespace { class WebAssemblyMemIntrinsicResults final : public MachineFunctionPass { … }; } // end anonymous namespace char WebAssemblyMemIntrinsicResults::ID = …; INITIALIZE_PASS(…) FunctionPass *llvm::createWebAssemblyMemIntrinsicResults() { … } // Replace uses of FromReg with ToReg if they are dominated by MI. static bool replaceDominatedUses(MachineBasicBlock &MBB, MachineInstr &MI, unsigned FromReg, unsigned ToReg, const MachineRegisterInfo &MRI, MachineDominatorTree &MDT, LiveIntervals &LIS) { … } static bool optimizeCall(MachineBasicBlock &MBB, MachineInstr &MI, const MachineRegisterInfo &MRI, MachineDominatorTree &MDT, LiveIntervals &LIS, const WebAssemblyTargetLowering &TLI, const TargetLibraryInfo &LibInfo) { … } bool WebAssemblyMemIntrinsicResults::runOnMachineFunction(MachineFunction &MF) { … }