diff options
author | orivej <orivej@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
commit | 718c552901d703c502ccbefdfc3c9028d608b947 (patch) | |
tree | 46534a98bbefcd7b1f3faa5b52c138ab27db75b7 /contrib/libs/llvm12/lib/CodeGen/PHIEliminationUtils.cpp | |
parent | e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (diff) | |
download | ydb-718c552901d703c502ccbefdfc3c9028d608b947.tar.gz |
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/llvm12/lib/CodeGen/PHIEliminationUtils.cpp')
-rw-r--r-- | contrib/libs/llvm12/lib/CodeGen/PHIEliminationUtils.cpp | 126 |
1 files changed, 63 insertions, 63 deletions
diff --git a/contrib/libs/llvm12/lib/CodeGen/PHIEliminationUtils.cpp b/contrib/libs/llvm12/lib/CodeGen/PHIEliminationUtils.cpp index 016335f420..3af7f52c37 100644 --- a/contrib/libs/llvm12/lib/CodeGen/PHIEliminationUtils.cpp +++ b/contrib/libs/llvm12/lib/CodeGen/PHIEliminationUtils.cpp @@ -1,64 +1,64 @@ -//===-- PHIEliminationUtils.cpp - Helper functions for PHI elimination ----===// -// -// 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 -// -//===----------------------------------------------------------------------===// +//===-- PHIEliminationUtils.cpp - Helper functions for PHI elimination ----===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "PHIEliminationUtils.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" -#include "PHIEliminationUtils.h" -#include "llvm/ADT/SmallPtrSet.h" -#include "llvm/CodeGen/MachineFunction.h" -#include "llvm/CodeGen/MachineRegisterInfo.h" - -using namespace llvm; - -// findCopyInsertPoint - Find a safe place in MBB to insert a copy from SrcReg -// when following the CFG edge to SuccMBB. This needs to be after any def of -// SrcReg, but before any subsequent point where control flow might jump out of -// the basic block. -MachineBasicBlock::iterator -llvm::findPHICopyInsertPoint(MachineBasicBlock* MBB, MachineBasicBlock* SuccMBB, - unsigned SrcReg) { - // Handle the trivial case trivially. - if (MBB->empty()) - return MBB->begin(); - - // Usually, we just want to insert the copy before the first terminator - // instruction. However, for the edge going to a landing pad, we must insert - // the copy before the call/invoke instruction. Similarly for an INLINEASM_BR - // going to an indirect target. This is similar to SplitKit.cpp's - // computeLastInsertPoint, and similarly assumes that there cannot be multiple - // instructions that are Calls with EHPad successors or INLINEASM_BR in a - // block. - bool EHPadSuccessor = SuccMBB->isEHPad(); - if (!EHPadSuccessor && !SuccMBB->isInlineAsmBrIndirectTarget()) - return MBB->getFirstTerminator(); - - // Discover any defs in this basic block. - SmallPtrSet<MachineInstr *, 8> DefsInMBB; - MachineRegisterInfo& MRI = MBB->getParent()->getRegInfo(); - for (MachineInstr &RI : MRI.def_instructions(SrcReg)) - if (RI.getParent() == MBB) - DefsInMBB.insert(&RI); - - MachineBasicBlock::iterator InsertPoint = MBB->begin(); - // Insert the copy at the _latest_ point of: - // 1. Immediately AFTER the last def - // 2. Immediately BEFORE a call/inlineasm_br. - for (auto I = MBB->rbegin(), E = MBB->rend(); I != E; ++I) { - if (DefsInMBB.contains(&*I)) { - InsertPoint = std::next(I.getReverse()); - break; - } - if ((EHPadSuccessor && I->isCall()) || - I->getOpcode() == TargetOpcode::INLINEASM_BR) { - InsertPoint = I.getReverse(); - break; - } - } - - // Make sure the copy goes after any phi nodes but before - // any debug nodes. - return MBB->SkipPHIsAndLabels(InsertPoint); -} +using namespace llvm; + +// findCopyInsertPoint - Find a safe place in MBB to insert a copy from SrcReg +// when following the CFG edge to SuccMBB. This needs to be after any def of +// SrcReg, but before any subsequent point where control flow might jump out of +// the basic block. +MachineBasicBlock::iterator +llvm::findPHICopyInsertPoint(MachineBasicBlock* MBB, MachineBasicBlock* SuccMBB, + unsigned SrcReg) { + // Handle the trivial case trivially. + if (MBB->empty()) + return MBB->begin(); + + // Usually, we just want to insert the copy before the first terminator + // instruction. However, for the edge going to a landing pad, we must insert + // the copy before the call/invoke instruction. Similarly for an INLINEASM_BR + // going to an indirect target. This is similar to SplitKit.cpp's + // computeLastInsertPoint, and similarly assumes that there cannot be multiple + // instructions that are Calls with EHPad successors or INLINEASM_BR in a + // block. + bool EHPadSuccessor = SuccMBB->isEHPad(); + if (!EHPadSuccessor && !SuccMBB->isInlineAsmBrIndirectTarget()) + return MBB->getFirstTerminator(); + + // Discover any defs in this basic block. + SmallPtrSet<MachineInstr *, 8> DefsInMBB; + MachineRegisterInfo& MRI = MBB->getParent()->getRegInfo(); + for (MachineInstr &RI : MRI.def_instructions(SrcReg)) + if (RI.getParent() == MBB) + DefsInMBB.insert(&RI); + + MachineBasicBlock::iterator InsertPoint = MBB->begin(); + // Insert the copy at the _latest_ point of: + // 1. Immediately AFTER the last def + // 2. Immediately BEFORE a call/inlineasm_br. + for (auto I = MBB->rbegin(), E = MBB->rend(); I != E; ++I) { + if (DefsInMBB.contains(&*I)) { + InsertPoint = std::next(I.getReverse()); + break; + } + if ((EHPadSuccessor && I->isCall()) || + I->getOpcode() == TargetOpcode::INLINEASM_BR) { + InsertPoint = I.getReverse(); + break; + } + } + + // Make sure the copy goes after any phi nodes but before + // any debug nodes. + return MBB->SkipPHIsAndLabels(InsertPoint); +} |