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/Transforms/Utils/CanonicalizeAliases.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/Transforms/Utils/CanonicalizeAliases.cpp')
-rw-r--r-- | contrib/libs/llvm12/lib/Transforms/Utils/CanonicalizeAliases.cpp | 210 |
1 files changed, 105 insertions, 105 deletions
diff --git a/contrib/libs/llvm12/lib/Transforms/Utils/CanonicalizeAliases.cpp b/contrib/libs/llvm12/lib/Transforms/Utils/CanonicalizeAliases.cpp index 6b01c0c71d..295fc67108 100644 --- a/contrib/libs/llvm12/lib/Transforms/Utils/CanonicalizeAliases.cpp +++ b/contrib/libs/llvm12/lib/Transforms/Utils/CanonicalizeAliases.cpp @@ -1,105 +1,105 @@ -//===- CanonicalizeAliases.cpp - ThinLTO Support: Canonicalize Aliases ----===// -// -// 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 -// -//===----------------------------------------------------------------------===// -// -// Currently this file implements partial alias canonicalization, to -// flatten chains of aliases (also done by GlobalOpt, but not on for -// O0 compiles). E.g. -// @a = alias i8, i8 *@b -// @b = alias i8, i8 *@g -// -// will be converted to: -// @a = alias i8, i8 *@g <-- @a is now an alias to base object @g -// @b = alias i8, i8 *@g -// -// Eventually this file will implement full alias canonicalation, so that -// all aliasees are private anonymous values. E.g. -// @a = alias i8, i8 *@g -// @g = global i8 0 -// -// will be converted to: -// @0 = private global -// @a = alias i8, i8* @0 -// @g = alias i8, i8* @0 -// -// This simplifies optimization and ThinLTO linking of the original symbols. -//===----------------------------------------------------------------------===// - -#include "llvm/Transforms/Utils/CanonicalizeAliases.h" -#include "llvm/IR/Operator.h" -#include "llvm/IR/ValueHandle.h" -#include "llvm/InitializePasses.h" -#include "llvm/Pass.h" - -using namespace llvm; - -namespace { - -static Constant *canonicalizeAlias(Constant *C, bool &Changed) { - if (auto *GA = dyn_cast<GlobalAlias>(C)) { - auto *NewAliasee = canonicalizeAlias(GA->getAliasee(), Changed); - if (NewAliasee != GA->getAliasee()) { - GA->setAliasee(NewAliasee); - Changed = true; - } - return NewAliasee; - } - - auto *CE = dyn_cast<ConstantExpr>(C); - if (!CE) - return C; - - std::vector<Constant *> Ops; - for (Use &U : CE->operands()) - Ops.push_back(canonicalizeAlias(cast<Constant>(U), Changed)); - return CE->getWithOperands(Ops); -} - -/// Convert aliases to canonical form. -static bool canonicalizeAliases(Module &M) { - bool Changed = false; - for (auto &GA : M.aliases()) - canonicalizeAlias(&GA, Changed); - return Changed; -} - -// Legacy pass that canonicalizes aliases. -class CanonicalizeAliasesLegacyPass : public ModulePass { - -public: - /// Pass identification, replacement for typeid - static char ID; - - /// Specify pass name for debug output - StringRef getPassName() const override { return "Canonicalize Aliases"; } - - explicit CanonicalizeAliasesLegacyPass() : ModulePass(ID) {} - - bool runOnModule(Module &M) override { return canonicalizeAliases(M); } -}; -char CanonicalizeAliasesLegacyPass::ID = 0; - -} // anonymous namespace - -PreservedAnalyses CanonicalizeAliasesPass::run(Module &M, - ModuleAnalysisManager &AM) { - if (!canonicalizeAliases(M)) - return PreservedAnalyses::all(); - - return PreservedAnalyses::none(); -} - -INITIALIZE_PASS_BEGIN(CanonicalizeAliasesLegacyPass, "canonicalize-aliases", - "Canonicalize aliases", false, false) -INITIALIZE_PASS_END(CanonicalizeAliasesLegacyPass, "canonicalize-aliases", - "Canonicalize aliases", false, false) - -namespace llvm { -ModulePass *createCanonicalizeAliasesPass() { - return new CanonicalizeAliasesLegacyPass(); -} -} // namespace llvm +//===- CanonicalizeAliases.cpp - ThinLTO Support: Canonicalize Aliases ----===// +// +// 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 +// +//===----------------------------------------------------------------------===// +// +// Currently this file implements partial alias canonicalization, to +// flatten chains of aliases (also done by GlobalOpt, but not on for +// O0 compiles). E.g. +// @a = alias i8, i8 *@b +// @b = alias i8, i8 *@g +// +// will be converted to: +// @a = alias i8, i8 *@g <-- @a is now an alias to base object @g +// @b = alias i8, i8 *@g +// +// Eventually this file will implement full alias canonicalation, so that +// all aliasees are private anonymous values. E.g. +// @a = alias i8, i8 *@g +// @g = global i8 0 +// +// will be converted to: +// @0 = private global +// @a = alias i8, i8* @0 +// @g = alias i8, i8* @0 +// +// This simplifies optimization and ThinLTO linking of the original symbols. +//===----------------------------------------------------------------------===// + +#include "llvm/Transforms/Utils/CanonicalizeAliases.h" +#include "llvm/IR/Operator.h" +#include "llvm/IR/ValueHandle.h" +#include "llvm/InitializePasses.h" +#include "llvm/Pass.h" + +using namespace llvm; + +namespace { + +static Constant *canonicalizeAlias(Constant *C, bool &Changed) { + if (auto *GA = dyn_cast<GlobalAlias>(C)) { + auto *NewAliasee = canonicalizeAlias(GA->getAliasee(), Changed); + if (NewAliasee != GA->getAliasee()) { + GA->setAliasee(NewAliasee); + Changed = true; + } + return NewAliasee; + } + + auto *CE = dyn_cast<ConstantExpr>(C); + if (!CE) + return C; + + std::vector<Constant *> Ops; + for (Use &U : CE->operands()) + Ops.push_back(canonicalizeAlias(cast<Constant>(U), Changed)); + return CE->getWithOperands(Ops); +} + +/// Convert aliases to canonical form. +static bool canonicalizeAliases(Module &M) { + bool Changed = false; + for (auto &GA : M.aliases()) + canonicalizeAlias(&GA, Changed); + return Changed; +} + +// Legacy pass that canonicalizes aliases. +class CanonicalizeAliasesLegacyPass : public ModulePass { + +public: + /// Pass identification, replacement for typeid + static char ID; + + /// Specify pass name for debug output + StringRef getPassName() const override { return "Canonicalize Aliases"; } + + explicit CanonicalizeAliasesLegacyPass() : ModulePass(ID) {} + + bool runOnModule(Module &M) override { return canonicalizeAliases(M); } +}; +char CanonicalizeAliasesLegacyPass::ID = 0; + +} // anonymous namespace + +PreservedAnalyses CanonicalizeAliasesPass::run(Module &M, + ModuleAnalysisManager &AM) { + if (!canonicalizeAliases(M)) + return PreservedAnalyses::all(); + + return PreservedAnalyses::none(); +} + +INITIALIZE_PASS_BEGIN(CanonicalizeAliasesLegacyPass, "canonicalize-aliases", + "Canonicalize aliases", false, false) +INITIALIZE_PASS_END(CanonicalizeAliasesLegacyPass, "canonicalize-aliases", + "Canonicalize aliases", false, false) + +namespace llvm { +ModulePass *createCanonicalizeAliasesPass() { + return new CanonicalizeAliasesLegacyPass(); +} +} // namespace llvm |