LLVM
8.0.1
|
This pass attempts to sink instructions into successors, reducing static instruction count and enabling if-conversion. More...
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/PostOrderIterator.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/Value.h"
#include "llvm/Pass.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/ArrayRecycler.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Scalar/GVN.h"
#include "llvm/Transforms/Scalar/GVNExpression.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <iterator>
#include <utility>
Go to the source code of this file.
Namespaces | |
llvm | |
This class represents lattice values for constants. | |
llvm::GVNExpression | |
Macros | |
#define | DEBUG_TYPE "gvn-sink" |
Functions | |
STATISTIC (NumRemoved, "Number of instructions removed") | |
INITIALIZE_PASS_BEGIN (GVNSinkLegacyPass, "gvn-sink", "Early GVN sinking of Expressions", false, false) INITIALIZE_PASS_END(GVNSinkLegacyPass | |
Variables | |
gvn | sink |
When an instruction is found to only be used outside of the loop, this function moves it to the exit blocks and patches up SSA form as needed. More... | |
gvn Early GVN sinking of | Expressions |
gvn Early GVN sinking of | false |
This pass attempts to sink instructions into successors, reducing static instruction count and enabling if-conversion.
We use a variant of global value numbering to decide what can be sunk. Consider:
[ a1 = add i32 b, 1 ] [ c1 = add i32 d, 1 ] [ a2 = xor i32 a1, 1 ] [ c2 = xor i32 c1, 1 ] \ / [ e = phi i32 a2, c2 ] [ add i32 e, 4 ]
GVN would number a1 and c1 differently because they compute different results - the VN of an instruction is a function of its opcode and the transitive closure of its operands. This is the key property for hoisting and CSE.
What we want when sinking however is for a numbering that is a function of the uses of an instruction, which allows us to answer the question "if I replace a1 with c1, will it contribute in an equivalent way to all successive instructions?". The PostValueTable class in GVN provides this mapping.
Definition in file GVNSink.cpp.
#define DEBUG_TYPE "gvn-sink" |
Definition at line 84 of file GVNSink.cpp.
INITIALIZE_PASS_BEGIN | ( | GVNSinkLegacyPass | , |
"gvn-sink" | , | ||
"Early GVN sinking of Expressions" | , | ||
false | , | ||
false | |||
) |
Referenced by llvm::GVNSinkPass::run().
STATISTIC | ( | NumRemoved | , |
"Number of instructions removed" | |||
) |
Definition at line 920 of file GVNSink.cpp.
Definition at line 920 of file GVNSink.cpp.
static bool sink |
When an instruction is found to only be used outside of the loop, this function moves it to the exit blocks and patches up SSA form as needed.
This method is guaranteed to remove the original instruction from its position, and may either delete it or move it to outside of the loop.
Definition at line 920 of file GVNSink.cpp.