LLVM 24.0.0git
CanonicalizeAliases.cpp
Go to the documentation of this file.
1//===- CanonicalizeAliases.cpp - ThinLTO Support: Canonicalize Aliases ----===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Currently this file implements partial alias canonicalization, to
10// flatten chains of aliases (also done by GlobalOpt, but not on for
11// O0 compiles). E.g.
12// @a = alias i8, i8 *@b
13// @b = alias i8, i8 *@g
14//
15// will be converted to:
16// @a = alias i8, i8 *@g <-- @a is now an alias to base object @g
17// @b = alias i8, i8 *@g
18//
19// Eventually this file will implement full alias canonicalization, so that
20// all aliasees are private anonymous values. E.g.
21// @a = alias i8, i8 *@g
22// @g = global i8 0
23//
24// will be converted to:
25// @0 = private global
26// @a = alias i8, i8* @0
27// @g = alias i8, i8* @0
28//
29// This simplifies optimization and ThinLTO linking of the original symbols.
30//===----------------------------------------------------------------------===//
31
33#include "llvm/IR/Constants.h"
34#include "llvm/IR/Module.h"
35
36using namespace llvm;
37
38namespace {
39
40static Constant *canonicalizeAlias(Constant *C, bool &Changed) {
41 if (auto *GA = dyn_cast<GlobalAlias>(C)) {
42 auto *NewAliasee = canonicalizeAlias(GA->getAliasee(), Changed);
43 if (NewAliasee != GA->getAliasee()) {
44 GA->setAliasee(NewAliasee);
45 Changed = true;
46 }
47 return NewAliasee;
48 }
49
51 if (!CE)
52 return C;
53
54 std::vector<Constant *> Ops;
55 for (Use &U : CE->operands())
56 Ops.push_back(canonicalizeAlias(cast<Constant>(U), Changed));
57 return CE->getWithOperands(Ops);
58}
59
60/// Convert aliases to canonical form.
61static bool canonicalizeAliases(Module &M) {
62 bool Changed = false;
63 for (auto &GA : M.aliases())
64 canonicalizeAlias(&GA, Changed);
65 return Changed;
66}
67} // anonymous namespace
68
71 if (!canonicalizeAliases(M))
73
75}
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
This is an important base class in LLVM.
Definition Constant.h:43
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition Analysis.h:115
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
Changed
@ CE
Windows NT (Windows on ARM)
Definition MCAsmInfo.h:51
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39