//- X86Insertwait.cpp - Strict-Fp:Insert wait instruction X87 instructions --// // // 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 // //===----------------------------------------------------------------------===// // // This file defines the pass which insert x86 wait instructions after each // X87 instructions when strict float is enabled. // // The logic to insert a wait instruction after an X87 instruction is as below: // 1. If the X87 instruction don't raise float exception nor is a load/store // instruction, or is a x87 control instruction, don't insert wait. // 2. If the X87 instruction is an instruction which the following instruction // is an X87 exception synchronizing X87 instruction, don't insert wait. // 3. For other situations, insert wait instruction. // //===----------------------------------------------------------------------===// #include "X86.h" #include "X86InstrInfo.h" #include "X86Subtarget.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/IR/DebugLoc.h" #include "llvm/Support/Debug.h" usingnamespacellvm; #define DEBUG_TYPE … namespace { class WaitInsert : public MachineFunctionPass { … }; } // namespace char WaitInsert::ID = …; FunctionPass *llvm::createX86InsertX87waitPass() { … } static bool isX87ControlInstruction(MachineInstr &MI) { … } static bool isX87NonWaitingControlInstruction(MachineInstr &MI) { … } bool WaitInsert::runOnMachineFunction(MachineFunction &MF) { … }