10b57cec5SDimitry Andric //===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This pass performs global value numbering to eliminate fully redundant
100b57cec5SDimitry Andric // instructions. It also performs simple dead load elimination.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric // Note that this pass does the value numbering itself; it does not use the
130b57cec5SDimitry Andric // ValueNumbering analysis passes.
140b57cec5SDimitry Andric //
150b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric #include "llvm/Transforms/Scalar/GVN.h"
180b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h"
190b57cec5SDimitry Andric #include "llvm/ADT/DepthFirstIterator.h"
200b57cec5SDimitry Andric #include "llvm/ADT/Hashing.h"
210b57cec5SDimitry Andric #include "llvm/ADT/MapVector.h"
220b57cec5SDimitry Andric #include "llvm/ADT/PostOrderIterator.h"
230b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
240b57cec5SDimitry Andric #include "llvm/ADT/SetVector.h"
250b57cec5SDimitry Andric #include "llvm/ADT/SmallPtrSet.h"
260b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h"
270b57cec5SDimitry Andric #include "llvm/ADT/Statistic.h"
280b57cec5SDimitry Andric #include "llvm/Analysis/AliasAnalysis.h"
29e8d8bef9SDimitry Andric #include "llvm/Analysis/AssumeBundleQueries.h"
300b57cec5SDimitry Andric #include "llvm/Analysis/AssumptionCache.h"
310b57cec5SDimitry Andric #include "llvm/Analysis/CFG.h"
320b57cec5SDimitry Andric #include "llvm/Analysis/DomTreeUpdater.h"
330b57cec5SDimitry Andric #include "llvm/Analysis/GlobalsModRef.h"
3481ad6265SDimitry Andric #include "llvm/Analysis/InstructionPrecedenceTracking.h"
350b57cec5SDimitry Andric #include "llvm/Analysis/InstructionSimplify.h"
36*0fca6ea1SDimitry Andric #include "llvm/Analysis/Loads.h"
370b57cec5SDimitry Andric #include "llvm/Analysis/LoopInfo.h"
380b57cec5SDimitry Andric #include "llvm/Analysis/MemoryBuiltins.h"
390b57cec5SDimitry Andric #include "llvm/Analysis/MemoryDependenceAnalysis.h"
40e8d8bef9SDimitry Andric #include "llvm/Analysis/MemorySSA.h"
41e8d8bef9SDimitry Andric #include "llvm/Analysis/MemorySSAUpdater.h"
420b57cec5SDimitry Andric #include "llvm/Analysis/OptimizationRemarkEmitter.h"
430b57cec5SDimitry Andric #include "llvm/Analysis/PHITransAddr.h"
440b57cec5SDimitry Andric #include "llvm/Analysis/TargetLibraryInfo.h"
450b57cec5SDimitry Andric #include "llvm/Analysis/ValueTracking.h"
460b57cec5SDimitry Andric #include "llvm/IR/Attributes.h"
470b57cec5SDimitry Andric #include "llvm/IR/BasicBlock.h"
480b57cec5SDimitry Andric #include "llvm/IR/Constant.h"
490b57cec5SDimitry Andric #include "llvm/IR/Constants.h"
500b57cec5SDimitry Andric #include "llvm/IR/DebugLoc.h"
510b57cec5SDimitry Andric #include "llvm/IR/Dominators.h"
520b57cec5SDimitry Andric #include "llvm/IR/Function.h"
530b57cec5SDimitry Andric #include "llvm/IR/InstrTypes.h"
540b57cec5SDimitry Andric #include "llvm/IR/Instruction.h"
550b57cec5SDimitry Andric #include "llvm/IR/Instructions.h"
560b57cec5SDimitry Andric #include "llvm/IR/IntrinsicInst.h"
570b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h"
580b57cec5SDimitry Andric #include "llvm/IR/Metadata.h"
590b57cec5SDimitry Andric #include "llvm/IR/Module.h"
600b57cec5SDimitry Andric #include "llvm/IR/PassManager.h"
610b57cec5SDimitry Andric #include "llvm/IR/PatternMatch.h"
620b57cec5SDimitry Andric #include "llvm/IR/Type.h"
630b57cec5SDimitry Andric #include "llvm/IR/Use.h"
640b57cec5SDimitry Andric #include "llvm/IR/Value.h"
65480093f4SDimitry Andric #include "llvm/InitializePasses.h"
660b57cec5SDimitry Andric #include "llvm/Pass.h"
670b57cec5SDimitry Andric #include "llvm/Support/Casting.h"
680b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h"
690b57cec5SDimitry Andric #include "llvm/Support/Compiler.h"
700b57cec5SDimitry Andric #include "llvm/Support/Debug.h"
710b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
725ffd83dbSDimitry Andric #include "llvm/Transforms/Utils/AssumeBundleBuilder.h"
730b57cec5SDimitry Andric #include "llvm/Transforms/Utils/BasicBlockUtils.h"
740b57cec5SDimitry Andric #include "llvm/Transforms/Utils/Local.h"
750b57cec5SDimitry Andric #include "llvm/Transforms/Utils/SSAUpdater.h"
760b57cec5SDimitry Andric #include "llvm/Transforms/Utils/VNCoercion.h"
770b57cec5SDimitry Andric #include <algorithm>
780b57cec5SDimitry Andric #include <cassert>
790b57cec5SDimitry Andric #include <cstdint>
80bdd1243dSDimitry Andric #include <optional>
810b57cec5SDimitry Andric #include <utility>
820b57cec5SDimitry Andric
830b57cec5SDimitry Andric using namespace llvm;
840b57cec5SDimitry Andric using namespace llvm::gvn;
850b57cec5SDimitry Andric using namespace llvm::VNCoercion;
860b57cec5SDimitry Andric using namespace PatternMatch;
870b57cec5SDimitry Andric
880b57cec5SDimitry Andric #define DEBUG_TYPE "gvn"
890b57cec5SDimitry Andric
900b57cec5SDimitry Andric STATISTIC(NumGVNInstr, "Number of instructions deleted");
910b57cec5SDimitry Andric STATISTIC(NumGVNLoad, "Number of loads deleted");
920b57cec5SDimitry Andric STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
930b57cec5SDimitry Andric STATISTIC(NumGVNBlocks, "Number of blocks merged");
940b57cec5SDimitry Andric STATISTIC(NumGVNSimpl, "Number of instructions simplified");
950b57cec5SDimitry Andric STATISTIC(NumGVNEqProp, "Number of equalities propagated");
960b57cec5SDimitry Andric STATISTIC(NumPRELoad, "Number of loads PRE'd");
97fe6060f1SDimitry Andric STATISTIC(NumPRELoopLoad, "Number of loop loads PRE'd");
9806c3fb27SDimitry Andric STATISTIC(NumPRELoadMoved2CEPred,
9906c3fb27SDimitry Andric "Number of loads moved to predecessor of a critical edge in PRE");
1000b57cec5SDimitry Andric
101e8d8bef9SDimitry Andric STATISTIC(IsValueFullyAvailableInBlockNumSpeculationsMax,
102e8d8bef9SDimitry Andric "Number of blocks speculated as available in "
103e8d8bef9SDimitry Andric "IsValueFullyAvailableInBlock(), max");
104e8d8bef9SDimitry Andric STATISTIC(MaxBBSpeculationCutoffReachedTimes,
105e8d8bef9SDimitry Andric "Number of times we we reached gvn-max-block-speculations cut-off "
106e8d8bef9SDimitry Andric "preventing further exploration");
107e8d8bef9SDimitry Andric
1085ffd83dbSDimitry Andric static cl::opt<bool> GVNEnablePRE("enable-pre", cl::init(true), cl::Hidden);
1095ffd83dbSDimitry Andric static cl::opt<bool> GVNEnableLoadPRE("enable-load-pre", cl::init(true));
1105ffd83dbSDimitry Andric static cl::opt<bool> GVNEnableLoadInLoopPRE("enable-load-in-loop-pre",
1115ffd83dbSDimitry Andric cl::init(true));
112e8d8bef9SDimitry Andric static cl::opt<bool>
113e8d8bef9SDimitry Andric GVNEnableSplitBackedgeInLoadPRE("enable-split-backedge-in-load-pre",
11481ad6265SDimitry Andric cl::init(false));
1155ffd83dbSDimitry Andric static cl::opt<bool> GVNEnableMemDep("enable-gvn-memdep", cl::init(true));
1160b57cec5SDimitry Andric
1170b57cec5SDimitry Andric static cl::opt<uint32_t> MaxNumDeps(
11881ad6265SDimitry Andric "gvn-max-num-deps", cl::Hidden, cl::init(100),
1190b57cec5SDimitry Andric cl::desc("Max number of dependences to attempt Load PRE (default = 100)"));
1200b57cec5SDimitry Andric
121e8d8bef9SDimitry Andric // This is based on IsValueFullyAvailableInBlockNumSpeculationsMax stat.
122e8d8bef9SDimitry Andric static cl::opt<uint32_t> MaxBBSpeculations(
12381ad6265SDimitry Andric "gvn-max-block-speculations", cl::Hidden, cl::init(600),
124e8d8bef9SDimitry Andric cl::desc("Max number of blocks we're willing to speculate on (and recurse "
125e8d8bef9SDimitry Andric "into) when deducing if a value is fully available or not in GVN "
126e8d8bef9SDimitry Andric "(default = 600)"));
127e8d8bef9SDimitry Andric
128bdd1243dSDimitry Andric static cl::opt<uint32_t> MaxNumVisitedInsts(
129bdd1243dSDimitry Andric "gvn-max-num-visited-insts", cl::Hidden, cl::init(100),
130bdd1243dSDimitry Andric cl::desc("Max number of visited instructions when trying to find "
131bdd1243dSDimitry Andric "dominating value of select dependency (default = 100)"));
132bdd1243dSDimitry Andric
13306c3fb27SDimitry Andric static cl::opt<uint32_t> MaxNumInsnsPerBlock(
13406c3fb27SDimitry Andric "gvn-max-num-insns", cl::Hidden, cl::init(100),
13506c3fb27SDimitry Andric cl::desc("Max number of instructions to scan in each basic block in GVN "
13606c3fb27SDimitry Andric "(default = 100)"));
13706c3fb27SDimitry Andric
138349cc55cSDimitry Andric struct llvm::GVNPass::Expression {
1390b57cec5SDimitry Andric uint32_t opcode;
1400b57cec5SDimitry Andric bool commutative = false;
14181ad6265SDimitry Andric // The type is not necessarily the result type of the expression, it may be
14281ad6265SDimitry Andric // any additional type needed to disambiguate the expression.
1435ffd83dbSDimitry Andric Type *type = nullptr;
1440b57cec5SDimitry Andric SmallVector<uint32_t, 4> varargs;
1450b57cec5SDimitry Andric
Expressionllvm::GVNPass::Expression1460b57cec5SDimitry Andric Expression(uint32_t o = ~2U) : opcode(o) {}
1470b57cec5SDimitry Andric
operator ==llvm::GVNPass::Expression1480b57cec5SDimitry Andric bool operator==(const Expression &other) const {
1490b57cec5SDimitry Andric if (opcode != other.opcode)
1500b57cec5SDimitry Andric return false;
1510b57cec5SDimitry Andric if (opcode == ~0U || opcode == ~1U)
1520b57cec5SDimitry Andric return true;
1530b57cec5SDimitry Andric if (type != other.type)
1540b57cec5SDimitry Andric return false;
1550b57cec5SDimitry Andric if (varargs != other.varargs)
1560b57cec5SDimitry Andric return false;
1570b57cec5SDimitry Andric return true;
1580b57cec5SDimitry Andric }
1590b57cec5SDimitry Andric
hash_value(const Expression & Value)1600b57cec5SDimitry Andric friend hash_code hash_value(const Expression &Value) {
1610b57cec5SDimitry Andric return hash_combine(
1620b57cec5SDimitry Andric Value.opcode, Value.type,
1630b57cec5SDimitry Andric hash_combine_range(Value.varargs.begin(), Value.varargs.end()));
1640b57cec5SDimitry Andric }
1650b57cec5SDimitry Andric };
1660b57cec5SDimitry Andric
1670b57cec5SDimitry Andric namespace llvm {
1680b57cec5SDimitry Andric
169349cc55cSDimitry Andric template <> struct DenseMapInfo<GVNPass::Expression> {
getEmptyKeyllvm::DenseMapInfo170349cc55cSDimitry Andric static inline GVNPass::Expression getEmptyKey() { return ~0U; }
getTombstoneKeyllvm::DenseMapInfo171349cc55cSDimitry Andric static inline GVNPass::Expression getTombstoneKey() { return ~1U; }
1720b57cec5SDimitry Andric
getHashValuellvm::DenseMapInfo173349cc55cSDimitry Andric static unsigned getHashValue(const GVNPass::Expression &e) {
1740b57cec5SDimitry Andric using llvm::hash_value;
1750b57cec5SDimitry Andric
1760b57cec5SDimitry Andric return static_cast<unsigned>(hash_value(e));
1770b57cec5SDimitry Andric }
1780b57cec5SDimitry Andric
isEqualllvm::DenseMapInfo179349cc55cSDimitry Andric static bool isEqual(const GVNPass::Expression &LHS,
180349cc55cSDimitry Andric const GVNPass::Expression &RHS) {
1810b57cec5SDimitry Andric return LHS == RHS;
1820b57cec5SDimitry Andric }
1830b57cec5SDimitry Andric };
1840b57cec5SDimitry Andric
1850b57cec5SDimitry Andric } // end namespace llvm
1860b57cec5SDimitry Andric
1870b57cec5SDimitry Andric /// Represents a particular available value that we know how to materialize.
1880b57cec5SDimitry Andric /// Materialization of an AvailableValue never fails. An AvailableValue is
1890b57cec5SDimitry Andric /// implicitly associated with a rematerialization point which is the
1900b57cec5SDimitry Andric /// location of the instruction from which it was formed.
1910b57cec5SDimitry Andric struct llvm::gvn::AvailableValue {
19281ad6265SDimitry Andric enum class ValType {
1930b57cec5SDimitry Andric SimpleVal, // A simple offsetted value that is accessed.
1940b57cec5SDimitry Andric LoadVal, // A value produced by a load.
1950b57cec5SDimitry Andric MemIntrin, // A memory intrinsic which is loaded from.
19681ad6265SDimitry Andric UndefVal, // A UndefValue representing a value from dead block (which
1970b57cec5SDimitry Andric // is not yet physically removed from the CFG).
19881ad6265SDimitry Andric SelectVal, // A pointer select which is loaded from and for which the load
19981ad6265SDimitry Andric // can be replace by a value select.
2000b57cec5SDimitry Andric };
2010b57cec5SDimitry Andric
20281ad6265SDimitry Andric /// Val - The value that is live out of the block.
20381ad6265SDimitry Andric Value *Val;
20481ad6265SDimitry Andric /// Kind of the live-out value.
20581ad6265SDimitry Andric ValType Kind;
2060b57cec5SDimitry Andric
2070b57cec5SDimitry Andric /// Offset - The byte offset in Val that is interesting for the load query.
208480093f4SDimitry Andric unsigned Offset = 0;
209bdd1243dSDimitry Andric /// V1, V2 - The dominating non-clobbered values of SelectVal.
210bdd1243dSDimitry Andric Value *V1 = nullptr, *V2 = nullptr;
2110b57cec5SDimitry Andric
getllvm::gvn::AvailableValue2120b57cec5SDimitry Andric static AvailableValue get(Value *V, unsigned Offset = 0) {
2130b57cec5SDimitry Andric AvailableValue Res;
21481ad6265SDimitry Andric Res.Val = V;
21581ad6265SDimitry Andric Res.Kind = ValType::SimpleVal;
2160b57cec5SDimitry Andric Res.Offset = Offset;
2170b57cec5SDimitry Andric return Res;
2180b57cec5SDimitry Andric }
2190b57cec5SDimitry Andric
getMIllvm::gvn::AvailableValue2200b57cec5SDimitry Andric static AvailableValue getMI(MemIntrinsic *MI, unsigned Offset = 0) {
2210b57cec5SDimitry Andric AvailableValue Res;
22281ad6265SDimitry Andric Res.Val = MI;
22381ad6265SDimitry Andric Res.Kind = ValType::MemIntrin;
2240b57cec5SDimitry Andric Res.Offset = Offset;
2250b57cec5SDimitry Andric return Res;
2260b57cec5SDimitry Andric }
2270b57cec5SDimitry Andric
getLoadllvm::gvn::AvailableValue228fe6060f1SDimitry Andric static AvailableValue getLoad(LoadInst *Load, unsigned Offset = 0) {
2290b57cec5SDimitry Andric AvailableValue Res;
23081ad6265SDimitry Andric Res.Val = Load;
23181ad6265SDimitry Andric Res.Kind = ValType::LoadVal;
2320b57cec5SDimitry Andric Res.Offset = Offset;
2330b57cec5SDimitry Andric return Res;
2340b57cec5SDimitry Andric }
2350b57cec5SDimitry Andric
getUndefllvm::gvn::AvailableValue2360b57cec5SDimitry Andric static AvailableValue getUndef() {
2370b57cec5SDimitry Andric AvailableValue Res;
23881ad6265SDimitry Andric Res.Val = nullptr;
23981ad6265SDimitry Andric Res.Kind = ValType::UndefVal;
2400b57cec5SDimitry Andric Res.Offset = 0;
2410b57cec5SDimitry Andric return Res;
2420b57cec5SDimitry Andric }
2430b57cec5SDimitry Andric
getSelectllvm::gvn::AvailableValue244bdd1243dSDimitry Andric static AvailableValue getSelect(SelectInst *Sel, Value *V1, Value *V2) {
24581ad6265SDimitry Andric AvailableValue Res;
24681ad6265SDimitry Andric Res.Val = Sel;
24781ad6265SDimitry Andric Res.Kind = ValType::SelectVal;
24881ad6265SDimitry Andric Res.Offset = 0;
249bdd1243dSDimitry Andric Res.V1 = V1;
250bdd1243dSDimitry Andric Res.V2 = V2;
25181ad6265SDimitry Andric return Res;
25281ad6265SDimitry Andric }
25381ad6265SDimitry Andric
isSimpleValuellvm::gvn::AvailableValue25481ad6265SDimitry Andric bool isSimpleValue() const { return Kind == ValType::SimpleVal; }
isCoercedLoadValuellvm::gvn::AvailableValue25581ad6265SDimitry Andric bool isCoercedLoadValue() const { return Kind == ValType::LoadVal; }
isMemIntrinValuellvm::gvn::AvailableValue25681ad6265SDimitry Andric bool isMemIntrinValue() const { return Kind == ValType::MemIntrin; }
isUndefValuellvm::gvn::AvailableValue25781ad6265SDimitry Andric bool isUndefValue() const { return Kind == ValType::UndefVal; }
isSelectValuellvm::gvn::AvailableValue25881ad6265SDimitry Andric bool isSelectValue() const { return Kind == ValType::SelectVal; }
2590b57cec5SDimitry Andric
getSimpleValuellvm::gvn::AvailableValue2600b57cec5SDimitry Andric Value *getSimpleValue() const {
2610b57cec5SDimitry Andric assert(isSimpleValue() && "Wrong accessor");
26281ad6265SDimitry Andric return Val;
2630b57cec5SDimitry Andric }
2640b57cec5SDimitry Andric
getCoercedLoadValuellvm::gvn::AvailableValue2650b57cec5SDimitry Andric LoadInst *getCoercedLoadValue() const {
2660b57cec5SDimitry Andric assert(isCoercedLoadValue() && "Wrong accessor");
26781ad6265SDimitry Andric return cast<LoadInst>(Val);
2680b57cec5SDimitry Andric }
2690b57cec5SDimitry Andric
getMemIntrinValuellvm::gvn::AvailableValue2700b57cec5SDimitry Andric MemIntrinsic *getMemIntrinValue() const {
2710b57cec5SDimitry Andric assert(isMemIntrinValue() && "Wrong accessor");
27281ad6265SDimitry Andric return cast<MemIntrinsic>(Val);
27381ad6265SDimitry Andric }
27481ad6265SDimitry Andric
getSelectValuellvm::gvn::AvailableValue27581ad6265SDimitry Andric SelectInst *getSelectValue() const {
27681ad6265SDimitry Andric assert(isSelectValue() && "Wrong accessor");
27781ad6265SDimitry Andric return cast<SelectInst>(Val);
2780b57cec5SDimitry Andric }
2790b57cec5SDimitry Andric
2800b57cec5SDimitry Andric /// Emit code at the specified insertion point to adjust the value defined
2810b57cec5SDimitry Andric /// here to the specified type. This handles various coercion cases.
282fe6060f1SDimitry Andric Value *MaterializeAdjustedValue(LoadInst *Load, Instruction *InsertPt,
283349cc55cSDimitry Andric GVNPass &gvn) const;
2840b57cec5SDimitry Andric };
2850b57cec5SDimitry Andric
2860b57cec5SDimitry Andric /// Represents an AvailableValue which can be rematerialized at the end of
2870b57cec5SDimitry Andric /// the associated BasicBlock.
2880b57cec5SDimitry Andric struct llvm::gvn::AvailableValueInBlock {
2890b57cec5SDimitry Andric /// BB - The basic block in question.
290480093f4SDimitry Andric BasicBlock *BB = nullptr;
2910b57cec5SDimitry Andric
2920b57cec5SDimitry Andric /// AV - The actual available value
2930b57cec5SDimitry Andric AvailableValue AV;
2940b57cec5SDimitry Andric
getllvm::gvn::AvailableValueInBlock2950b57cec5SDimitry Andric static AvailableValueInBlock get(BasicBlock *BB, AvailableValue &&AV) {
2960b57cec5SDimitry Andric AvailableValueInBlock Res;
2970b57cec5SDimitry Andric Res.BB = BB;
2980b57cec5SDimitry Andric Res.AV = std::move(AV);
2990b57cec5SDimitry Andric return Res;
3000b57cec5SDimitry Andric }
3010b57cec5SDimitry Andric
getllvm::gvn::AvailableValueInBlock3020b57cec5SDimitry Andric static AvailableValueInBlock get(BasicBlock *BB, Value *V,
3030b57cec5SDimitry Andric unsigned Offset = 0) {
3040b57cec5SDimitry Andric return get(BB, AvailableValue::get(V, Offset));
3050b57cec5SDimitry Andric }
3060b57cec5SDimitry Andric
getUndefllvm::gvn::AvailableValueInBlock3070b57cec5SDimitry Andric static AvailableValueInBlock getUndef(BasicBlock *BB) {
3080b57cec5SDimitry Andric return get(BB, AvailableValue::getUndef());
3090b57cec5SDimitry Andric }
3100b57cec5SDimitry Andric
getSelectllvm::gvn::AvailableValueInBlock311bdd1243dSDimitry Andric static AvailableValueInBlock getSelect(BasicBlock *BB, SelectInst *Sel,
312bdd1243dSDimitry Andric Value *V1, Value *V2) {
313bdd1243dSDimitry Andric return get(BB, AvailableValue::getSelect(Sel, V1, V2));
31481ad6265SDimitry Andric }
31581ad6265SDimitry Andric
3160b57cec5SDimitry Andric /// Emit code at the end of this block to adjust the value defined here to
3170b57cec5SDimitry Andric /// the specified type. This handles various coercion cases.
MaterializeAdjustedValuellvm::gvn::AvailableValueInBlock318349cc55cSDimitry Andric Value *MaterializeAdjustedValue(LoadInst *Load, GVNPass &gvn) const {
319fe6060f1SDimitry Andric return AV.MaterializeAdjustedValue(Load, BB->getTerminator(), gvn);
3200b57cec5SDimitry Andric }
3210b57cec5SDimitry Andric };
3220b57cec5SDimitry Andric
3230b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
3240b57cec5SDimitry Andric // ValueTable Internal Functions
3250b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
3260b57cec5SDimitry Andric
createExpr(Instruction * I)327349cc55cSDimitry Andric GVNPass::Expression GVNPass::ValueTable::createExpr(Instruction *I) {
3280b57cec5SDimitry Andric Expression e;
3290b57cec5SDimitry Andric e.type = I->getType();
3300b57cec5SDimitry Andric e.opcode = I->getOpcode();
331fe6060f1SDimitry Andric if (const GCRelocateInst *GCR = dyn_cast<GCRelocateInst>(I)) {
332fe6060f1SDimitry Andric // gc.relocate is 'special' call: its second and third operands are
333fe6060f1SDimitry Andric // not real values, but indices into statepoint's argument list.
334fe6060f1SDimitry Andric // Use the refered to values for purposes of identity.
335fe6060f1SDimitry Andric e.varargs.push_back(lookupOrAdd(GCR->getOperand(0)));
336fe6060f1SDimitry Andric e.varargs.push_back(lookupOrAdd(GCR->getBasePtr()));
337fe6060f1SDimitry Andric e.varargs.push_back(lookupOrAdd(GCR->getDerivedPtr()));
338fe6060f1SDimitry Andric } else {
339fe6060f1SDimitry Andric for (Use &Op : I->operands())
340fe6060f1SDimitry Andric e.varargs.push_back(lookupOrAdd(Op));
341fe6060f1SDimitry Andric }
3420b57cec5SDimitry Andric if (I->isCommutative()) {
3430b57cec5SDimitry Andric // Ensure that commutative instructions that only differ by a permutation
3440b57cec5SDimitry Andric // of their operands get the same value number by sorting the operand value
345e8d8bef9SDimitry Andric // numbers. Since commutative operands are the 1st two operands it is more
3460b57cec5SDimitry Andric // efficient to sort by hand rather than using, say, std::sort.
347e8d8bef9SDimitry Andric assert(I->getNumOperands() >= 2 && "Unsupported commutative instruction!");
3480b57cec5SDimitry Andric if (e.varargs[0] > e.varargs[1])
3490b57cec5SDimitry Andric std::swap(e.varargs[0], e.varargs[1]);
3500b57cec5SDimitry Andric e.commutative = true;
3510b57cec5SDimitry Andric }
3520b57cec5SDimitry Andric
3535ffd83dbSDimitry Andric if (auto *C = dyn_cast<CmpInst>(I)) {
3540b57cec5SDimitry Andric // Sort the operand value numbers so x<y and y>x get the same value number.
3550b57cec5SDimitry Andric CmpInst::Predicate Predicate = C->getPredicate();
3560b57cec5SDimitry Andric if (e.varargs[0] > e.varargs[1]) {
3570b57cec5SDimitry Andric std::swap(e.varargs[0], e.varargs[1]);
3580b57cec5SDimitry Andric Predicate = CmpInst::getSwappedPredicate(Predicate);
3590b57cec5SDimitry Andric }
3600b57cec5SDimitry Andric e.opcode = (C->getOpcode() << 8) | Predicate;
3610b57cec5SDimitry Andric e.commutative = true;
3625ffd83dbSDimitry Andric } else if (auto *E = dyn_cast<InsertValueInst>(I)) {
3635ffd83dbSDimitry Andric e.varargs.append(E->idx_begin(), E->idx_end());
3645ffd83dbSDimitry Andric } else if (auto *SVI = dyn_cast<ShuffleVectorInst>(I)) {
3655ffd83dbSDimitry Andric ArrayRef<int> ShuffleMask = SVI->getShuffleMask();
3665ffd83dbSDimitry Andric e.varargs.append(ShuffleMask.begin(), ShuffleMask.end());
3670b57cec5SDimitry Andric }
3680b57cec5SDimitry Andric
3690b57cec5SDimitry Andric return e;
3700b57cec5SDimitry Andric }
3710b57cec5SDimitry Andric
createCmpExpr(unsigned Opcode,CmpInst::Predicate Predicate,Value * LHS,Value * RHS)372349cc55cSDimitry Andric GVNPass::Expression GVNPass::ValueTable::createCmpExpr(
373349cc55cSDimitry Andric unsigned Opcode, CmpInst::Predicate Predicate, Value *LHS, Value *RHS) {
3740b57cec5SDimitry Andric assert((Opcode == Instruction::ICmp || Opcode == Instruction::FCmp) &&
3750b57cec5SDimitry Andric "Not a comparison!");
3760b57cec5SDimitry Andric Expression e;
3770b57cec5SDimitry Andric e.type = CmpInst::makeCmpResultType(LHS->getType());
3780b57cec5SDimitry Andric e.varargs.push_back(lookupOrAdd(LHS));
3790b57cec5SDimitry Andric e.varargs.push_back(lookupOrAdd(RHS));
3800b57cec5SDimitry Andric
3810b57cec5SDimitry Andric // Sort the operand value numbers so x<y and y>x get the same value number.
3820b57cec5SDimitry Andric if (e.varargs[0] > e.varargs[1]) {
3830b57cec5SDimitry Andric std::swap(e.varargs[0], e.varargs[1]);
3840b57cec5SDimitry Andric Predicate = CmpInst::getSwappedPredicate(Predicate);
3850b57cec5SDimitry Andric }
3860b57cec5SDimitry Andric e.opcode = (Opcode << 8) | Predicate;
3870b57cec5SDimitry Andric e.commutative = true;
3880b57cec5SDimitry Andric return e;
3890b57cec5SDimitry Andric }
3900b57cec5SDimitry Andric
391349cc55cSDimitry Andric GVNPass::Expression
createExtractvalueExpr(ExtractValueInst * EI)392349cc55cSDimitry Andric GVNPass::ValueTable::createExtractvalueExpr(ExtractValueInst *EI) {
3930b57cec5SDimitry Andric assert(EI && "Not an ExtractValueInst?");
3940b57cec5SDimitry Andric Expression e;
3950b57cec5SDimitry Andric e.type = EI->getType();
3960b57cec5SDimitry Andric e.opcode = 0;
3970b57cec5SDimitry Andric
3980b57cec5SDimitry Andric WithOverflowInst *WO = dyn_cast<WithOverflowInst>(EI->getAggregateOperand());
3990b57cec5SDimitry Andric if (WO != nullptr && EI->getNumIndices() == 1 && *EI->idx_begin() == 0) {
4000b57cec5SDimitry Andric // EI is an extract from one of our with.overflow intrinsics. Synthesize
4010b57cec5SDimitry Andric // a semantically equivalent expression instead of an extract value
4020b57cec5SDimitry Andric // expression.
4030b57cec5SDimitry Andric e.opcode = WO->getBinaryOp();
4040b57cec5SDimitry Andric e.varargs.push_back(lookupOrAdd(WO->getLHS()));
4050b57cec5SDimitry Andric e.varargs.push_back(lookupOrAdd(WO->getRHS()));
4060b57cec5SDimitry Andric return e;
4070b57cec5SDimitry Andric }
4080b57cec5SDimitry Andric
4090b57cec5SDimitry Andric // Not a recognised intrinsic. Fall back to producing an extract value
4100b57cec5SDimitry Andric // expression.
4110b57cec5SDimitry Andric e.opcode = EI->getOpcode();
412fe6060f1SDimitry Andric for (Use &Op : EI->operands())
413fe6060f1SDimitry Andric e.varargs.push_back(lookupOrAdd(Op));
4140b57cec5SDimitry Andric
415e8d8bef9SDimitry Andric append_range(e.varargs, EI->indices());
4160b57cec5SDimitry Andric
4170b57cec5SDimitry Andric return e;
4180b57cec5SDimitry Andric }
4190b57cec5SDimitry Andric
createGEPExpr(GetElementPtrInst * GEP)42081ad6265SDimitry Andric GVNPass::Expression GVNPass::ValueTable::createGEPExpr(GetElementPtrInst *GEP) {
42181ad6265SDimitry Andric Expression E;
42281ad6265SDimitry Andric Type *PtrTy = GEP->getType()->getScalarType();
423*0fca6ea1SDimitry Andric const DataLayout &DL = GEP->getDataLayout();
42481ad6265SDimitry Andric unsigned BitWidth = DL.getIndexTypeSizeInBits(PtrTy);
42581ad6265SDimitry Andric MapVector<Value *, APInt> VariableOffsets;
42681ad6265SDimitry Andric APInt ConstantOffset(BitWidth, 0);
42706c3fb27SDimitry Andric if (GEP->collectOffset(DL, BitWidth, VariableOffsets, ConstantOffset)) {
42806c3fb27SDimitry Andric // Convert into offset representation, to recognize equivalent address
42906c3fb27SDimitry Andric // calculations that use different type encoding.
43081ad6265SDimitry Andric LLVMContext &Context = GEP->getContext();
43181ad6265SDimitry Andric E.opcode = GEP->getOpcode();
43281ad6265SDimitry Andric E.type = nullptr;
43381ad6265SDimitry Andric E.varargs.push_back(lookupOrAdd(GEP->getPointerOperand()));
43481ad6265SDimitry Andric for (const auto &Pair : VariableOffsets) {
43581ad6265SDimitry Andric E.varargs.push_back(lookupOrAdd(Pair.first));
43681ad6265SDimitry Andric E.varargs.push_back(lookupOrAdd(ConstantInt::get(Context, Pair.second)));
43781ad6265SDimitry Andric }
43881ad6265SDimitry Andric if (!ConstantOffset.isZero())
43981ad6265SDimitry Andric E.varargs.push_back(
44081ad6265SDimitry Andric lookupOrAdd(ConstantInt::get(Context, ConstantOffset)));
44181ad6265SDimitry Andric } else {
44206c3fb27SDimitry Andric // If converting to offset representation fails (for scalable vectors),
44306c3fb27SDimitry Andric // fall back to type-based implementation:
44481ad6265SDimitry Andric E.opcode = GEP->getOpcode();
44581ad6265SDimitry Andric E.type = GEP->getSourceElementType();
44681ad6265SDimitry Andric for (Use &Op : GEP->operands())
44781ad6265SDimitry Andric E.varargs.push_back(lookupOrAdd(Op));
44881ad6265SDimitry Andric }
44981ad6265SDimitry Andric return E;
45081ad6265SDimitry Andric }
45181ad6265SDimitry Andric
4520b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
4530b57cec5SDimitry Andric // ValueTable External Functions
4540b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
4550b57cec5SDimitry Andric
456349cc55cSDimitry Andric GVNPass::ValueTable::ValueTable() = default;
457349cc55cSDimitry Andric GVNPass::ValueTable::ValueTable(const ValueTable &) = default;
458349cc55cSDimitry Andric GVNPass::ValueTable::ValueTable(ValueTable &&) = default;
459349cc55cSDimitry Andric GVNPass::ValueTable::~ValueTable() = default;
460349cc55cSDimitry Andric GVNPass::ValueTable &
461349cc55cSDimitry Andric GVNPass::ValueTable::operator=(const GVNPass::ValueTable &Arg) = default;
4620b57cec5SDimitry Andric
4630b57cec5SDimitry Andric /// add - Insert a value into the table with a specified value number.
add(Value * V,uint32_t num)464349cc55cSDimitry Andric void GVNPass::ValueTable::add(Value *V, uint32_t num) {
4650b57cec5SDimitry Andric valueNumbering.insert(std::make_pair(V, num));
4660b57cec5SDimitry Andric if (PHINode *PN = dyn_cast<PHINode>(V))
4670b57cec5SDimitry Andric NumberingPhi[num] = PN;
4680b57cec5SDimitry Andric }
4690b57cec5SDimitry Andric
lookupOrAddCall(CallInst * C)470349cc55cSDimitry Andric uint32_t GVNPass::ValueTable::lookupOrAddCall(CallInst *C) {
471bdd1243dSDimitry Andric // FIXME: Currently the calls which may access the thread id may
472bdd1243dSDimitry Andric // be considered as not accessing the memory. But this is
473bdd1243dSDimitry Andric // problematic for coroutines, since coroutines may resume in a
474bdd1243dSDimitry Andric // different thread. So we disable the optimization here for the
475bdd1243dSDimitry Andric // correctness. However, it may block many other correct
476bdd1243dSDimitry Andric // optimizations. Revert this one when we detect the memory
477bdd1243dSDimitry Andric // accessing kind more precisely.
47806c3fb27SDimitry Andric if (C->getFunction()->isPresplitCoroutine()) {
47906c3fb27SDimitry Andric valueNumbering[C] = nextValueNumber;
48006c3fb27SDimitry Andric return nextValueNumber++;
48106c3fb27SDimitry Andric }
48206c3fb27SDimitry Andric
48306c3fb27SDimitry Andric // Do not combine convergent calls since they implicitly depend on the set of
48406c3fb27SDimitry Andric // threads that is currently executing, and they might be in different basic
48506c3fb27SDimitry Andric // blocks.
48606c3fb27SDimitry Andric if (C->isConvergent()) {
48706c3fb27SDimitry Andric valueNumbering[C] = nextValueNumber;
48806c3fb27SDimitry Andric return nextValueNumber++;
48906c3fb27SDimitry Andric }
49006c3fb27SDimitry Andric
49106c3fb27SDimitry Andric if (AA->doesNotAccessMemory(C)) {
4920b57cec5SDimitry Andric Expression exp = createExpr(C);
4930b57cec5SDimitry Andric uint32_t e = assignExpNewValueNum(exp).first;
4940b57cec5SDimitry Andric valueNumbering[C] = e;
4950b57cec5SDimitry Andric return e;
49606c3fb27SDimitry Andric }
49706c3fb27SDimitry Andric
49806c3fb27SDimitry Andric if (MD && AA->onlyReadsMemory(C)) {
4990b57cec5SDimitry Andric Expression exp = createExpr(C);
5000b57cec5SDimitry Andric auto ValNum = assignExpNewValueNum(exp);
5010b57cec5SDimitry Andric if (ValNum.second) {
5020b57cec5SDimitry Andric valueNumbering[C] = ValNum.first;
5030b57cec5SDimitry Andric return ValNum.first;
5040b57cec5SDimitry Andric }
5050b57cec5SDimitry Andric
5060b57cec5SDimitry Andric MemDepResult local_dep = MD->getDependency(C);
5070b57cec5SDimitry Andric
5080b57cec5SDimitry Andric if (!local_dep.isDef() && !local_dep.isNonLocal()) {
5090b57cec5SDimitry Andric valueNumbering[C] = nextValueNumber;
5100b57cec5SDimitry Andric return nextValueNumber++;
5110b57cec5SDimitry Andric }
5120b57cec5SDimitry Andric
5130b57cec5SDimitry Andric if (local_dep.isDef()) {
514bdd1243dSDimitry Andric // For masked load/store intrinsics, the local_dep may actually be
515e8d8bef9SDimitry Andric // a normal load or store instruction.
516e8d8bef9SDimitry Andric CallInst *local_cdep = dyn_cast<CallInst>(local_dep.getInst());
5170b57cec5SDimitry Andric
518349cc55cSDimitry Andric if (!local_cdep || local_cdep->arg_size() != C->arg_size()) {
5190b57cec5SDimitry Andric valueNumbering[C] = nextValueNumber;
5200b57cec5SDimitry Andric return nextValueNumber++;
5210b57cec5SDimitry Andric }
5220b57cec5SDimitry Andric
523349cc55cSDimitry Andric for (unsigned i = 0, e = C->arg_size(); i < e; ++i) {
5240b57cec5SDimitry Andric uint32_t c_vn = lookupOrAdd(C->getArgOperand(i));
5250b57cec5SDimitry Andric uint32_t cd_vn = lookupOrAdd(local_cdep->getArgOperand(i));
5260b57cec5SDimitry Andric if (c_vn != cd_vn) {
5270b57cec5SDimitry Andric valueNumbering[C] = nextValueNumber;
5280b57cec5SDimitry Andric return nextValueNumber++;
5290b57cec5SDimitry Andric }
5300b57cec5SDimitry Andric }
5310b57cec5SDimitry Andric
5320b57cec5SDimitry Andric uint32_t v = lookupOrAdd(local_cdep);
5330b57cec5SDimitry Andric valueNumbering[C] = v;
5340b57cec5SDimitry Andric return v;
5350b57cec5SDimitry Andric }
5360b57cec5SDimitry Andric
5370b57cec5SDimitry Andric // Non-local case.
5380b57cec5SDimitry Andric const MemoryDependenceResults::NonLocalDepInfo &deps =
5390b57cec5SDimitry Andric MD->getNonLocalCallDependency(C);
5400b57cec5SDimitry Andric // FIXME: Move the checking logic to MemDep!
5410b57cec5SDimitry Andric CallInst* cdep = nullptr;
5420b57cec5SDimitry Andric
5430b57cec5SDimitry Andric // Check to see if we have a single dominating call instruction that is
5440b57cec5SDimitry Andric // identical to C.
545bdd1243dSDimitry Andric for (const NonLocalDepEntry &I : deps) {
546bdd1243dSDimitry Andric if (I.getResult().isNonLocal())
5470b57cec5SDimitry Andric continue;
5480b57cec5SDimitry Andric
5490b57cec5SDimitry Andric // We don't handle non-definitions. If we already have a call, reject
5500b57cec5SDimitry Andric // instruction dependencies.
551bdd1243dSDimitry Andric if (!I.getResult().isDef() || cdep != nullptr) {
5520b57cec5SDimitry Andric cdep = nullptr;
5530b57cec5SDimitry Andric break;
5540b57cec5SDimitry Andric }
5550b57cec5SDimitry Andric
556bdd1243dSDimitry Andric CallInst *NonLocalDepCall = dyn_cast<CallInst>(I.getResult().getInst());
5570b57cec5SDimitry Andric // FIXME: All duplicated with non-local case.
558bdd1243dSDimitry Andric if (NonLocalDepCall && DT->properlyDominates(I.getBB(), C->getParent())) {
5590b57cec5SDimitry Andric cdep = NonLocalDepCall;
5600b57cec5SDimitry Andric continue;
5610b57cec5SDimitry Andric }
5620b57cec5SDimitry Andric
5630b57cec5SDimitry Andric cdep = nullptr;
5640b57cec5SDimitry Andric break;
5650b57cec5SDimitry Andric }
5660b57cec5SDimitry Andric
5670b57cec5SDimitry Andric if (!cdep) {
5680b57cec5SDimitry Andric valueNumbering[C] = nextValueNumber;
5690b57cec5SDimitry Andric return nextValueNumber++;
5700b57cec5SDimitry Andric }
5710b57cec5SDimitry Andric
572349cc55cSDimitry Andric if (cdep->arg_size() != C->arg_size()) {
5730b57cec5SDimitry Andric valueNumbering[C] = nextValueNumber;
5740b57cec5SDimitry Andric return nextValueNumber++;
5750b57cec5SDimitry Andric }
576349cc55cSDimitry Andric for (unsigned i = 0, e = C->arg_size(); i < e; ++i) {
5770b57cec5SDimitry Andric uint32_t c_vn = lookupOrAdd(C->getArgOperand(i));
5780b57cec5SDimitry Andric uint32_t cd_vn = lookupOrAdd(cdep->getArgOperand(i));
5790b57cec5SDimitry Andric if (c_vn != cd_vn) {
5800b57cec5SDimitry Andric valueNumbering[C] = nextValueNumber;
5810b57cec5SDimitry Andric return nextValueNumber++;
5820b57cec5SDimitry Andric }
5830b57cec5SDimitry Andric }
5840b57cec5SDimitry Andric
5850b57cec5SDimitry Andric uint32_t v = lookupOrAdd(cdep);
5860b57cec5SDimitry Andric valueNumbering[C] = v;
5870b57cec5SDimitry Andric return v;
58806c3fb27SDimitry Andric }
58906c3fb27SDimitry Andric
5900b57cec5SDimitry Andric valueNumbering[C] = nextValueNumber;
5910b57cec5SDimitry Andric return nextValueNumber++;
5920b57cec5SDimitry Andric }
5930b57cec5SDimitry Andric
5940b57cec5SDimitry Andric /// Returns true if a value number exists for the specified value.
exists(Value * V) const595349cc55cSDimitry Andric bool GVNPass::ValueTable::exists(Value *V) const {
596cb14a3feSDimitry Andric return valueNumbering.contains(V);
597349cc55cSDimitry Andric }
5980b57cec5SDimitry Andric
5990b57cec5SDimitry Andric /// lookup_or_add - Returns the value number for the specified value, assigning
6000b57cec5SDimitry Andric /// it a new number if it did not have one before.
lookupOrAdd(Value * V)601349cc55cSDimitry Andric uint32_t GVNPass::ValueTable::lookupOrAdd(Value *V) {
6020b57cec5SDimitry Andric DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
6030b57cec5SDimitry Andric if (VI != valueNumbering.end())
6040b57cec5SDimitry Andric return VI->second;
6050b57cec5SDimitry Andric
606bdd1243dSDimitry Andric auto *I = dyn_cast<Instruction>(V);
607bdd1243dSDimitry Andric if (!I) {
6080b57cec5SDimitry Andric valueNumbering[V] = nextValueNumber;
6090b57cec5SDimitry Andric return nextValueNumber++;
6100b57cec5SDimitry Andric }
6110b57cec5SDimitry Andric
6120b57cec5SDimitry Andric Expression exp;
6130b57cec5SDimitry Andric switch (I->getOpcode()) {
6140b57cec5SDimitry Andric case Instruction::Call:
6150b57cec5SDimitry Andric return lookupOrAddCall(cast<CallInst>(I));
6160b57cec5SDimitry Andric case Instruction::FNeg:
6170b57cec5SDimitry Andric case Instruction::Add:
6180b57cec5SDimitry Andric case Instruction::FAdd:
6190b57cec5SDimitry Andric case Instruction::Sub:
6200b57cec5SDimitry Andric case Instruction::FSub:
6210b57cec5SDimitry Andric case Instruction::Mul:
6220b57cec5SDimitry Andric case Instruction::FMul:
6230b57cec5SDimitry Andric case Instruction::UDiv:
6240b57cec5SDimitry Andric case Instruction::SDiv:
6250b57cec5SDimitry Andric case Instruction::FDiv:
6260b57cec5SDimitry Andric case Instruction::URem:
6270b57cec5SDimitry Andric case Instruction::SRem:
6280b57cec5SDimitry Andric case Instruction::FRem:
6290b57cec5SDimitry Andric case Instruction::Shl:
6300b57cec5SDimitry Andric case Instruction::LShr:
6310b57cec5SDimitry Andric case Instruction::AShr:
6320b57cec5SDimitry Andric case Instruction::And:
6330b57cec5SDimitry Andric case Instruction::Or:
6340b57cec5SDimitry Andric case Instruction::Xor:
6350b57cec5SDimitry Andric case Instruction::ICmp:
6360b57cec5SDimitry Andric case Instruction::FCmp:
6370b57cec5SDimitry Andric case Instruction::Trunc:
6380b57cec5SDimitry Andric case Instruction::ZExt:
6390b57cec5SDimitry Andric case Instruction::SExt:
6400b57cec5SDimitry Andric case Instruction::FPToUI:
6410b57cec5SDimitry Andric case Instruction::FPToSI:
6420b57cec5SDimitry Andric case Instruction::UIToFP:
6430b57cec5SDimitry Andric case Instruction::SIToFP:
6440b57cec5SDimitry Andric case Instruction::FPTrunc:
6450b57cec5SDimitry Andric case Instruction::FPExt:
6460b57cec5SDimitry Andric case Instruction::PtrToInt:
6470b57cec5SDimitry Andric case Instruction::IntToPtr:
6480b57cec5SDimitry Andric case Instruction::AddrSpaceCast:
6490b57cec5SDimitry Andric case Instruction::BitCast:
6500b57cec5SDimitry Andric case Instruction::Select:
6515ffd83dbSDimitry Andric case Instruction::Freeze:
6520b57cec5SDimitry Andric case Instruction::ExtractElement:
6530b57cec5SDimitry Andric case Instruction::InsertElement:
6540b57cec5SDimitry Andric case Instruction::ShuffleVector:
6550b57cec5SDimitry Andric case Instruction::InsertValue:
6560b57cec5SDimitry Andric exp = createExpr(I);
6570b57cec5SDimitry Andric break;
65881ad6265SDimitry Andric case Instruction::GetElementPtr:
65981ad6265SDimitry Andric exp = createGEPExpr(cast<GetElementPtrInst>(I));
66081ad6265SDimitry Andric break;
6610b57cec5SDimitry Andric case Instruction::ExtractValue:
6620b57cec5SDimitry Andric exp = createExtractvalueExpr(cast<ExtractValueInst>(I));
6630b57cec5SDimitry Andric break;
6640b57cec5SDimitry Andric case Instruction::PHI:
6650b57cec5SDimitry Andric valueNumbering[V] = nextValueNumber;
6660b57cec5SDimitry Andric NumberingPhi[nextValueNumber] = cast<PHINode>(V);
6670b57cec5SDimitry Andric return nextValueNumber++;
6680b57cec5SDimitry Andric default:
6690b57cec5SDimitry Andric valueNumbering[V] = nextValueNumber;
6700b57cec5SDimitry Andric return nextValueNumber++;
6710b57cec5SDimitry Andric }
6720b57cec5SDimitry Andric
6730b57cec5SDimitry Andric uint32_t e = assignExpNewValueNum(exp).first;
6740b57cec5SDimitry Andric valueNumbering[V] = e;
6750b57cec5SDimitry Andric return e;
6760b57cec5SDimitry Andric }
6770b57cec5SDimitry Andric
6780b57cec5SDimitry Andric /// Returns the value number of the specified value. Fails if
6790b57cec5SDimitry Andric /// the value has not yet been numbered.
lookup(Value * V,bool Verify) const680349cc55cSDimitry Andric uint32_t GVNPass::ValueTable::lookup(Value *V, bool Verify) const {
6810b57cec5SDimitry Andric DenseMap<Value*, uint32_t>::const_iterator VI = valueNumbering.find(V);
6820b57cec5SDimitry Andric if (Verify) {
6830b57cec5SDimitry Andric assert(VI != valueNumbering.end() && "Value not numbered?");
6840b57cec5SDimitry Andric return VI->second;
6850b57cec5SDimitry Andric }
6860b57cec5SDimitry Andric return (VI != valueNumbering.end()) ? VI->second : 0;
6870b57cec5SDimitry Andric }
6880b57cec5SDimitry Andric
6890b57cec5SDimitry Andric /// Returns the value number of the given comparison,
6900b57cec5SDimitry Andric /// assigning it a new number if it did not have one before. Useful when
6910b57cec5SDimitry Andric /// we deduced the result of a comparison, but don't immediately have an
6920b57cec5SDimitry Andric /// instruction realizing that comparison to hand.
lookupOrAddCmp(unsigned Opcode,CmpInst::Predicate Predicate,Value * LHS,Value * RHS)693349cc55cSDimitry Andric uint32_t GVNPass::ValueTable::lookupOrAddCmp(unsigned Opcode,
6940b57cec5SDimitry Andric CmpInst::Predicate Predicate,
6950b57cec5SDimitry Andric Value *LHS, Value *RHS) {
6960b57cec5SDimitry Andric Expression exp = createCmpExpr(Opcode, Predicate, LHS, RHS);
6970b57cec5SDimitry Andric return assignExpNewValueNum(exp).first;
6980b57cec5SDimitry Andric }
6990b57cec5SDimitry Andric
7000b57cec5SDimitry Andric /// Remove all entries from the ValueTable.
clear()701349cc55cSDimitry Andric void GVNPass::ValueTable::clear() {
7020b57cec5SDimitry Andric valueNumbering.clear();
7030b57cec5SDimitry Andric expressionNumbering.clear();
7040b57cec5SDimitry Andric NumberingPhi.clear();
7050b57cec5SDimitry Andric PhiTranslateTable.clear();
7060b57cec5SDimitry Andric nextValueNumber = 1;
7070b57cec5SDimitry Andric Expressions.clear();
7080b57cec5SDimitry Andric ExprIdx.clear();
7090b57cec5SDimitry Andric nextExprNumber = 0;
7100b57cec5SDimitry Andric }
7110b57cec5SDimitry Andric
7120b57cec5SDimitry Andric /// Remove a value from the value numbering.
erase(Value * V)713349cc55cSDimitry Andric void GVNPass::ValueTable::erase(Value *V) {
7140b57cec5SDimitry Andric uint32_t Num = valueNumbering.lookup(V);
7150b57cec5SDimitry Andric valueNumbering.erase(V);
7160b57cec5SDimitry Andric // If V is PHINode, V <--> value number is an one-to-one mapping.
7170b57cec5SDimitry Andric if (isa<PHINode>(V))
7180b57cec5SDimitry Andric NumberingPhi.erase(Num);
7190b57cec5SDimitry Andric }
7200b57cec5SDimitry Andric
7210b57cec5SDimitry Andric /// verifyRemoved - Verify that the value is removed from all internal data
7220b57cec5SDimitry Andric /// structures.
verifyRemoved(const Value * V) const723349cc55cSDimitry Andric void GVNPass::ValueTable::verifyRemoved(const Value *V) const {
72406c3fb27SDimitry Andric assert(!valueNumbering.contains(V) &&
72506c3fb27SDimitry Andric "Inst still occurs in value numbering map!");
7260b57cec5SDimitry Andric }
7270b57cec5SDimitry Andric
7280b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
729*0fca6ea1SDimitry Andric // LeaderMap External Functions
730*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
731*0fca6ea1SDimitry Andric
732*0fca6ea1SDimitry Andric /// Push a new Value to the LeaderTable onto the list for its value number.
insert(uint32_t N,Value * V,const BasicBlock * BB)733*0fca6ea1SDimitry Andric void GVNPass::LeaderMap::insert(uint32_t N, Value *V, const BasicBlock *BB) {
734*0fca6ea1SDimitry Andric LeaderListNode &Curr = NumToLeaders[N];
735*0fca6ea1SDimitry Andric if (!Curr.Entry.Val) {
736*0fca6ea1SDimitry Andric Curr.Entry.Val = V;
737*0fca6ea1SDimitry Andric Curr.Entry.BB = BB;
738*0fca6ea1SDimitry Andric return;
739*0fca6ea1SDimitry Andric }
740*0fca6ea1SDimitry Andric
741*0fca6ea1SDimitry Andric LeaderListNode *Node = TableAllocator.Allocate<LeaderListNode>();
742*0fca6ea1SDimitry Andric Node->Entry.Val = V;
743*0fca6ea1SDimitry Andric Node->Entry.BB = BB;
744*0fca6ea1SDimitry Andric Node->Next = Curr.Next;
745*0fca6ea1SDimitry Andric Curr.Next = Node;
746*0fca6ea1SDimitry Andric }
747*0fca6ea1SDimitry Andric
748*0fca6ea1SDimitry Andric /// Scan the list of values corresponding to a given
749*0fca6ea1SDimitry Andric /// value number, and remove the given instruction if encountered.
erase(uint32_t N,Instruction * I,const BasicBlock * BB)750*0fca6ea1SDimitry Andric void GVNPass::LeaderMap::erase(uint32_t N, Instruction *I,
751*0fca6ea1SDimitry Andric const BasicBlock *BB) {
752*0fca6ea1SDimitry Andric LeaderListNode *Prev = nullptr;
753*0fca6ea1SDimitry Andric LeaderListNode *Curr = &NumToLeaders[N];
754*0fca6ea1SDimitry Andric
755*0fca6ea1SDimitry Andric while (Curr && (Curr->Entry.Val != I || Curr->Entry.BB != BB)) {
756*0fca6ea1SDimitry Andric Prev = Curr;
757*0fca6ea1SDimitry Andric Curr = Curr->Next;
758*0fca6ea1SDimitry Andric }
759*0fca6ea1SDimitry Andric
760*0fca6ea1SDimitry Andric if (!Curr)
761*0fca6ea1SDimitry Andric return;
762*0fca6ea1SDimitry Andric
763*0fca6ea1SDimitry Andric if (Prev) {
764*0fca6ea1SDimitry Andric Prev->Next = Curr->Next;
765*0fca6ea1SDimitry Andric } else {
766*0fca6ea1SDimitry Andric if (!Curr->Next) {
767*0fca6ea1SDimitry Andric Curr->Entry.Val = nullptr;
768*0fca6ea1SDimitry Andric Curr->Entry.BB = nullptr;
769*0fca6ea1SDimitry Andric } else {
770*0fca6ea1SDimitry Andric LeaderListNode *Next = Curr->Next;
771*0fca6ea1SDimitry Andric Curr->Entry.Val = Next->Entry.Val;
772*0fca6ea1SDimitry Andric Curr->Entry.BB = Next->Entry.BB;
773*0fca6ea1SDimitry Andric Curr->Next = Next->Next;
774*0fca6ea1SDimitry Andric }
775*0fca6ea1SDimitry Andric }
776*0fca6ea1SDimitry Andric }
777*0fca6ea1SDimitry Andric
verifyRemoved(const Value * V) const778*0fca6ea1SDimitry Andric void GVNPass::LeaderMap::verifyRemoved(const Value *V) const {
779*0fca6ea1SDimitry Andric // Walk through the value number scope to make sure the instruction isn't
780*0fca6ea1SDimitry Andric // ferreted away in it.
781*0fca6ea1SDimitry Andric for (const auto &I : NumToLeaders) {
782*0fca6ea1SDimitry Andric (void)I;
783*0fca6ea1SDimitry Andric assert(I.second.Entry.Val != V && "Inst still in value numbering scope!");
784*0fca6ea1SDimitry Andric assert(
785*0fca6ea1SDimitry Andric std::none_of(leader_iterator(&I.second), leader_iterator(nullptr),
786*0fca6ea1SDimitry Andric [=](const LeaderTableEntry &E) { return E.Val == V; }) &&
787*0fca6ea1SDimitry Andric "Inst still in value numbering scope!");
788*0fca6ea1SDimitry Andric }
789*0fca6ea1SDimitry Andric }
790*0fca6ea1SDimitry Andric
791*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
7920b57cec5SDimitry Andric // GVN Pass
7930b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
7940b57cec5SDimitry Andric
isPREEnabled() const795349cc55cSDimitry Andric bool GVNPass::isPREEnabled() const {
79681ad6265SDimitry Andric return Options.AllowPRE.value_or(GVNEnablePRE);
7975ffd83dbSDimitry Andric }
7985ffd83dbSDimitry Andric
isLoadPREEnabled() const799349cc55cSDimitry Andric bool GVNPass::isLoadPREEnabled() const {
80081ad6265SDimitry Andric return Options.AllowLoadPRE.value_or(GVNEnableLoadPRE);
8015ffd83dbSDimitry Andric }
8025ffd83dbSDimitry Andric
isLoadInLoopPREEnabled() const803349cc55cSDimitry Andric bool GVNPass::isLoadInLoopPREEnabled() const {
80481ad6265SDimitry Andric return Options.AllowLoadInLoopPRE.value_or(GVNEnableLoadInLoopPRE);
8055ffd83dbSDimitry Andric }
8065ffd83dbSDimitry Andric
isLoadPRESplitBackedgeEnabled() const807349cc55cSDimitry Andric bool GVNPass::isLoadPRESplitBackedgeEnabled() const {
80881ad6265SDimitry Andric return Options.AllowLoadPRESplitBackedge.value_or(
809e8d8bef9SDimitry Andric GVNEnableSplitBackedgeInLoadPRE);
810e8d8bef9SDimitry Andric }
811e8d8bef9SDimitry Andric
isMemDepEnabled() const812349cc55cSDimitry Andric bool GVNPass::isMemDepEnabled() const {
81381ad6265SDimitry Andric return Options.AllowMemDep.value_or(GVNEnableMemDep);
8145ffd83dbSDimitry Andric }
8155ffd83dbSDimitry Andric
run(Function & F,FunctionAnalysisManager & AM)816349cc55cSDimitry Andric PreservedAnalyses GVNPass::run(Function &F, FunctionAnalysisManager &AM) {
8170b57cec5SDimitry Andric // FIXME: The order of evaluation of these 'getResult' calls is very
8180b57cec5SDimitry Andric // significant! Re-ordering these variables will cause GVN when run alone to
8190b57cec5SDimitry Andric // be less effective! We should fix memdep and basic-aa to not exhibit this
8200b57cec5SDimitry Andric // behavior, but until then don't change the order here.
8210b57cec5SDimitry Andric auto &AC = AM.getResult<AssumptionAnalysis>(F);
8220b57cec5SDimitry Andric auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
8230b57cec5SDimitry Andric auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
8240b57cec5SDimitry Andric auto &AA = AM.getResult<AAManager>(F);
8255ffd83dbSDimitry Andric auto *MemDep =
8265ffd83dbSDimitry Andric isMemDepEnabled() ? &AM.getResult<MemoryDependenceAnalysis>(F) : nullptr;
8275f757f3fSDimitry Andric auto &LI = AM.getResult<LoopAnalysis>(F);
828e8d8bef9SDimitry Andric auto *MSSA = AM.getCachedResult<MemorySSAAnalysis>(F);
8290b57cec5SDimitry Andric auto &ORE = AM.getResult<OptimizationRemarkEmitterAnalysis>(F);
830e8d8bef9SDimitry Andric bool Changed = runImpl(F, AC, DT, TLI, AA, MemDep, LI, &ORE,
831e8d8bef9SDimitry Andric MSSA ? &MSSA->getMSSA() : nullptr);
8320b57cec5SDimitry Andric if (!Changed)
8330b57cec5SDimitry Andric return PreservedAnalyses::all();
8340b57cec5SDimitry Andric PreservedAnalyses PA;
8350b57cec5SDimitry Andric PA.preserve<DominatorTreeAnalysis>();
8360b57cec5SDimitry Andric PA.preserve<TargetLibraryAnalysis>();
837e8d8bef9SDimitry Andric if (MSSA)
838e8d8bef9SDimitry Andric PA.preserve<MemorySSAAnalysis>();
8398bcb0991SDimitry Andric PA.preserve<LoopAnalysis>();
8400b57cec5SDimitry Andric return PA;
8410b57cec5SDimitry Andric }
8420b57cec5SDimitry Andric
printPipeline(raw_ostream & OS,function_ref<StringRef (StringRef)> MapClassName2PassName)843349cc55cSDimitry Andric void GVNPass::printPipeline(
844349cc55cSDimitry Andric raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
845349cc55cSDimitry Andric static_cast<PassInfoMixin<GVNPass> *>(this)->printPipeline(
846349cc55cSDimitry Andric OS, MapClassName2PassName);
847349cc55cSDimitry Andric
84806c3fb27SDimitry Andric OS << '<';
849bdd1243dSDimitry Andric if (Options.AllowPRE != std::nullopt)
850bdd1243dSDimitry Andric OS << (*Options.AllowPRE ? "" : "no-") << "pre;";
851bdd1243dSDimitry Andric if (Options.AllowLoadPRE != std::nullopt)
852bdd1243dSDimitry Andric OS << (*Options.AllowLoadPRE ? "" : "no-") << "load-pre;";
853bdd1243dSDimitry Andric if (Options.AllowLoadPRESplitBackedge != std::nullopt)
854bdd1243dSDimitry Andric OS << (*Options.AllowLoadPRESplitBackedge ? "" : "no-")
855349cc55cSDimitry Andric << "split-backedge-load-pre;";
856bdd1243dSDimitry Andric if (Options.AllowMemDep != std::nullopt)
857bdd1243dSDimitry Andric OS << (*Options.AllowMemDep ? "" : "no-") << "memdep";
85806c3fb27SDimitry Andric OS << '>';
859349cc55cSDimitry Andric }
860349cc55cSDimitry Andric
8610b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump(DenseMap<uint32_t,Value * > & d) const862349cc55cSDimitry Andric LLVM_DUMP_METHOD void GVNPass::dump(DenseMap<uint32_t, Value *> &d) const {
8630b57cec5SDimitry Andric errs() << "{\n";
864fe6060f1SDimitry Andric for (auto &I : d) {
865fe6060f1SDimitry Andric errs() << I.first << "\n";
866fe6060f1SDimitry Andric I.second->dump();
8670b57cec5SDimitry Andric }
8680b57cec5SDimitry Andric errs() << "}\n";
8690b57cec5SDimitry Andric }
8700b57cec5SDimitry Andric #endif
8710b57cec5SDimitry Andric
872e8d8bef9SDimitry Andric enum class AvailabilityState : char {
873e8d8bef9SDimitry Andric /// We know the block *is not* fully available. This is a fixpoint.
874e8d8bef9SDimitry Andric Unavailable = 0,
875e8d8bef9SDimitry Andric /// We know the block *is* fully available. This is a fixpoint.
876e8d8bef9SDimitry Andric Available = 1,
877e8d8bef9SDimitry Andric /// We do not know whether the block is fully available or not,
878e8d8bef9SDimitry Andric /// but we are currently speculating that it will be.
879e8d8bef9SDimitry Andric /// If it would have turned out that the block was, in fact, not fully
880e8d8bef9SDimitry Andric /// available, this would have been cleaned up into an Unavailable.
881e8d8bef9SDimitry Andric SpeculativelyAvailable = 2,
882e8d8bef9SDimitry Andric };
883e8d8bef9SDimitry Andric
8840b57cec5SDimitry Andric /// Return true if we can prove that the value
8850b57cec5SDimitry Andric /// we're analyzing is fully available in the specified block. As we go, keep
8860b57cec5SDimitry Andric /// track of which blocks we know are fully alive in FullyAvailableBlocks. This
8870b57cec5SDimitry Andric /// map is actually a tri-state map with the following values:
8880b57cec5SDimitry Andric /// 0) we know the block *is not* fully available.
8890b57cec5SDimitry Andric /// 1) we know the block *is* fully available.
8900b57cec5SDimitry Andric /// 2) we do not know whether the block is fully available or not, but we are
8910b57cec5SDimitry Andric /// currently speculating that it will be.
IsValueFullyAvailableInBlock(BasicBlock * BB,DenseMap<BasicBlock *,AvailabilityState> & FullyAvailableBlocks)892e8d8bef9SDimitry Andric static bool IsValueFullyAvailableInBlock(
893e8d8bef9SDimitry Andric BasicBlock *BB,
894e8d8bef9SDimitry Andric DenseMap<BasicBlock *, AvailabilityState> &FullyAvailableBlocks) {
895e8d8bef9SDimitry Andric SmallVector<BasicBlock *, 32> Worklist;
896bdd1243dSDimitry Andric std::optional<BasicBlock *> UnavailableBB;
8970b57cec5SDimitry Andric
898e8d8bef9SDimitry Andric // The number of times we didn't find an entry for a block in a map and
899e8d8bef9SDimitry Andric // optimistically inserted an entry marking block as speculatively available.
900e8d8bef9SDimitry Andric unsigned NumNewNewSpeculativelyAvailableBBs = 0;
9010b57cec5SDimitry Andric
902e8d8bef9SDimitry Andric #ifndef NDEBUG
903e8d8bef9SDimitry Andric SmallSet<BasicBlock *, 32> NewSpeculativelyAvailableBBs;
904e8d8bef9SDimitry Andric SmallVector<BasicBlock *, 32> AvailableBBs;
905e8d8bef9SDimitry Andric #endif
906e8d8bef9SDimitry Andric
907e8d8bef9SDimitry Andric Worklist.emplace_back(BB);
908e8d8bef9SDimitry Andric while (!Worklist.empty()) {
909fe6060f1SDimitry Andric BasicBlock *CurrBB = Worklist.pop_back_val(); // LoadFO - depth-first!
910e8d8bef9SDimitry Andric // Optimistically assume that the block is Speculatively Available and check
911e8d8bef9SDimitry Andric // to see if we already know about this block in one lookup.
912e8d8bef9SDimitry Andric std::pair<DenseMap<BasicBlock *, AvailabilityState>::iterator, bool> IV =
913e8d8bef9SDimitry Andric FullyAvailableBlocks.try_emplace(
914e8d8bef9SDimitry Andric CurrBB, AvailabilityState::SpeculativelyAvailable);
915e8d8bef9SDimitry Andric AvailabilityState &State = IV.first->second;
916e8d8bef9SDimitry Andric
917e8d8bef9SDimitry Andric // Did the entry already exist for this block?
9180b57cec5SDimitry Andric if (!IV.second) {
919e8d8bef9SDimitry Andric if (State == AvailabilityState::Unavailable) {
920e8d8bef9SDimitry Andric UnavailableBB = CurrBB;
921e8d8bef9SDimitry Andric break; // Backpropagate unavailability info.
9220b57cec5SDimitry Andric }
9230b57cec5SDimitry Andric
924e8d8bef9SDimitry Andric #ifndef NDEBUG
925e8d8bef9SDimitry Andric AvailableBBs.emplace_back(CurrBB);
926e8d8bef9SDimitry Andric #endif
927e8d8bef9SDimitry Andric continue; // Don't recurse further, but continue processing worklist.
9280b57cec5SDimitry Andric }
9290b57cec5SDimitry Andric
930e8d8bef9SDimitry Andric // No entry found for block.
931e8d8bef9SDimitry Andric ++NumNewNewSpeculativelyAvailableBBs;
932e8d8bef9SDimitry Andric bool OutOfBudget = NumNewNewSpeculativelyAvailableBBs > MaxBBSpeculations;
9330b57cec5SDimitry Andric
934e8d8bef9SDimitry Andric // If we have exhausted our budget, mark this block as unavailable.
935e8d8bef9SDimitry Andric // Also, if this block has no predecessors, the value isn't live-in here.
936e8d8bef9SDimitry Andric if (OutOfBudget || pred_empty(CurrBB)) {
937e8d8bef9SDimitry Andric MaxBBSpeculationCutoffReachedTimes += (int)OutOfBudget;
938e8d8bef9SDimitry Andric State = AvailabilityState::Unavailable;
939e8d8bef9SDimitry Andric UnavailableBB = CurrBB;
940e8d8bef9SDimitry Andric break; // Backpropagate unavailability info.
941e8d8bef9SDimitry Andric }
9420b57cec5SDimitry Andric
943e8d8bef9SDimitry Andric // Tentatively consider this block as speculatively available.
944e8d8bef9SDimitry Andric #ifndef NDEBUG
945e8d8bef9SDimitry Andric NewSpeculativelyAvailableBBs.insert(CurrBB);
946e8d8bef9SDimitry Andric #endif
947e8d8bef9SDimitry Andric // And further recurse into block's predecessors, in depth-first order!
948e8d8bef9SDimitry Andric Worklist.append(pred_begin(CurrBB), pred_end(CurrBB));
949e8d8bef9SDimitry Andric }
9500b57cec5SDimitry Andric
951e8d8bef9SDimitry Andric #if LLVM_ENABLE_STATS
952e8d8bef9SDimitry Andric IsValueFullyAvailableInBlockNumSpeculationsMax.updateMax(
953e8d8bef9SDimitry Andric NumNewNewSpeculativelyAvailableBBs);
954e8d8bef9SDimitry Andric #endif
9550b57cec5SDimitry Andric
956e8d8bef9SDimitry Andric // If the block isn't marked as fixpoint yet
957e8d8bef9SDimitry Andric // (the Unavailable and Available states are fixpoints)
958e8d8bef9SDimitry Andric auto MarkAsFixpointAndEnqueueSuccessors =
959e8d8bef9SDimitry Andric [&](BasicBlock *BB, AvailabilityState FixpointState) {
960e8d8bef9SDimitry Andric auto It = FullyAvailableBlocks.find(BB);
961e8d8bef9SDimitry Andric if (It == FullyAvailableBlocks.end())
962e8d8bef9SDimitry Andric return; // Never queried this block, leave as-is.
963e8d8bef9SDimitry Andric switch (AvailabilityState &State = It->second) {
964e8d8bef9SDimitry Andric case AvailabilityState::Unavailable:
965e8d8bef9SDimitry Andric case AvailabilityState::Available:
966e8d8bef9SDimitry Andric return; // Don't backpropagate further, continue processing worklist.
967e8d8bef9SDimitry Andric case AvailabilityState::SpeculativelyAvailable: // Fix it!
968e8d8bef9SDimitry Andric State = FixpointState;
969e8d8bef9SDimitry Andric #ifndef NDEBUG
970e8d8bef9SDimitry Andric assert(NewSpeculativelyAvailableBBs.erase(BB) &&
971e8d8bef9SDimitry Andric "Found a speculatively available successor leftover?");
972e8d8bef9SDimitry Andric #endif
973e8d8bef9SDimitry Andric // Queue successors for further processing.
974e8d8bef9SDimitry Andric Worklist.append(succ_begin(BB), succ_end(BB));
975e8d8bef9SDimitry Andric return;
976e8d8bef9SDimitry Andric }
977e8d8bef9SDimitry Andric };
978e8d8bef9SDimitry Andric
979e8d8bef9SDimitry Andric if (UnavailableBB) {
980e8d8bef9SDimitry Andric // Okay, we have encountered an unavailable block.
981e8d8bef9SDimitry Andric // Mark speculatively available blocks reachable from UnavailableBB as
982e8d8bef9SDimitry Andric // unavailable as well. Paths are terminated when they reach blocks not in
983e8d8bef9SDimitry Andric // FullyAvailableBlocks or they are not marked as speculatively available.
984e8d8bef9SDimitry Andric Worklist.clear();
985e8d8bef9SDimitry Andric Worklist.append(succ_begin(*UnavailableBB), succ_end(*UnavailableBB));
986e8d8bef9SDimitry Andric while (!Worklist.empty())
987e8d8bef9SDimitry Andric MarkAsFixpointAndEnqueueSuccessors(Worklist.pop_back_val(),
988e8d8bef9SDimitry Andric AvailabilityState::Unavailable);
989e8d8bef9SDimitry Andric }
990e8d8bef9SDimitry Andric
991e8d8bef9SDimitry Andric #ifndef NDEBUG
992e8d8bef9SDimitry Andric Worklist.clear();
993e8d8bef9SDimitry Andric for (BasicBlock *AvailableBB : AvailableBBs)
994e8d8bef9SDimitry Andric Worklist.append(succ_begin(AvailableBB), succ_end(AvailableBB));
995e8d8bef9SDimitry Andric while (!Worklist.empty())
996e8d8bef9SDimitry Andric MarkAsFixpointAndEnqueueSuccessors(Worklist.pop_back_val(),
997e8d8bef9SDimitry Andric AvailabilityState::Available);
998e8d8bef9SDimitry Andric
999e8d8bef9SDimitry Andric assert(NewSpeculativelyAvailableBBs.empty() &&
1000e8d8bef9SDimitry Andric "Must have fixed all the new speculatively available blocks.");
1001e8d8bef9SDimitry Andric #endif
1002e8d8bef9SDimitry Andric
1003e8d8bef9SDimitry Andric return !UnavailableBB;
10040b57cec5SDimitry Andric }
10050b57cec5SDimitry Andric
100606c3fb27SDimitry Andric /// If the specified OldValue exists in ValuesPerBlock, replace its value with
100706c3fb27SDimitry Andric /// NewValue.
replaceValuesPerBlockEntry(SmallVectorImpl<AvailableValueInBlock> & ValuesPerBlock,Value * OldValue,Value * NewValue)100806c3fb27SDimitry Andric static void replaceValuesPerBlockEntry(
100906c3fb27SDimitry Andric SmallVectorImpl<AvailableValueInBlock> &ValuesPerBlock, Value *OldValue,
101006c3fb27SDimitry Andric Value *NewValue) {
101106c3fb27SDimitry Andric for (AvailableValueInBlock &V : ValuesPerBlock) {
1012b121cb00SDimitry Andric if (V.AV.Val == OldValue)
1013b121cb00SDimitry Andric V.AV.Val = NewValue;
1014b121cb00SDimitry Andric if (V.AV.isSelectValue()) {
1015b121cb00SDimitry Andric if (V.AV.V1 == OldValue)
1016b121cb00SDimitry Andric V.AV.V1 = NewValue;
1017b121cb00SDimitry Andric if (V.AV.V2 == OldValue)
1018b121cb00SDimitry Andric V.AV.V2 = NewValue;
1019b121cb00SDimitry Andric }
102006c3fb27SDimitry Andric }
102106c3fb27SDimitry Andric }
102206c3fb27SDimitry Andric
10230b57cec5SDimitry Andric /// Given a set of loads specified by ValuesPerBlock,
1024fe6060f1SDimitry Andric /// construct SSA form, allowing us to eliminate Load. This returns the value
1025fe6060f1SDimitry Andric /// that should be used at Load's definition site.
1026fe6060f1SDimitry Andric static Value *
ConstructSSAForLoadSet(LoadInst * Load,SmallVectorImpl<AvailableValueInBlock> & ValuesPerBlock,GVNPass & gvn)1027fe6060f1SDimitry Andric ConstructSSAForLoadSet(LoadInst *Load,
10280b57cec5SDimitry Andric SmallVectorImpl<AvailableValueInBlock> &ValuesPerBlock,
1029349cc55cSDimitry Andric GVNPass &gvn) {
10300b57cec5SDimitry Andric // Check for the fully redundant, dominating load case. In this case, we can
10310b57cec5SDimitry Andric // just use the dominating value directly.
10320b57cec5SDimitry Andric if (ValuesPerBlock.size() == 1 &&
10330b57cec5SDimitry Andric gvn.getDominatorTree().properlyDominates(ValuesPerBlock[0].BB,
1034fe6060f1SDimitry Andric Load->getParent())) {
10350b57cec5SDimitry Andric assert(!ValuesPerBlock[0].AV.isUndefValue() &&
10360b57cec5SDimitry Andric "Dead BB dominate this block");
1037fe6060f1SDimitry Andric return ValuesPerBlock[0].MaterializeAdjustedValue(Load, gvn);
10380b57cec5SDimitry Andric }
10390b57cec5SDimitry Andric
10400b57cec5SDimitry Andric // Otherwise, we have to construct SSA form.
10410b57cec5SDimitry Andric SmallVector<PHINode*, 8> NewPHIs;
10420b57cec5SDimitry Andric SSAUpdater SSAUpdate(&NewPHIs);
1043fe6060f1SDimitry Andric SSAUpdate.Initialize(Load->getType(), Load->getName());
10440b57cec5SDimitry Andric
10450b57cec5SDimitry Andric for (const AvailableValueInBlock &AV : ValuesPerBlock) {
10460b57cec5SDimitry Andric BasicBlock *BB = AV.BB;
10470b57cec5SDimitry Andric
1048fe6060f1SDimitry Andric if (AV.AV.isUndefValue())
1049fe6060f1SDimitry Andric continue;
1050fe6060f1SDimitry Andric
10510b57cec5SDimitry Andric if (SSAUpdate.HasValueForBlock(BB))
10520b57cec5SDimitry Andric continue;
10530b57cec5SDimitry Andric
10540b57cec5SDimitry Andric // If the value is the load that we will be eliminating, and the block it's
10550b57cec5SDimitry Andric // available in is the block that the load is in, then don't add it as
10560b57cec5SDimitry Andric // SSAUpdater will resolve the value to the relevant phi which may let it
10570b57cec5SDimitry Andric // avoid phi construction entirely if there's actually only one value.
1058fe6060f1SDimitry Andric if (BB == Load->getParent() &&
1059fe6060f1SDimitry Andric ((AV.AV.isSimpleValue() && AV.AV.getSimpleValue() == Load) ||
1060fe6060f1SDimitry Andric (AV.AV.isCoercedLoadValue() && AV.AV.getCoercedLoadValue() == Load)))
10610b57cec5SDimitry Andric continue;
10620b57cec5SDimitry Andric
1063fe6060f1SDimitry Andric SSAUpdate.AddAvailableValue(BB, AV.MaterializeAdjustedValue(Load, gvn));
10640b57cec5SDimitry Andric }
10650b57cec5SDimitry Andric
10660b57cec5SDimitry Andric // Perform PHI construction.
1067fe6060f1SDimitry Andric return SSAUpdate.GetValueInMiddleOfBlock(Load->getParent());
10680b57cec5SDimitry Andric }
10690b57cec5SDimitry Andric
MaterializeAdjustedValue(LoadInst * Load,Instruction * InsertPt,GVNPass & gvn) const1070fe6060f1SDimitry Andric Value *AvailableValue::MaterializeAdjustedValue(LoadInst *Load,
10710b57cec5SDimitry Andric Instruction *InsertPt,
1072349cc55cSDimitry Andric GVNPass &gvn) const {
10730b57cec5SDimitry Andric Value *Res;
1074fe6060f1SDimitry Andric Type *LoadTy = Load->getType();
1075*0fca6ea1SDimitry Andric const DataLayout &DL = Load->getDataLayout();
10760b57cec5SDimitry Andric if (isSimpleValue()) {
10770b57cec5SDimitry Andric Res = getSimpleValue();
10780b57cec5SDimitry Andric if (Res->getType() != LoadTy) {
107906c3fb27SDimitry Andric Res = getValueForLoad(Res, Offset, LoadTy, InsertPt, DL);
10800b57cec5SDimitry Andric
10810b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL VAL:\nOffset: " << Offset
10820b57cec5SDimitry Andric << " " << *getSimpleValue() << '\n'
10830b57cec5SDimitry Andric << *Res << '\n'
10840b57cec5SDimitry Andric << "\n\n\n");
10850b57cec5SDimitry Andric }
10860b57cec5SDimitry Andric } else if (isCoercedLoadValue()) {
1087fe6060f1SDimitry Andric LoadInst *CoercedLoad = getCoercedLoadValue();
1088fe6060f1SDimitry Andric if (CoercedLoad->getType() == LoadTy && Offset == 0) {
1089fe6060f1SDimitry Andric Res = CoercedLoad;
109006c3fb27SDimitry Andric combineMetadataForCSE(CoercedLoad, Load, false);
10910b57cec5SDimitry Andric } else {
109206c3fb27SDimitry Andric Res = getValueForLoad(CoercedLoad, Offset, LoadTy, InsertPt, DL);
109306c3fb27SDimitry Andric // We are adding a new user for this load, for which the original
109406c3fb27SDimitry Andric // metadata may not hold. Additionally, the new load may have a different
109506c3fb27SDimitry Andric // size and type, so their metadata cannot be combined in any
109606c3fb27SDimitry Andric // straightforward way.
109706c3fb27SDimitry Andric // Drop all metadata that is not known to cause immediate UB on violation,
109806c3fb27SDimitry Andric // unless the load has !noundef, in which case all metadata violations
109906c3fb27SDimitry Andric // will be promoted to UB.
110006c3fb27SDimitry Andric // TODO: We can combine noalias/alias.scope metadata here, because it is
110106c3fb27SDimitry Andric // independent of the load type.
110206c3fb27SDimitry Andric if (!CoercedLoad->hasMetadata(LLVMContext::MD_noundef))
110306c3fb27SDimitry Andric CoercedLoad->dropUnknownNonDebugMetadata(
110406c3fb27SDimitry Andric {LLVMContext::MD_dereferenceable,
110506c3fb27SDimitry Andric LLVMContext::MD_dereferenceable_or_null,
110606c3fb27SDimitry Andric LLVMContext::MD_invariant_load, LLVMContext::MD_invariant_group});
11070b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL LOAD:\nOffset: " << Offset
11080b57cec5SDimitry Andric << " " << *getCoercedLoadValue() << '\n'
11090b57cec5SDimitry Andric << *Res << '\n'
11100b57cec5SDimitry Andric << "\n\n\n");
11110b57cec5SDimitry Andric }
11120b57cec5SDimitry Andric } else if (isMemIntrinValue()) {
11130b57cec5SDimitry Andric Res = getMemInstValueForLoad(getMemIntrinValue(), Offset, LoadTy,
11140b57cec5SDimitry Andric InsertPt, DL);
11150b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL MEM INTRIN:\nOffset: " << Offset
11160b57cec5SDimitry Andric << " " << *getMemIntrinValue() << '\n'
11170b57cec5SDimitry Andric << *Res << '\n'
11180b57cec5SDimitry Andric << "\n\n\n");
111981ad6265SDimitry Andric } else if (isSelectValue()) {
112081ad6265SDimitry Andric // Introduce a new value select for a load from an eligible pointer select.
112181ad6265SDimitry Andric SelectInst *Sel = getSelectValue();
1122bdd1243dSDimitry Andric assert(V1 && V2 && "both value operands of the select must be present");
1123*0fca6ea1SDimitry Andric Res =
1124*0fca6ea1SDimitry Andric SelectInst::Create(Sel->getCondition(), V1, V2, "", Sel->getIterator());
11250b57cec5SDimitry Andric } else {
1126fe6060f1SDimitry Andric llvm_unreachable("Should not materialize value from dead block");
11270b57cec5SDimitry Andric }
11280b57cec5SDimitry Andric assert(Res && "failed to materialize?");
11290b57cec5SDimitry Andric return Res;
11300b57cec5SDimitry Andric }
11310b57cec5SDimitry Andric
isLifetimeStart(const Instruction * Inst)11320b57cec5SDimitry Andric static bool isLifetimeStart(const Instruction *Inst) {
11330b57cec5SDimitry Andric if (const IntrinsicInst* II = dyn_cast<IntrinsicInst>(Inst))
11340b57cec5SDimitry Andric return II->getIntrinsicID() == Intrinsic::lifetime_start;
11350b57cec5SDimitry Andric return false;
11360b57cec5SDimitry Andric }
11370b57cec5SDimitry Andric
1138fe6060f1SDimitry Andric /// Assuming To can be reached from both From and Between, does Between lie on
1139fe6060f1SDimitry Andric /// every path from From to To?
liesBetween(const Instruction * From,Instruction * Between,const Instruction * To,DominatorTree * DT)1140fe6060f1SDimitry Andric static bool liesBetween(const Instruction *From, Instruction *Between,
1141fe6060f1SDimitry Andric const Instruction *To, DominatorTree *DT) {
1142fe6060f1SDimitry Andric if (From->getParent() == Between->getParent())
1143fe6060f1SDimitry Andric return DT->dominates(From, Between);
1144fe6060f1SDimitry Andric SmallSet<BasicBlock *, 1> Exclusion;
1145fe6060f1SDimitry Andric Exclusion.insert(Between->getParent());
1146fe6060f1SDimitry Andric return !isPotentiallyReachable(From, To, &Exclusion, DT);
1147fe6060f1SDimitry Andric }
1148fe6060f1SDimitry Andric
11490b57cec5SDimitry Andric /// Try to locate the three instruction involved in a missed
11500b57cec5SDimitry Andric /// load-elimination case that is due to an intervening store.
reportMayClobberedLoad(LoadInst * Load,MemDepResult DepInfo,DominatorTree * DT,OptimizationRemarkEmitter * ORE)1151fe6060f1SDimitry Andric static void reportMayClobberedLoad(LoadInst *Load, MemDepResult DepInfo,
11520b57cec5SDimitry Andric DominatorTree *DT,
11530b57cec5SDimitry Andric OptimizationRemarkEmitter *ORE) {
11540b57cec5SDimitry Andric using namespace ore;
11550b57cec5SDimitry Andric
1156bdd1243dSDimitry Andric Instruction *OtherAccess = nullptr;
11570b57cec5SDimitry Andric
1158fe6060f1SDimitry Andric OptimizationRemarkMissed R(DEBUG_TYPE, "LoadClobbered", Load);
1159fe6060f1SDimitry Andric R << "load of type " << NV("Type", Load->getType()) << " not eliminated"
11600b57cec5SDimitry Andric << setExtraArgs();
11610b57cec5SDimitry Andric
1162fe6060f1SDimitry Andric for (auto *U : Load->getPointerOperand()->users()) {
1163bdd1243dSDimitry Andric if (U != Load && (isa<LoadInst>(U) || isa<StoreInst>(U))) {
1164bdd1243dSDimitry Andric auto *I = cast<Instruction>(U);
1165bdd1243dSDimitry Andric if (I->getFunction() == Load->getFunction() && DT->dominates(I, Load)) {
1166fe6060f1SDimitry Andric // Use the most immediately dominating value
1167fe6060f1SDimitry Andric if (OtherAccess) {
1168bdd1243dSDimitry Andric if (DT->dominates(OtherAccess, I))
1169bdd1243dSDimitry Andric OtherAccess = I;
1170fe6060f1SDimitry Andric else
1171bdd1243dSDimitry Andric assert(U == OtherAccess || DT->dominates(I, OtherAccess));
1172fe6060f1SDimitry Andric } else
1173bdd1243dSDimitry Andric OtherAccess = I;
1174bdd1243dSDimitry Andric }
1175fe6060f1SDimitry Andric }
1176fe6060f1SDimitry Andric }
1177fe6060f1SDimitry Andric
1178fe6060f1SDimitry Andric if (!OtherAccess) {
1179fe6060f1SDimitry Andric // There is no dominating use, check if we can find a closest non-dominating
1180fe6060f1SDimitry Andric // use that lies between any other potentially available use and Load.
1181fe6060f1SDimitry Andric for (auto *U : Load->getPointerOperand()->users()) {
1182bdd1243dSDimitry Andric if (U != Load && (isa<LoadInst>(U) || isa<StoreInst>(U))) {
1183bdd1243dSDimitry Andric auto *I = cast<Instruction>(U);
1184bdd1243dSDimitry Andric if (I->getFunction() == Load->getFunction() &&
1185bdd1243dSDimitry Andric isPotentiallyReachable(I, Load, nullptr, DT)) {
1186fe6060f1SDimitry Andric if (OtherAccess) {
1187bdd1243dSDimitry Andric if (liesBetween(OtherAccess, I, Load, DT)) {
1188bdd1243dSDimitry Andric OtherAccess = I;
1189bdd1243dSDimitry Andric } else if (!liesBetween(I, OtherAccess, Load, DT)) {
1190fe6060f1SDimitry Andric // These uses are both partially available at Load were it not for
1191fe6060f1SDimitry Andric // the clobber, but neither lies strictly after the other.
1192fe6060f1SDimitry Andric OtherAccess = nullptr;
1193fe6060f1SDimitry Andric break;
1194fe6060f1SDimitry Andric } // else: keep current OtherAccess since it lies between U and Load
1195fe6060f1SDimitry Andric } else {
1196bdd1243dSDimitry Andric OtherAccess = I;
1197bdd1243dSDimitry Andric }
1198fe6060f1SDimitry Andric }
1199fe6060f1SDimitry Andric }
1200fe6060f1SDimitry Andric }
12010b57cec5SDimitry Andric }
12020b57cec5SDimitry Andric
12030b57cec5SDimitry Andric if (OtherAccess)
12040b57cec5SDimitry Andric R << " in favor of " << NV("OtherAccess", OtherAccess);
12050b57cec5SDimitry Andric
12060b57cec5SDimitry Andric R << " because it is clobbered by " << NV("ClobberedBy", DepInfo.getInst());
12070b57cec5SDimitry Andric
12080b57cec5SDimitry Andric ORE->emit(R);
12090b57cec5SDimitry Andric }
12100b57cec5SDimitry Andric
1211bdd1243dSDimitry Andric // Find non-clobbered value for Loc memory location in extended basic block
1212bdd1243dSDimitry Andric // (chain of basic blocks with single predecessors) starting From instruction.
findDominatingValue(const MemoryLocation & Loc,Type * LoadTy,Instruction * From,AAResults * AA)1213bdd1243dSDimitry Andric static Value *findDominatingValue(const MemoryLocation &Loc, Type *LoadTy,
1214bdd1243dSDimitry Andric Instruction *From, AAResults *AA) {
1215bdd1243dSDimitry Andric uint32_t NumVisitedInsts = 0;
1216bdd1243dSDimitry Andric BasicBlock *FromBB = From->getParent();
1217bdd1243dSDimitry Andric BatchAAResults BatchAA(*AA);
1218bdd1243dSDimitry Andric for (BasicBlock *BB = FromBB; BB; BB = BB->getSinglePredecessor())
12195f757f3fSDimitry Andric for (auto *Inst = BB == FromBB ? From : BB->getTerminator();
12205f757f3fSDimitry Andric Inst != nullptr; Inst = Inst->getPrevNonDebugInstruction()) {
1221bdd1243dSDimitry Andric // Stop the search if limit is reached.
1222bdd1243dSDimitry Andric if (++NumVisitedInsts > MaxNumVisitedInsts)
1223bdd1243dSDimitry Andric return nullptr;
1224bdd1243dSDimitry Andric if (isModSet(BatchAA.getModRefInfo(Inst, Loc)))
1225bdd1243dSDimitry Andric return nullptr;
1226bdd1243dSDimitry Andric if (auto *LI = dyn_cast<LoadInst>(Inst))
1227bdd1243dSDimitry Andric if (LI->getPointerOperand() == Loc.Ptr && LI->getType() == LoadTy)
1228bdd1243dSDimitry Andric return LI;
1229bdd1243dSDimitry Andric }
1230bdd1243dSDimitry Andric return nullptr;
123181ad6265SDimitry Andric }
123281ad6265SDimitry Andric
1233bdd1243dSDimitry Andric std::optional<AvailableValue>
AnalyzeLoadAvailability(LoadInst * Load,MemDepResult DepInfo,Value * Address)1234bdd1243dSDimitry Andric GVNPass::AnalyzeLoadAvailability(LoadInst *Load, MemDepResult DepInfo,
1235bdd1243dSDimitry Andric Value *Address) {
1236fe6060f1SDimitry Andric assert(Load->isUnordered() && "rules below are incorrect for ordered access");
1237bdd1243dSDimitry Andric assert(DepInfo.isLocal() && "expected a local dependence");
12380b57cec5SDimitry Andric
12390b57cec5SDimitry Andric Instruction *DepInst = DepInfo.getInst();
1240bdd1243dSDimitry Andric
1241*0fca6ea1SDimitry Andric const DataLayout &DL = Load->getDataLayout();
12420b57cec5SDimitry Andric if (DepInfo.isClobber()) {
12430b57cec5SDimitry Andric // If the dependence is to a store that writes to a superset of the bits
12440b57cec5SDimitry Andric // read by the load, we can extract the bits we need for the load from the
12450b57cec5SDimitry Andric // stored value.
12460b57cec5SDimitry Andric if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
12470b57cec5SDimitry Andric // Can't forward from non-atomic to atomic without violating memory model.
1248fe6060f1SDimitry Andric if (Address && Load->isAtomic() <= DepSI->isAtomic()) {
12490b57cec5SDimitry Andric int Offset =
1250fe6060f1SDimitry Andric analyzeLoadFromClobberingStore(Load->getType(), Address, DepSI, DL);
1251bdd1243dSDimitry Andric if (Offset != -1)
1252bdd1243dSDimitry Andric return AvailableValue::get(DepSI->getValueOperand(), Offset);
12530b57cec5SDimitry Andric }
12540b57cec5SDimitry Andric }
12550b57cec5SDimitry Andric
12560b57cec5SDimitry Andric // Check to see if we have something like this:
12570b57cec5SDimitry Andric // load i32* P
12580b57cec5SDimitry Andric // load i8* (P+1)
12590b57cec5SDimitry Andric // if we have this, replace the later with an extraction from the former.
1260fe6060f1SDimitry Andric if (LoadInst *DepLoad = dyn_cast<LoadInst>(DepInst)) {
12610b57cec5SDimitry Andric // If this is a clobber and L is the first instruction in its block, then
12620b57cec5SDimitry Andric // we have the first instruction in the entry block.
12630b57cec5SDimitry Andric // Can't forward from non-atomic to atomic without violating memory model.
1264fe6060f1SDimitry Andric if (DepLoad != Load && Address &&
1265fe6060f1SDimitry Andric Load->isAtomic() <= DepLoad->isAtomic()) {
1266fe6060f1SDimitry Andric Type *LoadType = Load->getType();
1267fe6060f1SDimitry Andric int Offset = -1;
12680b57cec5SDimitry Andric
1269fe6060f1SDimitry Andric // If MD reported clobber, check it was nested.
1270fe6060f1SDimitry Andric if (DepInfo.isClobber() &&
1271fe6060f1SDimitry Andric canCoerceMustAliasedValueToLoad(DepLoad, LoadType, DL)) {
1272fe6060f1SDimitry Andric const auto ClobberOff = MD->getClobberOffset(DepLoad);
1273fe6060f1SDimitry Andric // GVN has no deal with a negative offset.
1274bdd1243dSDimitry Andric Offset = (ClobberOff == std::nullopt || *ClobberOff < 0)
1275bdd1243dSDimitry Andric ? -1
1276bdd1243dSDimitry Andric : *ClobberOff;
1277fe6060f1SDimitry Andric }
1278fe6060f1SDimitry Andric if (Offset == -1)
1279fe6060f1SDimitry Andric Offset =
1280fe6060f1SDimitry Andric analyzeLoadFromClobberingLoad(LoadType, Address, DepLoad, DL);
1281bdd1243dSDimitry Andric if (Offset != -1)
1282bdd1243dSDimitry Andric return AvailableValue::getLoad(DepLoad, Offset);
12830b57cec5SDimitry Andric }
12840b57cec5SDimitry Andric }
12850b57cec5SDimitry Andric
12860b57cec5SDimitry Andric // If the clobbering value is a memset/memcpy/memmove, see if we can
12870b57cec5SDimitry Andric // forward a value on from it.
12880b57cec5SDimitry Andric if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(DepInst)) {
1289fe6060f1SDimitry Andric if (Address && !Load->isAtomic()) {
1290fe6060f1SDimitry Andric int Offset = analyzeLoadFromClobberingMemInst(Load->getType(), Address,
12910b57cec5SDimitry Andric DepMI, DL);
1292bdd1243dSDimitry Andric if (Offset != -1)
1293bdd1243dSDimitry Andric return AvailableValue::getMI(DepMI, Offset);
12940b57cec5SDimitry Andric }
12950b57cec5SDimitry Andric }
129681ad6265SDimitry Andric
12970b57cec5SDimitry Andric // Nothing known about this clobber, have to be conservative
12980b57cec5SDimitry Andric LLVM_DEBUG(
12990b57cec5SDimitry Andric // fast print dep, using operator<< on instruction is too slow.
1300fe6060f1SDimitry Andric dbgs() << "GVN: load "; Load->printAsOperand(dbgs());
13010b57cec5SDimitry Andric dbgs() << " is clobbered by " << *DepInst << '\n';);
13020b57cec5SDimitry Andric if (ORE->allowExtraAnalysis(DEBUG_TYPE))
1303fe6060f1SDimitry Andric reportMayClobberedLoad(Load, DepInfo, DT, ORE);
13040b57cec5SDimitry Andric
1305bdd1243dSDimitry Andric return std::nullopt;
13060b57cec5SDimitry Andric }
13070b57cec5SDimitry Andric assert(DepInfo.isDef() && "follows from above");
13080b57cec5SDimitry Andric
130904eeddc0SDimitry Andric // Loading the alloca -> undef.
13100b57cec5SDimitry Andric // Loading immediately after lifetime begin -> undef.
1311bdd1243dSDimitry Andric if (isa<AllocaInst>(DepInst) || isLifetimeStart(DepInst))
1312bdd1243dSDimitry Andric return AvailableValue::get(UndefValue::get(Load->getType()));
13130b57cec5SDimitry Andric
131481ad6265SDimitry Andric if (Constant *InitVal =
1315bdd1243dSDimitry Andric getInitialValueOfAllocation(DepInst, TLI, Load->getType()))
1316bdd1243dSDimitry Andric return AvailableValue::get(InitVal);
13170b57cec5SDimitry Andric
13180b57cec5SDimitry Andric if (StoreInst *S = dyn_cast<StoreInst>(DepInst)) {
13190b57cec5SDimitry Andric // Reject loads and stores that are to the same address but are of
1320e8d8bef9SDimitry Andric // different types if we have to. If the stored value is convertable to
13210b57cec5SDimitry Andric // the loaded value, we can reuse it.
1322fe6060f1SDimitry Andric if (!canCoerceMustAliasedValueToLoad(S->getValueOperand(), Load->getType(),
13230b57cec5SDimitry Andric DL))
1324bdd1243dSDimitry Andric return std::nullopt;
13250b57cec5SDimitry Andric
13260b57cec5SDimitry Andric // Can't forward from non-atomic to atomic without violating memory model.
1327fe6060f1SDimitry Andric if (S->isAtomic() < Load->isAtomic())
1328bdd1243dSDimitry Andric return std::nullopt;
13290b57cec5SDimitry Andric
1330bdd1243dSDimitry Andric return AvailableValue::get(S->getValueOperand());
13310b57cec5SDimitry Andric }
13320b57cec5SDimitry Andric
13330b57cec5SDimitry Andric if (LoadInst *LD = dyn_cast<LoadInst>(DepInst)) {
13340b57cec5SDimitry Andric // If the types mismatch and we can't handle it, reject reuse of the load.
13350b57cec5SDimitry Andric // If the stored value is larger or equal to the loaded value, we can reuse
13360b57cec5SDimitry Andric // it.
1337fe6060f1SDimitry Andric if (!canCoerceMustAliasedValueToLoad(LD, Load->getType(), DL))
1338bdd1243dSDimitry Andric return std::nullopt;
13390b57cec5SDimitry Andric
13400b57cec5SDimitry Andric // Can't forward from non-atomic to atomic without violating memory model.
1341fe6060f1SDimitry Andric if (LD->isAtomic() < Load->isAtomic())
1342bdd1243dSDimitry Andric return std::nullopt;
13430b57cec5SDimitry Andric
1344bdd1243dSDimitry Andric return AvailableValue::getLoad(LD);
1345bdd1243dSDimitry Andric }
1346bdd1243dSDimitry Andric
1347bdd1243dSDimitry Andric // Check if load with Addr dependent from select can be converted to select
1348bdd1243dSDimitry Andric // between load values. There must be no instructions between the found
1349bdd1243dSDimitry Andric // loads and DepInst that may clobber the loads.
1350bdd1243dSDimitry Andric if (auto *Sel = dyn_cast<SelectInst>(DepInst)) {
1351bdd1243dSDimitry Andric assert(Sel->getType() == Load->getPointerOperandType());
1352bdd1243dSDimitry Andric auto Loc = MemoryLocation::get(Load);
1353bdd1243dSDimitry Andric Value *V1 =
1354bdd1243dSDimitry Andric findDominatingValue(Loc.getWithNewPtr(Sel->getTrueValue()),
1355bdd1243dSDimitry Andric Load->getType(), DepInst, getAliasAnalysis());
1356bdd1243dSDimitry Andric if (!V1)
1357bdd1243dSDimitry Andric return std::nullopt;
1358bdd1243dSDimitry Andric Value *V2 =
1359bdd1243dSDimitry Andric findDominatingValue(Loc.getWithNewPtr(Sel->getFalseValue()),
1360bdd1243dSDimitry Andric Load->getType(), DepInst, getAliasAnalysis());
1361bdd1243dSDimitry Andric if (!V2)
1362bdd1243dSDimitry Andric return std::nullopt;
1363bdd1243dSDimitry Andric return AvailableValue::getSelect(Sel, V1, V2);
13640b57cec5SDimitry Andric }
13650b57cec5SDimitry Andric
13660b57cec5SDimitry Andric // Unknown def - must be conservative
13670b57cec5SDimitry Andric LLVM_DEBUG(
13680b57cec5SDimitry Andric // fast print dep, using operator<< on instruction is too slow.
1369fe6060f1SDimitry Andric dbgs() << "GVN: load "; Load->printAsOperand(dbgs());
13700b57cec5SDimitry Andric dbgs() << " has unknown def " << *DepInst << '\n';);
1371bdd1243dSDimitry Andric return std::nullopt;
13720b57cec5SDimitry Andric }
13730b57cec5SDimitry Andric
AnalyzeLoadAvailability(LoadInst * Load,LoadDepVect & Deps,AvailValInBlkVect & ValuesPerBlock,UnavailBlkVect & UnavailableBlocks)1374349cc55cSDimitry Andric void GVNPass::AnalyzeLoadAvailability(LoadInst *Load, LoadDepVect &Deps,
13750b57cec5SDimitry Andric AvailValInBlkVect &ValuesPerBlock,
13760b57cec5SDimitry Andric UnavailBlkVect &UnavailableBlocks) {
13770b57cec5SDimitry Andric // Filter out useless results (non-locals, etc). Keep track of the blocks
13780b57cec5SDimitry Andric // where we have a value available in repl, also keep track of whether we see
13790b57cec5SDimitry Andric // dependencies that produce an unknown value for the load (such as a call
13800b57cec5SDimitry Andric // that could potentially clobber the load).
1381bdd1243dSDimitry Andric for (const auto &Dep : Deps) {
1382bdd1243dSDimitry Andric BasicBlock *DepBB = Dep.getBB();
1383bdd1243dSDimitry Andric MemDepResult DepInfo = Dep.getResult();
13840b57cec5SDimitry Andric
13850b57cec5SDimitry Andric if (DeadBlocks.count(DepBB)) {
13860b57cec5SDimitry Andric // Dead dependent mem-op disguise as a load evaluating the same value
13870b57cec5SDimitry Andric // as the load in question.
13880b57cec5SDimitry Andric ValuesPerBlock.push_back(AvailableValueInBlock::getUndef(DepBB));
13890b57cec5SDimitry Andric continue;
13900b57cec5SDimitry Andric }
13910b57cec5SDimitry Andric
1392bdd1243dSDimitry Andric if (!DepInfo.isLocal()) {
139381ad6265SDimitry Andric UnavailableBlocks.push_back(DepBB);
139481ad6265SDimitry Andric continue;
139581ad6265SDimitry Andric }
139681ad6265SDimitry Andric
1397bdd1243dSDimitry Andric // The address being loaded in this non-local block may not be the same as
1398bdd1243dSDimitry Andric // the pointer operand of the load if PHI translation occurs. Make sure
1399bdd1243dSDimitry Andric // to consider the right address.
1400bdd1243dSDimitry Andric if (auto AV = AnalyzeLoadAvailability(Load, DepInfo, Dep.getAddress())) {
14010b57cec5SDimitry Andric // subtlety: because we know this was a non-local dependency, we know
14020b57cec5SDimitry Andric // it's safe to materialize anywhere between the instruction within
14030b57cec5SDimitry Andric // DepInfo and the end of it's block.
1404bdd1243dSDimitry Andric ValuesPerBlock.push_back(
1405bdd1243dSDimitry Andric AvailableValueInBlock::get(DepBB, std::move(*AV)));
14060b57cec5SDimitry Andric } else {
14070b57cec5SDimitry Andric UnavailableBlocks.push_back(DepBB);
14080b57cec5SDimitry Andric }
14090b57cec5SDimitry Andric }
14100b57cec5SDimitry Andric
1411bdd1243dSDimitry Andric assert(Deps.size() == ValuesPerBlock.size() + UnavailableBlocks.size() &&
14120b57cec5SDimitry Andric "post condition violation");
14130b57cec5SDimitry Andric }
14140b57cec5SDimitry Andric
141506c3fb27SDimitry Andric /// Given the following code, v1 is partially available on some edges, but not
141606c3fb27SDimitry Andric /// available on the edge from PredBB. This function tries to find if there is
141706c3fb27SDimitry Andric /// another identical load in the other successor of PredBB.
141806c3fb27SDimitry Andric ///
141906c3fb27SDimitry Andric /// v0 = load %addr
142006c3fb27SDimitry Andric /// br %LoadBB
142106c3fb27SDimitry Andric ///
142206c3fb27SDimitry Andric /// LoadBB:
142306c3fb27SDimitry Andric /// v1 = load %addr
142406c3fb27SDimitry Andric /// ...
142506c3fb27SDimitry Andric ///
142606c3fb27SDimitry Andric /// PredBB:
142706c3fb27SDimitry Andric /// ...
142806c3fb27SDimitry Andric /// br %cond, label %LoadBB, label %SuccBB
142906c3fb27SDimitry Andric ///
143006c3fb27SDimitry Andric /// SuccBB:
143106c3fb27SDimitry Andric /// v2 = load %addr
143206c3fb27SDimitry Andric /// ...
143306c3fb27SDimitry Andric ///
findLoadToHoistIntoPred(BasicBlock * Pred,BasicBlock * LoadBB,LoadInst * Load)143406c3fb27SDimitry Andric LoadInst *GVNPass::findLoadToHoistIntoPred(BasicBlock *Pred, BasicBlock *LoadBB,
143506c3fb27SDimitry Andric LoadInst *Load) {
143606c3fb27SDimitry Andric // For simplicity we handle a Pred has 2 successors only.
143706c3fb27SDimitry Andric auto *Term = Pred->getTerminator();
14385f757f3fSDimitry Andric if (Term->getNumSuccessors() != 2 || Term->isSpecialTerminator())
143906c3fb27SDimitry Andric return nullptr;
144006c3fb27SDimitry Andric auto *SuccBB = Term->getSuccessor(0);
144106c3fb27SDimitry Andric if (SuccBB == LoadBB)
144206c3fb27SDimitry Andric SuccBB = Term->getSuccessor(1);
144306c3fb27SDimitry Andric if (!SuccBB->getSinglePredecessor())
144406c3fb27SDimitry Andric return nullptr;
144506c3fb27SDimitry Andric
144606c3fb27SDimitry Andric unsigned int NumInsts = MaxNumInsnsPerBlock;
144706c3fb27SDimitry Andric for (Instruction &Inst : *SuccBB) {
144806c3fb27SDimitry Andric if (Inst.isDebugOrPseudoInst())
144906c3fb27SDimitry Andric continue;
145006c3fb27SDimitry Andric if (--NumInsts == 0)
145106c3fb27SDimitry Andric return nullptr;
145206c3fb27SDimitry Andric
145306c3fb27SDimitry Andric if (!Inst.isIdenticalTo(Load))
145406c3fb27SDimitry Andric continue;
145506c3fb27SDimitry Andric
145606c3fb27SDimitry Andric MemDepResult Dep = MD->getDependency(&Inst);
145706c3fb27SDimitry Andric // If an identical load doesn't depends on any local instructions, it can
145806c3fb27SDimitry Andric // be safely moved to PredBB.
145906c3fb27SDimitry Andric // Also check for the implicit control flow instructions. See the comments
146006c3fb27SDimitry Andric // in PerformLoadPRE for details.
146106c3fb27SDimitry Andric if (Dep.isNonLocal() && !ICF->isDominatedByICFIFromSameBlock(&Inst))
146206c3fb27SDimitry Andric return cast<LoadInst>(&Inst);
146306c3fb27SDimitry Andric
146406c3fb27SDimitry Andric // Otherwise there is something in the same BB clobbers the memory, we can't
146506c3fb27SDimitry Andric // move this and later load to PredBB.
146606c3fb27SDimitry Andric return nullptr;
146706c3fb27SDimitry Andric }
146806c3fb27SDimitry Andric
146906c3fb27SDimitry Andric return nullptr;
147006c3fb27SDimitry Andric }
147106c3fb27SDimitry Andric
eliminatePartiallyRedundantLoad(LoadInst * Load,AvailValInBlkVect & ValuesPerBlock,MapVector<BasicBlock *,Value * > & AvailableLoads,MapVector<BasicBlock *,LoadInst * > * CriticalEdgePredAndLoad)1472349cc55cSDimitry Andric void GVNPass::eliminatePartiallyRedundantLoad(
1473fe6060f1SDimitry Andric LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
147406c3fb27SDimitry Andric MapVector<BasicBlock *, Value *> &AvailableLoads,
147506c3fb27SDimitry Andric MapVector<BasicBlock *, LoadInst *> *CriticalEdgePredAndLoad) {
1476fe6060f1SDimitry Andric for (const auto &AvailableLoad : AvailableLoads) {
1477fe6060f1SDimitry Andric BasicBlock *UnavailableBlock = AvailableLoad.first;
1478fe6060f1SDimitry Andric Value *LoadPtr = AvailableLoad.second;
1479fe6060f1SDimitry Andric
1480*0fca6ea1SDimitry Andric auto *NewLoad = new LoadInst(
1481*0fca6ea1SDimitry Andric Load->getType(), LoadPtr, Load->getName() + ".pre", Load->isVolatile(),
1482*0fca6ea1SDimitry Andric Load->getAlign(), Load->getOrdering(), Load->getSyncScopeID(),
1483*0fca6ea1SDimitry Andric UnavailableBlock->getTerminator()->getIterator());
1484fe6060f1SDimitry Andric NewLoad->setDebugLoc(Load->getDebugLoc());
1485fe6060f1SDimitry Andric if (MSSAU) {
1486fe6060f1SDimitry Andric auto *NewAccess = MSSAU->createMemoryAccessInBB(
14875f757f3fSDimitry Andric NewLoad, nullptr, NewLoad->getParent(), MemorySSA::BeforeTerminator);
1488fe6060f1SDimitry Andric if (auto *NewDef = dyn_cast<MemoryDef>(NewAccess))
1489fe6060f1SDimitry Andric MSSAU->insertDef(NewDef, /*RenameUses=*/true);
1490fe6060f1SDimitry Andric else
1491fe6060f1SDimitry Andric MSSAU->insertUse(cast<MemoryUse>(NewAccess), /*RenameUses=*/true);
1492fe6060f1SDimitry Andric }
1493fe6060f1SDimitry Andric
1494fe6060f1SDimitry Andric // Transfer the old load's AA tags to the new load.
1495349cc55cSDimitry Andric AAMDNodes Tags = Load->getAAMetadata();
1496fe6060f1SDimitry Andric if (Tags)
1497fe6060f1SDimitry Andric NewLoad->setAAMetadata(Tags);
1498fe6060f1SDimitry Andric
1499fe6060f1SDimitry Andric if (auto *MD = Load->getMetadata(LLVMContext::MD_invariant_load))
1500fe6060f1SDimitry Andric NewLoad->setMetadata(LLVMContext::MD_invariant_load, MD);
1501fe6060f1SDimitry Andric if (auto *InvGroupMD = Load->getMetadata(LLVMContext::MD_invariant_group))
1502fe6060f1SDimitry Andric NewLoad->setMetadata(LLVMContext::MD_invariant_group, InvGroupMD);
1503fe6060f1SDimitry Andric if (auto *RangeMD = Load->getMetadata(LLVMContext::MD_range))
1504fe6060f1SDimitry Andric NewLoad->setMetadata(LLVMContext::MD_range, RangeMD);
1505fe6060f1SDimitry Andric if (auto *AccessMD = Load->getMetadata(LLVMContext::MD_access_group))
15065f757f3fSDimitry Andric if (LI->getLoopFor(Load->getParent()) == LI->getLoopFor(UnavailableBlock))
1507fe6060f1SDimitry Andric NewLoad->setMetadata(LLVMContext::MD_access_group, AccessMD);
1508fe6060f1SDimitry Andric
1509fe6060f1SDimitry Andric // We do not propagate the old load's debug location, because the new
1510fe6060f1SDimitry Andric // load now lives in a different BB, and we want to avoid a jumpy line
1511fe6060f1SDimitry Andric // table.
1512fe6060f1SDimitry Andric // FIXME: How do we retain source locations without causing poor debugging
1513fe6060f1SDimitry Andric // behavior?
1514fe6060f1SDimitry Andric
1515fe6060f1SDimitry Andric // Add the newly created load.
1516fe6060f1SDimitry Andric ValuesPerBlock.push_back(
1517fe6060f1SDimitry Andric AvailableValueInBlock::get(UnavailableBlock, NewLoad));
1518fe6060f1SDimitry Andric MD->invalidateCachedPointerInfo(LoadPtr);
1519fe6060f1SDimitry Andric LLVM_DEBUG(dbgs() << "GVN INSERTED " << *NewLoad << '\n');
152006c3fb27SDimitry Andric
152106c3fb27SDimitry Andric // For PredBB in CriticalEdgePredAndLoad we need to replace the uses of old
152206c3fb27SDimitry Andric // load instruction with the new created load instruction.
152306c3fb27SDimitry Andric if (CriticalEdgePredAndLoad) {
152406c3fb27SDimitry Andric auto I = CriticalEdgePredAndLoad->find(UnavailableBlock);
152506c3fb27SDimitry Andric if (I != CriticalEdgePredAndLoad->end()) {
152606c3fb27SDimitry Andric ++NumPRELoadMoved2CEPred;
152706c3fb27SDimitry Andric ICF->insertInstructionTo(NewLoad, UnavailableBlock);
152806c3fb27SDimitry Andric LoadInst *OldLoad = I->second;
152906c3fb27SDimitry Andric combineMetadataForCSE(NewLoad, OldLoad, false);
153006c3fb27SDimitry Andric OldLoad->replaceAllUsesWith(NewLoad);
153106c3fb27SDimitry Andric replaceValuesPerBlockEntry(ValuesPerBlock, OldLoad, NewLoad);
153206c3fb27SDimitry Andric if (uint32_t ValNo = VN.lookup(OldLoad, false))
1533*0fca6ea1SDimitry Andric LeaderTable.erase(ValNo, OldLoad, OldLoad->getParent());
153406c3fb27SDimitry Andric VN.erase(OldLoad);
153506c3fb27SDimitry Andric removeInstruction(OldLoad);
153606c3fb27SDimitry Andric }
153706c3fb27SDimitry Andric }
1538fe6060f1SDimitry Andric }
1539fe6060f1SDimitry Andric
1540fe6060f1SDimitry Andric // Perform PHI construction.
1541fe6060f1SDimitry Andric Value *V = ConstructSSAForLoadSet(Load, ValuesPerBlock, *this);
154206c3fb27SDimitry Andric // ConstructSSAForLoadSet is responsible for combining metadata.
15435f757f3fSDimitry Andric ICF->removeUsersOf(Load);
1544fe6060f1SDimitry Andric Load->replaceAllUsesWith(V);
1545fe6060f1SDimitry Andric if (isa<PHINode>(V))
1546fe6060f1SDimitry Andric V->takeName(Load);
1547fe6060f1SDimitry Andric if (Instruction *I = dyn_cast<Instruction>(V))
1548fe6060f1SDimitry Andric I->setDebugLoc(Load->getDebugLoc());
1549fe6060f1SDimitry Andric if (V->getType()->isPtrOrPtrVectorTy())
1550fe6060f1SDimitry Andric MD->invalidateCachedPointerInfo(V);
1551fe6060f1SDimitry Andric markInstructionForDeletion(Load);
1552fe6060f1SDimitry Andric ORE->emit([&]() {
1553fe6060f1SDimitry Andric return OptimizationRemark(DEBUG_TYPE, "LoadPRE", Load)
1554fe6060f1SDimitry Andric << "load eliminated by PRE";
1555fe6060f1SDimitry Andric });
1556fe6060f1SDimitry Andric }
1557fe6060f1SDimitry Andric
PerformLoadPRE(LoadInst * Load,AvailValInBlkVect & ValuesPerBlock,UnavailBlkVect & UnavailableBlocks)1558349cc55cSDimitry Andric bool GVNPass::PerformLoadPRE(LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
15590b57cec5SDimitry Andric UnavailBlkVect &UnavailableBlocks) {
15600b57cec5SDimitry Andric // Okay, we have *some* definitions of the value. This means that the value
15610b57cec5SDimitry Andric // is available in some of our (transitive) predecessors. Lets think about
15620b57cec5SDimitry Andric // doing PRE of this load. This will involve inserting a new load into the
15630b57cec5SDimitry Andric // predecessor when it's not available. We could do this in general, but
15640b57cec5SDimitry Andric // prefer to not increase code size. As such, we only do this when we know
15650b57cec5SDimitry Andric // that we only have to insert *one* load (which means we're basically moving
15660b57cec5SDimitry Andric // the load, not inserting a new one).
15670b57cec5SDimitry Andric
15680b57cec5SDimitry Andric SmallPtrSet<BasicBlock *, 4> Blockers(UnavailableBlocks.begin(),
15690b57cec5SDimitry Andric UnavailableBlocks.end());
15700b57cec5SDimitry Andric
15710b57cec5SDimitry Andric // Let's find the first basic block with more than one predecessor. Walk
15720b57cec5SDimitry Andric // backwards through predecessors if needed.
1573fe6060f1SDimitry Andric BasicBlock *LoadBB = Load->getParent();
15740b57cec5SDimitry Andric BasicBlock *TmpBB = LoadBB;
15750b57cec5SDimitry Andric
15760b57cec5SDimitry Andric // Check that there is no implicit control flow instructions above our load in
15770b57cec5SDimitry Andric // its block. If there is an instruction that doesn't always pass the
15780b57cec5SDimitry Andric // execution to the following instruction, then moving through it may become
15790b57cec5SDimitry Andric // invalid. For example:
15800b57cec5SDimitry Andric //
15810b57cec5SDimitry Andric // int arr[LEN];
15820b57cec5SDimitry Andric // int index = ???;
15830b57cec5SDimitry Andric // ...
15840b57cec5SDimitry Andric // guard(0 <= index && index < LEN);
15850b57cec5SDimitry Andric // use(arr[index]);
15860b57cec5SDimitry Andric //
15870b57cec5SDimitry Andric // It is illegal to move the array access to any point above the guard,
15880b57cec5SDimitry Andric // because if the index is out of bounds we should deoptimize rather than
15890b57cec5SDimitry Andric // access the array.
15900b57cec5SDimitry Andric // Check that there is no guard in this block above our instruction.
1591e8d8bef9SDimitry Andric bool MustEnsureSafetyOfSpeculativeExecution =
1592fe6060f1SDimitry Andric ICF->isDominatedByICFIFromSameBlock(Load);
1593e8d8bef9SDimitry Andric
15940b57cec5SDimitry Andric while (TmpBB->getSinglePredecessor()) {
15950b57cec5SDimitry Andric TmpBB = TmpBB->getSinglePredecessor();
15960b57cec5SDimitry Andric if (TmpBB == LoadBB) // Infinite (unreachable) loop.
15970b57cec5SDimitry Andric return false;
15980b57cec5SDimitry Andric if (Blockers.count(TmpBB))
15990b57cec5SDimitry Andric return false;
16000b57cec5SDimitry Andric
16010b57cec5SDimitry Andric // If any of these blocks has more than one successor (i.e. if the edge we
16020b57cec5SDimitry Andric // just traversed was critical), then there are other paths through this
16030b57cec5SDimitry Andric // block along which the load may not be anticipated. Hoisting the load
16040b57cec5SDimitry Andric // above this block would be adding the load to execution paths along
16050b57cec5SDimitry Andric // which it was not previously executed.
16060b57cec5SDimitry Andric if (TmpBB->getTerminator()->getNumSuccessors() != 1)
16070b57cec5SDimitry Andric return false;
16080b57cec5SDimitry Andric
16090b57cec5SDimitry Andric // Check that there is no implicit control flow in a block above.
1610e8d8bef9SDimitry Andric MustEnsureSafetyOfSpeculativeExecution =
1611e8d8bef9SDimitry Andric MustEnsureSafetyOfSpeculativeExecution || ICF->hasICF(TmpBB);
16120b57cec5SDimitry Andric }
16130b57cec5SDimitry Andric
16140b57cec5SDimitry Andric assert(TmpBB);
16150b57cec5SDimitry Andric LoadBB = TmpBB;
16160b57cec5SDimitry Andric
16170b57cec5SDimitry Andric // Check to see how many predecessors have the loaded value fully
16180b57cec5SDimitry Andric // available.
16190b57cec5SDimitry Andric MapVector<BasicBlock *, Value *> PredLoads;
1620e8d8bef9SDimitry Andric DenseMap<BasicBlock *, AvailabilityState> FullyAvailableBlocks;
16210b57cec5SDimitry Andric for (const AvailableValueInBlock &AV : ValuesPerBlock)
1622e8d8bef9SDimitry Andric FullyAvailableBlocks[AV.BB] = AvailabilityState::Available;
16230b57cec5SDimitry Andric for (BasicBlock *UnavailableBB : UnavailableBlocks)
1624e8d8bef9SDimitry Andric FullyAvailableBlocks[UnavailableBB] = AvailabilityState::Unavailable;
16250b57cec5SDimitry Andric
162606c3fb27SDimitry Andric // The edge from Pred to LoadBB is a critical edge will be splitted.
162706c3fb27SDimitry Andric SmallVector<BasicBlock *, 4> CriticalEdgePredSplit;
162806c3fb27SDimitry Andric // The edge from Pred to LoadBB is a critical edge, another successor of Pred
162906c3fb27SDimitry Andric // contains a load can be moved to Pred. This data structure maps the Pred to
163006c3fb27SDimitry Andric // the movable load.
163106c3fb27SDimitry Andric MapVector<BasicBlock *, LoadInst *> CriticalEdgePredAndLoad;
16320b57cec5SDimitry Andric for (BasicBlock *Pred : predecessors(LoadBB)) {
16330b57cec5SDimitry Andric // If any predecessor block is an EH pad that does not allow non-PHI
16340b57cec5SDimitry Andric // instructions before the terminator, we can't PRE the load.
16350b57cec5SDimitry Andric if (Pred->getTerminator()->isEHPad()) {
16360b57cec5SDimitry Andric LLVM_DEBUG(
16370b57cec5SDimitry Andric dbgs() << "COULD NOT PRE LOAD BECAUSE OF AN EH PAD PREDECESSOR '"
1638fe6060f1SDimitry Andric << Pred->getName() << "': " << *Load << '\n');
16390b57cec5SDimitry Andric return false;
16400b57cec5SDimitry Andric }
16410b57cec5SDimitry Andric
1642e8d8bef9SDimitry Andric if (IsValueFullyAvailableInBlock(Pred, FullyAvailableBlocks)) {
16430b57cec5SDimitry Andric continue;
16440b57cec5SDimitry Andric }
16450b57cec5SDimitry Andric
16460b57cec5SDimitry Andric if (Pred->getTerminator()->getNumSuccessors() != 1) {
16470b57cec5SDimitry Andric if (isa<IndirectBrInst>(Pred->getTerminator())) {
16480b57cec5SDimitry Andric LLVM_DEBUG(
16490b57cec5SDimitry Andric dbgs() << "COULD NOT PRE LOAD BECAUSE OF INDBR CRITICAL EDGE '"
1650fe6060f1SDimitry Andric << Pred->getName() << "': " << *Load << '\n');
16510b57cec5SDimitry Andric return false;
16520b57cec5SDimitry Andric }
16530b57cec5SDimitry Andric
16540b57cec5SDimitry Andric if (LoadBB->isEHPad()) {
16550b57cec5SDimitry Andric LLVM_DEBUG(
16560b57cec5SDimitry Andric dbgs() << "COULD NOT PRE LOAD BECAUSE OF AN EH PAD CRITICAL EDGE '"
1657fe6060f1SDimitry Andric << Pred->getName() << "': " << *Load << '\n');
16580b57cec5SDimitry Andric return false;
16590b57cec5SDimitry Andric }
16600b57cec5SDimitry Andric
1661e8d8bef9SDimitry Andric // Do not split backedge as it will break the canonical loop form.
1662e8d8bef9SDimitry Andric if (!isLoadPRESplitBackedgeEnabled())
1663e8d8bef9SDimitry Andric if (DT->dominates(LoadBB, Pred)) {
1664e8d8bef9SDimitry Andric LLVM_DEBUG(
1665e8d8bef9SDimitry Andric dbgs()
1666e8d8bef9SDimitry Andric << "COULD NOT PRE LOAD BECAUSE OF A BACKEDGE CRITICAL EDGE '"
1667fe6060f1SDimitry Andric << Pred->getName() << "': " << *Load << '\n');
1668e8d8bef9SDimitry Andric return false;
1669e8d8bef9SDimitry Andric }
1670e8d8bef9SDimitry Andric
167106c3fb27SDimitry Andric if (LoadInst *LI = findLoadToHoistIntoPred(Pred, LoadBB, Load))
167206c3fb27SDimitry Andric CriticalEdgePredAndLoad[Pred] = LI;
167306c3fb27SDimitry Andric else
167406c3fb27SDimitry Andric CriticalEdgePredSplit.push_back(Pred);
16750b57cec5SDimitry Andric } else {
16760b57cec5SDimitry Andric // Only add the predecessors that will not be split for now.
16770b57cec5SDimitry Andric PredLoads[Pred] = nullptr;
16780b57cec5SDimitry Andric }
16790b57cec5SDimitry Andric }
16800b57cec5SDimitry Andric
16810b57cec5SDimitry Andric // Decide whether PRE is profitable for this load.
168206c3fb27SDimitry Andric unsigned NumInsertPreds = PredLoads.size() + CriticalEdgePredSplit.size();
168306c3fb27SDimitry Andric unsigned NumUnavailablePreds = NumInsertPreds +
168406c3fb27SDimitry Andric CriticalEdgePredAndLoad.size();
16850b57cec5SDimitry Andric assert(NumUnavailablePreds != 0 &&
16860b57cec5SDimitry Andric "Fully available value should already be eliminated!");
168706c3fb27SDimitry Andric (void)NumUnavailablePreds;
16880b57cec5SDimitry Andric
168906c3fb27SDimitry Andric // If we need to insert new load in multiple predecessors, reject it.
16900b57cec5SDimitry Andric // FIXME: If we could restructure the CFG, we could make a common pred with
1691fe6060f1SDimitry Andric // all the preds that don't have an available Load and insert a new load into
16920b57cec5SDimitry Andric // that one block.
169306c3fb27SDimitry Andric if (NumInsertPreds > 1)
16940b57cec5SDimitry Andric return false;
16950b57cec5SDimitry Andric
1696e8d8bef9SDimitry Andric // Now we know where we will insert load. We must ensure that it is safe
1697e8d8bef9SDimitry Andric // to speculatively execute the load at that points.
1698e8d8bef9SDimitry Andric if (MustEnsureSafetyOfSpeculativeExecution) {
169906c3fb27SDimitry Andric if (CriticalEdgePredSplit.size())
1700bdd1243dSDimitry Andric if (!isSafeToSpeculativelyExecute(Load, LoadBB->getFirstNonPHI(), AC, DT))
1701e8d8bef9SDimitry Andric return false;
1702e8d8bef9SDimitry Andric for (auto &PL : PredLoads)
1703bdd1243dSDimitry Andric if (!isSafeToSpeculativelyExecute(Load, PL.first->getTerminator(), AC,
1704bdd1243dSDimitry Andric DT))
1705e8d8bef9SDimitry Andric return false;
170606c3fb27SDimitry Andric for (auto &CEP : CriticalEdgePredAndLoad)
170706c3fb27SDimitry Andric if (!isSafeToSpeculativelyExecute(Load, CEP.first->getTerminator(), AC,
170806c3fb27SDimitry Andric DT))
170906c3fb27SDimitry Andric return false;
1710e8d8bef9SDimitry Andric }
1711e8d8bef9SDimitry Andric
17120b57cec5SDimitry Andric // Split critical edges, and update the unavailable predecessors accordingly.
171306c3fb27SDimitry Andric for (BasicBlock *OrigPred : CriticalEdgePredSplit) {
17140b57cec5SDimitry Andric BasicBlock *NewPred = splitCriticalEdges(OrigPred, LoadBB);
17150b57cec5SDimitry Andric assert(!PredLoads.count(OrigPred) && "Split edges shouldn't be in map!");
17160b57cec5SDimitry Andric PredLoads[NewPred] = nullptr;
17170b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "Split critical edge " << OrigPred->getName() << "->"
17180b57cec5SDimitry Andric << LoadBB->getName() << '\n');
17190b57cec5SDimitry Andric }
17200b57cec5SDimitry Andric
172106c3fb27SDimitry Andric for (auto &CEP : CriticalEdgePredAndLoad)
172206c3fb27SDimitry Andric PredLoads[CEP.first] = nullptr;
172306c3fb27SDimitry Andric
17240b57cec5SDimitry Andric // Check if the load can safely be moved to all the unavailable predecessors.
17250b57cec5SDimitry Andric bool CanDoPRE = true;
1726*0fca6ea1SDimitry Andric const DataLayout &DL = Load->getDataLayout();
17270b57cec5SDimitry Andric SmallVector<Instruction*, 8> NewInsts;
17280b57cec5SDimitry Andric for (auto &PredLoad : PredLoads) {
17290b57cec5SDimitry Andric BasicBlock *UnavailablePred = PredLoad.first;
17300b57cec5SDimitry Andric
17310b57cec5SDimitry Andric // Do PHI translation to get its value in the predecessor if necessary. The
17320b57cec5SDimitry Andric // returned pointer (if non-null) is guaranteed to dominate UnavailablePred.
1733fe6060f1SDimitry Andric // We do the translation for each edge we skipped by going from Load's block
17348bcb0991SDimitry Andric // to LoadBB, otherwise we might miss pieces needing translation.
17350b57cec5SDimitry Andric
17360b57cec5SDimitry Andric // If all preds have a single successor, then we know it is safe to insert
17370b57cec5SDimitry Andric // the load on the pred (?!?), so we can insert code to materialize the
17380b57cec5SDimitry Andric // pointer if it is not available.
1739fe6060f1SDimitry Andric Value *LoadPtr = Load->getPointerOperand();
1740fe6060f1SDimitry Andric BasicBlock *Cur = Load->getParent();
17418bcb0991SDimitry Andric while (Cur != LoadBB) {
17428bcb0991SDimitry Andric PHITransAddr Address(LoadPtr, DL, AC);
174306c3fb27SDimitry Andric LoadPtr = Address.translateWithInsertion(Cur, Cur->getSinglePredecessor(),
174406c3fb27SDimitry Andric *DT, NewInsts);
17458bcb0991SDimitry Andric if (!LoadPtr) {
17468bcb0991SDimitry Andric CanDoPRE = false;
17478bcb0991SDimitry Andric break;
17488bcb0991SDimitry Andric }
17498bcb0991SDimitry Andric Cur = Cur->getSinglePredecessor();
17508bcb0991SDimitry Andric }
17510b57cec5SDimitry Andric
17528bcb0991SDimitry Andric if (LoadPtr) {
17538bcb0991SDimitry Andric PHITransAddr Address(LoadPtr, DL, AC);
175406c3fb27SDimitry Andric LoadPtr = Address.translateWithInsertion(LoadBB, UnavailablePred, *DT,
17558bcb0991SDimitry Andric NewInsts);
17568bcb0991SDimitry Andric }
17570b57cec5SDimitry Andric // If we couldn't find or insert a computation of this phi translated value,
17580b57cec5SDimitry Andric // we fail PRE.
17590b57cec5SDimitry Andric if (!LoadPtr) {
17600b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "COULDN'T INSERT PHI TRANSLATED VALUE OF: "
1761fe6060f1SDimitry Andric << *Load->getPointerOperand() << "\n");
17620b57cec5SDimitry Andric CanDoPRE = false;
17630b57cec5SDimitry Andric break;
17640b57cec5SDimitry Andric }
17650b57cec5SDimitry Andric
17660b57cec5SDimitry Andric PredLoad.second = LoadPtr;
17670b57cec5SDimitry Andric }
17680b57cec5SDimitry Andric
17690b57cec5SDimitry Andric if (!CanDoPRE) {
17700b57cec5SDimitry Andric while (!NewInsts.empty()) {
17718bcb0991SDimitry Andric // Erase instructions generated by the failed PHI translation before
17728bcb0991SDimitry Andric // trying to number them. PHI translation might insert instructions
17738bcb0991SDimitry Andric // in basic blocks other than the current one, and we delete them
17748bcb0991SDimitry Andric // directly, as markInstructionForDeletion only allows removing from the
17758bcb0991SDimitry Andric // current basic block.
17768bcb0991SDimitry Andric NewInsts.pop_back_val()->eraseFromParent();
17770b57cec5SDimitry Andric }
17780b57cec5SDimitry Andric // HINT: Don't revert the edge-splitting as following transformation may
17790b57cec5SDimitry Andric // also need to split these critical edges.
178006c3fb27SDimitry Andric return !CriticalEdgePredSplit.empty();
17810b57cec5SDimitry Andric }
17820b57cec5SDimitry Andric
17830b57cec5SDimitry Andric // Okay, we can eliminate this load by inserting a reload in the predecessor
17840b57cec5SDimitry Andric // and using PHI construction to get the value in the other predecessors, do
17850b57cec5SDimitry Andric // it.
1786fe6060f1SDimitry Andric LLVM_DEBUG(dbgs() << "GVN REMOVING PRE LOAD: " << *Load << '\n');
1787fe6060f1SDimitry Andric LLVM_DEBUG(if (!NewInsts.empty()) dbgs() << "INSERTED " << NewInsts.size()
1788fe6060f1SDimitry Andric << " INSTS: " << *NewInsts.back()
17890b57cec5SDimitry Andric << '\n');
17900b57cec5SDimitry Andric
17910b57cec5SDimitry Andric // Assign value numbers to the new instructions.
17920b57cec5SDimitry Andric for (Instruction *I : NewInsts) {
17930b57cec5SDimitry Andric // Instructions that have been inserted in predecessor(s) to materialize
17940b57cec5SDimitry Andric // the load address do not retain their original debug locations. Doing
17950b57cec5SDimitry Andric // so could lead to confusing (but correct) source attributions.
1796e8d8bef9SDimitry Andric I->updateLocationAfterHoist();
17970b57cec5SDimitry Andric
17980b57cec5SDimitry Andric // FIXME: We really _ought_ to insert these value numbers into their
17990b57cec5SDimitry Andric // parent's availability map. However, in doing so, we risk getting into
18000b57cec5SDimitry Andric // ordering issues. If a block hasn't been processed yet, we would be
18010b57cec5SDimitry Andric // marking a value as AVAIL-IN, which isn't what we intend.
18020b57cec5SDimitry Andric VN.lookupOrAdd(I);
18030b57cec5SDimitry Andric }
18040b57cec5SDimitry Andric
180506c3fb27SDimitry Andric eliminatePartiallyRedundantLoad(Load, ValuesPerBlock, PredLoads,
180606c3fb27SDimitry Andric &CriticalEdgePredAndLoad);
18070b57cec5SDimitry Andric ++NumPRELoad;
18080b57cec5SDimitry Andric return true;
18090b57cec5SDimitry Andric }
18100b57cec5SDimitry Andric
performLoopLoadPRE(LoadInst * Load,AvailValInBlkVect & ValuesPerBlock,UnavailBlkVect & UnavailableBlocks)1811349cc55cSDimitry Andric bool GVNPass::performLoopLoadPRE(LoadInst *Load,
1812349cc55cSDimitry Andric AvailValInBlkVect &ValuesPerBlock,
1813fe6060f1SDimitry Andric UnavailBlkVect &UnavailableBlocks) {
1814fe6060f1SDimitry Andric const Loop *L = LI->getLoopFor(Load->getParent());
1815fe6060f1SDimitry Andric // TODO: Generalize to other loop blocks that dominate the latch.
1816fe6060f1SDimitry Andric if (!L || L->getHeader() != Load->getParent())
1817fe6060f1SDimitry Andric return false;
1818fe6060f1SDimitry Andric
1819fe6060f1SDimitry Andric BasicBlock *Preheader = L->getLoopPreheader();
1820fe6060f1SDimitry Andric BasicBlock *Latch = L->getLoopLatch();
1821fe6060f1SDimitry Andric if (!Preheader || !Latch)
1822fe6060f1SDimitry Andric return false;
1823fe6060f1SDimitry Andric
1824fe6060f1SDimitry Andric Value *LoadPtr = Load->getPointerOperand();
1825fe6060f1SDimitry Andric // Must be available in preheader.
1826fe6060f1SDimitry Andric if (!L->isLoopInvariant(LoadPtr))
1827fe6060f1SDimitry Andric return false;
1828fe6060f1SDimitry Andric
1829fe6060f1SDimitry Andric // We plan to hoist the load to preheader without introducing a new fault.
1830fe6060f1SDimitry Andric // In order to do it, we need to prove that we cannot side-exit the loop
1831fe6060f1SDimitry Andric // once loop header is first entered before execution of the load.
1832fe6060f1SDimitry Andric if (ICF->isDominatedByICFIFromSameBlock(Load))
1833fe6060f1SDimitry Andric return false;
1834fe6060f1SDimitry Andric
1835fe6060f1SDimitry Andric BasicBlock *LoopBlock = nullptr;
1836fe6060f1SDimitry Andric for (auto *Blocker : UnavailableBlocks) {
1837fe6060f1SDimitry Andric // Blockers from outside the loop are handled in preheader.
1838fe6060f1SDimitry Andric if (!L->contains(Blocker))
1839fe6060f1SDimitry Andric continue;
1840fe6060f1SDimitry Andric
1841fe6060f1SDimitry Andric // Only allow one loop block. Loop header is not less frequently executed
1842fe6060f1SDimitry Andric // than each loop block, and likely it is much more frequently executed. But
1843fe6060f1SDimitry Andric // in case of multiple loop blocks, we need extra information (such as block
1844fe6060f1SDimitry Andric // frequency info) to understand whether it is profitable to PRE into
1845fe6060f1SDimitry Andric // multiple loop blocks.
1846fe6060f1SDimitry Andric if (LoopBlock)
1847fe6060f1SDimitry Andric return false;
1848fe6060f1SDimitry Andric
1849fe6060f1SDimitry Andric // Do not sink into inner loops. This may be non-profitable.
1850fe6060f1SDimitry Andric if (L != LI->getLoopFor(Blocker))
1851fe6060f1SDimitry Andric return false;
1852fe6060f1SDimitry Andric
1853fe6060f1SDimitry Andric // Blocks that dominate the latch execute on every single iteration, maybe
1854fe6060f1SDimitry Andric // except the last one. So PREing into these blocks doesn't make much sense
1855fe6060f1SDimitry Andric // in most cases. But the blocks that do not necessarily execute on each
1856fe6060f1SDimitry Andric // iteration are sometimes much colder than the header, and this is when
1857fe6060f1SDimitry Andric // PRE is potentially profitable.
1858fe6060f1SDimitry Andric if (DT->dominates(Blocker, Latch))
1859fe6060f1SDimitry Andric return false;
1860fe6060f1SDimitry Andric
1861fe6060f1SDimitry Andric // Make sure that the terminator itself doesn't clobber.
1862fe6060f1SDimitry Andric if (Blocker->getTerminator()->mayWriteToMemory())
1863fe6060f1SDimitry Andric return false;
1864fe6060f1SDimitry Andric
1865fe6060f1SDimitry Andric LoopBlock = Blocker;
1866fe6060f1SDimitry Andric }
1867fe6060f1SDimitry Andric
1868fe6060f1SDimitry Andric if (!LoopBlock)
1869fe6060f1SDimitry Andric return false;
1870fe6060f1SDimitry Andric
1871fe6060f1SDimitry Andric // Make sure the memory at this pointer cannot be freed, therefore we can
1872fe6060f1SDimitry Andric // safely reload from it after clobber.
1873fe6060f1SDimitry Andric if (LoadPtr->canBeFreed())
1874fe6060f1SDimitry Andric return false;
1875fe6060f1SDimitry Andric
1876fe6060f1SDimitry Andric // TODO: Support critical edge splitting if blocker has more than 1 successor.
1877fe6060f1SDimitry Andric MapVector<BasicBlock *, Value *> AvailableLoads;
1878fe6060f1SDimitry Andric AvailableLoads[LoopBlock] = LoadPtr;
1879fe6060f1SDimitry Andric AvailableLoads[Preheader] = LoadPtr;
1880fe6060f1SDimitry Andric
1881fe6060f1SDimitry Andric LLVM_DEBUG(dbgs() << "GVN REMOVING PRE LOOP LOAD: " << *Load << '\n');
188206c3fb27SDimitry Andric eliminatePartiallyRedundantLoad(Load, ValuesPerBlock, AvailableLoads,
188306c3fb27SDimitry Andric /*CriticalEdgePredAndLoad*/ nullptr);
1884fe6060f1SDimitry Andric ++NumPRELoopLoad;
1885fe6060f1SDimitry Andric return true;
1886fe6060f1SDimitry Andric }
1887fe6060f1SDimitry Andric
reportLoadElim(LoadInst * Load,Value * AvailableValue,OptimizationRemarkEmitter * ORE)1888fe6060f1SDimitry Andric static void reportLoadElim(LoadInst *Load, Value *AvailableValue,
18890b57cec5SDimitry Andric OptimizationRemarkEmitter *ORE) {
18900b57cec5SDimitry Andric using namespace ore;
18910b57cec5SDimitry Andric
18920b57cec5SDimitry Andric ORE->emit([&]() {
1893fe6060f1SDimitry Andric return OptimizationRemark(DEBUG_TYPE, "LoadElim", Load)
1894fe6060f1SDimitry Andric << "load of type " << NV("Type", Load->getType()) << " eliminated"
18950b57cec5SDimitry Andric << setExtraArgs() << " in favor of "
18960b57cec5SDimitry Andric << NV("InfavorOfValue", AvailableValue);
18970b57cec5SDimitry Andric });
18980b57cec5SDimitry Andric }
18990b57cec5SDimitry Andric
19000b57cec5SDimitry Andric /// Attempt to eliminate a load whose dependencies are
19010b57cec5SDimitry Andric /// non-local by performing PHI construction.
processNonLocalLoad(LoadInst * Load)1902349cc55cSDimitry Andric bool GVNPass::processNonLocalLoad(LoadInst *Load) {
19030b57cec5SDimitry Andric // non-local speculations are not allowed under asan.
1904fe6060f1SDimitry Andric if (Load->getParent()->getParent()->hasFnAttribute(
19050b57cec5SDimitry Andric Attribute::SanitizeAddress) ||
1906fe6060f1SDimitry Andric Load->getParent()->getParent()->hasFnAttribute(
19070b57cec5SDimitry Andric Attribute::SanitizeHWAddress))
19080b57cec5SDimitry Andric return false;
19090b57cec5SDimitry Andric
19100b57cec5SDimitry Andric // Step 1: Find the non-local dependencies of the load.
19110b57cec5SDimitry Andric LoadDepVect Deps;
1912fe6060f1SDimitry Andric MD->getNonLocalPointerDependency(Load, Deps);
19130b57cec5SDimitry Andric
19140b57cec5SDimitry Andric // If we had to process more than one hundred blocks to find the
19150b57cec5SDimitry Andric // dependencies, this load isn't worth worrying about. Optimizing
19160b57cec5SDimitry Andric // it will be too expensive.
19170b57cec5SDimitry Andric unsigned NumDeps = Deps.size();
19180b57cec5SDimitry Andric if (NumDeps > MaxNumDeps)
19190b57cec5SDimitry Andric return false;
19200b57cec5SDimitry Andric
19210b57cec5SDimitry Andric // If we had a phi translation failure, we'll have a single entry which is a
19220b57cec5SDimitry Andric // clobber in the current block. Reject this early.
19230b57cec5SDimitry Andric if (NumDeps == 1 &&
19240b57cec5SDimitry Andric !Deps[0].getResult().isDef() && !Deps[0].getResult().isClobber()) {
1925fe6060f1SDimitry Andric LLVM_DEBUG(dbgs() << "GVN: non-local load "; Load->printAsOperand(dbgs());
19260b57cec5SDimitry Andric dbgs() << " has unknown dependencies\n";);
19270b57cec5SDimitry Andric return false;
19280b57cec5SDimitry Andric }
19290b57cec5SDimitry Andric
1930e8d8bef9SDimitry Andric bool Changed = false;
19310b57cec5SDimitry Andric // If this load follows a GEP, see if we can PRE the indices before analyzing.
1932fe6060f1SDimitry Andric if (GetElementPtrInst *GEP =
1933fe6060f1SDimitry Andric dyn_cast<GetElementPtrInst>(Load->getOperand(0))) {
1934349cc55cSDimitry Andric for (Use &U : GEP->indices())
1935349cc55cSDimitry Andric if (Instruction *I = dyn_cast<Instruction>(U.get()))
1936e8d8bef9SDimitry Andric Changed |= performScalarPRE(I);
19370b57cec5SDimitry Andric }
19380b57cec5SDimitry Andric
19390b57cec5SDimitry Andric // Step 2: Analyze the availability of the load
19400b57cec5SDimitry Andric AvailValInBlkVect ValuesPerBlock;
19410b57cec5SDimitry Andric UnavailBlkVect UnavailableBlocks;
1942fe6060f1SDimitry Andric AnalyzeLoadAvailability(Load, Deps, ValuesPerBlock, UnavailableBlocks);
19430b57cec5SDimitry Andric
19440b57cec5SDimitry Andric // If we have no predecessors that produce a known value for this load, exit
19450b57cec5SDimitry Andric // early.
19460b57cec5SDimitry Andric if (ValuesPerBlock.empty())
1947e8d8bef9SDimitry Andric return Changed;
19480b57cec5SDimitry Andric
19490b57cec5SDimitry Andric // Step 3: Eliminate fully redundancy.
19500b57cec5SDimitry Andric //
19510b57cec5SDimitry Andric // If all of the instructions we depend on produce a known value for this
19520b57cec5SDimitry Andric // load, then it is fully redundant and we can use PHI insertion to compute
19530b57cec5SDimitry Andric // its value. Insert PHIs and remove the fully redundant value now.
19540b57cec5SDimitry Andric if (UnavailableBlocks.empty()) {
1955fe6060f1SDimitry Andric LLVM_DEBUG(dbgs() << "GVN REMOVING NONLOCAL LOAD: " << *Load << '\n');
19560b57cec5SDimitry Andric
19570b57cec5SDimitry Andric // Perform PHI construction.
1958fe6060f1SDimitry Andric Value *V = ConstructSSAForLoadSet(Load, ValuesPerBlock, *this);
195906c3fb27SDimitry Andric // ConstructSSAForLoadSet is responsible for combining metadata.
19605f757f3fSDimitry Andric ICF->removeUsersOf(Load);
1961fe6060f1SDimitry Andric Load->replaceAllUsesWith(V);
19620b57cec5SDimitry Andric
19630b57cec5SDimitry Andric if (isa<PHINode>(V))
1964fe6060f1SDimitry Andric V->takeName(Load);
19650b57cec5SDimitry Andric if (Instruction *I = dyn_cast<Instruction>(V))
19660b57cec5SDimitry Andric // If instruction I has debug info, then we should not update it.
19670b57cec5SDimitry Andric // Also, if I has a null DebugLoc, then it is still potentially incorrect
1968fe6060f1SDimitry Andric // to propagate Load's DebugLoc because Load may not post-dominate I.
1969fe6060f1SDimitry Andric if (Load->getDebugLoc() && Load->getParent() == I->getParent())
1970fe6060f1SDimitry Andric I->setDebugLoc(Load->getDebugLoc());
19710b57cec5SDimitry Andric if (V->getType()->isPtrOrPtrVectorTy())
19720b57cec5SDimitry Andric MD->invalidateCachedPointerInfo(V);
1973fe6060f1SDimitry Andric markInstructionForDeletion(Load);
19740b57cec5SDimitry Andric ++NumGVNLoad;
1975fe6060f1SDimitry Andric reportLoadElim(Load, V, ORE);
19760b57cec5SDimitry Andric return true;
19770b57cec5SDimitry Andric }
19780b57cec5SDimitry Andric
19790b57cec5SDimitry Andric // Step 4: Eliminate partial redundancy.
19805ffd83dbSDimitry Andric if (!isPREEnabled() || !isLoadPREEnabled())
1981e8d8bef9SDimitry Andric return Changed;
19825f757f3fSDimitry Andric if (!isLoadInLoopPREEnabled() && LI->getLoopFor(Load->getParent()))
1983e8d8bef9SDimitry Andric return Changed;
19840b57cec5SDimitry Andric
1985349cc55cSDimitry Andric if (performLoopLoadPRE(Load, ValuesPerBlock, UnavailableBlocks) ||
1986349cc55cSDimitry Andric PerformLoadPRE(Load, ValuesPerBlock, UnavailableBlocks))
1987349cc55cSDimitry Andric return true;
1988349cc55cSDimitry Andric
1989349cc55cSDimitry Andric return Changed;
19900b57cec5SDimitry Andric }
19910b57cec5SDimitry Andric
impliesEquivalanceIfTrue(CmpInst * Cmp)1992480093f4SDimitry Andric static bool impliesEquivalanceIfTrue(CmpInst* Cmp) {
1993480093f4SDimitry Andric if (Cmp->getPredicate() == CmpInst::Predicate::ICMP_EQ)
1994480093f4SDimitry Andric return true;
1995480093f4SDimitry Andric
1996480093f4SDimitry Andric // Floating point comparisons can be equal, but not equivalent. Cases:
1997480093f4SDimitry Andric // NaNs for unordered operators
1998480093f4SDimitry Andric // +0.0 vs 0.0 for all operators
1999480093f4SDimitry Andric if (Cmp->getPredicate() == CmpInst::Predicate::FCMP_OEQ ||
2000480093f4SDimitry Andric (Cmp->getPredicate() == CmpInst::Predicate::FCMP_UEQ &&
2001480093f4SDimitry Andric Cmp->getFastMathFlags().noNaNs())) {
2002480093f4SDimitry Andric Value *LHS = Cmp->getOperand(0);
2003480093f4SDimitry Andric Value *RHS = Cmp->getOperand(1);
2004480093f4SDimitry Andric // If we can prove either side non-zero, then equality must imply
2005480093f4SDimitry Andric // equivalence.
2006480093f4SDimitry Andric // FIXME: We should do this optimization if 'no signed zeros' is
2007480093f4SDimitry Andric // applicable via an instruction-level fast-math-flag or some other
2008480093f4SDimitry Andric // indicator that relaxed FP semantics are being used.
2009480093f4SDimitry Andric if (isa<ConstantFP>(LHS) && !cast<ConstantFP>(LHS)->isZero())
2010480093f4SDimitry Andric return true;
2011480093f4SDimitry Andric if (isa<ConstantFP>(RHS) && !cast<ConstantFP>(RHS)->isZero())
201206c3fb27SDimitry Andric return true;
2013480093f4SDimitry Andric // TODO: Handle vector floating point constants
2014480093f4SDimitry Andric }
2015480093f4SDimitry Andric return false;
2016480093f4SDimitry Andric }
2017480093f4SDimitry Andric
impliesEquivalanceIfFalse(CmpInst * Cmp)2018480093f4SDimitry Andric static bool impliesEquivalanceIfFalse(CmpInst* Cmp) {
2019480093f4SDimitry Andric if (Cmp->getPredicate() == CmpInst::Predicate::ICMP_NE)
2020480093f4SDimitry Andric return true;
2021480093f4SDimitry Andric
2022480093f4SDimitry Andric // Floating point comparisons can be equal, but not equivelent. Cases:
2023480093f4SDimitry Andric // NaNs for unordered operators
2024480093f4SDimitry Andric // +0.0 vs 0.0 for all operators
2025480093f4SDimitry Andric if ((Cmp->getPredicate() == CmpInst::Predicate::FCMP_ONE &&
2026480093f4SDimitry Andric Cmp->getFastMathFlags().noNaNs()) ||
2027480093f4SDimitry Andric Cmp->getPredicate() == CmpInst::Predicate::FCMP_UNE) {
2028480093f4SDimitry Andric Value *LHS = Cmp->getOperand(0);
2029480093f4SDimitry Andric Value *RHS = Cmp->getOperand(1);
2030480093f4SDimitry Andric // If we can prove either side non-zero, then equality must imply
2031480093f4SDimitry Andric // equivalence.
2032480093f4SDimitry Andric // FIXME: We should do this optimization if 'no signed zeros' is
2033480093f4SDimitry Andric // applicable via an instruction-level fast-math-flag or some other
2034480093f4SDimitry Andric // indicator that relaxed FP semantics are being used.
2035480093f4SDimitry Andric if (isa<ConstantFP>(LHS) && !cast<ConstantFP>(LHS)->isZero())
2036480093f4SDimitry Andric return true;
2037480093f4SDimitry Andric if (isa<ConstantFP>(RHS) && !cast<ConstantFP>(RHS)->isZero())
203806c3fb27SDimitry Andric return true;
2039480093f4SDimitry Andric // TODO: Handle vector floating point constants
2040480093f4SDimitry Andric }
2041480093f4SDimitry Andric return false;
2042480093f4SDimitry Andric }
2043480093f4SDimitry Andric
2044480093f4SDimitry Andric
hasUsersIn(Value * V,BasicBlock * BB)20458bcb0991SDimitry Andric static bool hasUsersIn(Value *V, BasicBlock *BB) {
2046bdd1243dSDimitry Andric return llvm::any_of(V->users(), [BB](User *U) {
2047bdd1243dSDimitry Andric auto *I = dyn_cast<Instruction>(U);
2048bdd1243dSDimitry Andric return I && I->getParent() == BB;
2049bdd1243dSDimitry Andric });
20508bcb0991SDimitry Andric }
20518bcb0991SDimitry Andric
processAssumeIntrinsic(AssumeInst * IntrinsicI)2052349cc55cSDimitry Andric bool GVNPass::processAssumeIntrinsic(AssumeInst *IntrinsicI) {
20530b57cec5SDimitry Andric Value *V = IntrinsicI->getArgOperand(0);
20540b57cec5SDimitry Andric
20550b57cec5SDimitry Andric if (ConstantInt *Cond = dyn_cast<ConstantInt>(V)) {
20560b57cec5SDimitry Andric if (Cond->isZero()) {
20570b57cec5SDimitry Andric Type *Int8Ty = Type::getInt8Ty(V->getContext());
20585f757f3fSDimitry Andric Type *PtrTy = PointerType::get(V->getContext(), 0);
20590b57cec5SDimitry Andric // Insert a new store to null instruction before the load to indicate that
20600b57cec5SDimitry Andric // this code is not reachable. FIXME: We could insert unreachable
20610b57cec5SDimitry Andric // instruction directly because we can modify the CFG.
2062*0fca6ea1SDimitry Andric auto *NewS =
2063*0fca6ea1SDimitry Andric new StoreInst(PoisonValue::get(Int8Ty), Constant::getNullValue(PtrTy),
2064*0fca6ea1SDimitry Andric IntrinsicI->getIterator());
2065e8d8bef9SDimitry Andric if (MSSAU) {
2066e8d8bef9SDimitry Andric const MemoryUseOrDef *FirstNonDom = nullptr;
2067e8d8bef9SDimitry Andric const auto *AL =
2068e8d8bef9SDimitry Andric MSSAU->getMemorySSA()->getBlockAccesses(IntrinsicI->getParent());
2069e8d8bef9SDimitry Andric
2070e8d8bef9SDimitry Andric // If there are accesses in the current basic block, find the first one
2071e8d8bef9SDimitry Andric // that does not come before NewS. The new memory access is inserted
2072e8d8bef9SDimitry Andric // after the found access or before the terminator if no such access is
2073e8d8bef9SDimitry Andric // found.
2074e8d8bef9SDimitry Andric if (AL) {
2075bdd1243dSDimitry Andric for (const auto &Acc : *AL) {
2076e8d8bef9SDimitry Andric if (auto *Current = dyn_cast<MemoryUseOrDef>(&Acc))
2077e8d8bef9SDimitry Andric if (!Current->getMemoryInst()->comesBefore(NewS)) {
2078e8d8bef9SDimitry Andric FirstNonDom = Current;
2079e8d8bef9SDimitry Andric break;
2080e8d8bef9SDimitry Andric }
2081e8d8bef9SDimitry Andric }
2082e8d8bef9SDimitry Andric }
2083e8d8bef9SDimitry Andric
2084e8d8bef9SDimitry Andric auto *NewDef =
2085e8d8bef9SDimitry Andric FirstNonDom ? MSSAU->createMemoryAccessBefore(
20865f757f3fSDimitry Andric NewS, nullptr,
2087e8d8bef9SDimitry Andric const_cast<MemoryUseOrDef *>(FirstNonDom))
2088e8d8bef9SDimitry Andric : MSSAU->createMemoryAccessInBB(
20895f757f3fSDimitry Andric NewS, nullptr,
2090e8d8bef9SDimitry Andric NewS->getParent(), MemorySSA::BeforeTerminator);
2091e8d8bef9SDimitry Andric
2092e8d8bef9SDimitry Andric MSSAU->insertDef(cast<MemoryDef>(NewDef), /*RenameUses=*/false);
2093e8d8bef9SDimitry Andric }
20940b57cec5SDimitry Andric }
209506c3fb27SDimitry Andric if (isAssumeWithEmptyBundle(*IntrinsicI)) {
20960b57cec5SDimitry Andric markInstructionForDeletion(IntrinsicI);
209706c3fb27SDimitry Andric return true;
209806c3fb27SDimitry Andric }
20990b57cec5SDimitry Andric return false;
210006c3fb27SDimitry Andric }
210106c3fb27SDimitry Andric
210206c3fb27SDimitry Andric if (isa<Constant>(V)) {
21030b57cec5SDimitry Andric // If it's not false, and constant, it must evaluate to true. This means our
21040b57cec5SDimitry Andric // assume is assume(true), and thus, pointless, and we don't want to do
21050b57cec5SDimitry Andric // anything more here.
21060b57cec5SDimitry Andric return false;
21070b57cec5SDimitry Andric }
21080b57cec5SDimitry Andric
21090b57cec5SDimitry Andric Constant *True = ConstantInt::getTrue(V->getContext());
21100b57cec5SDimitry Andric bool Changed = false;
21110b57cec5SDimitry Andric
21120b57cec5SDimitry Andric for (BasicBlock *Successor : successors(IntrinsicI->getParent())) {
21130b57cec5SDimitry Andric BasicBlockEdge Edge(IntrinsicI->getParent(), Successor);
21140b57cec5SDimitry Andric
21150b57cec5SDimitry Andric // This property is only true in dominated successors, propagateEquality
21160b57cec5SDimitry Andric // will check dominance for us.
21170b57cec5SDimitry Andric Changed |= propagateEquality(V, True, Edge, false);
21180b57cec5SDimitry Andric }
21190b57cec5SDimitry Andric
21200b57cec5SDimitry Andric // We can replace assume value with true, which covers cases like this:
21210b57cec5SDimitry Andric // call void @llvm.assume(i1 %cmp)
21220b57cec5SDimitry Andric // br i1 %cmp, label %bb1, label %bb2 ; will change %cmp to true
21238bcb0991SDimitry Andric ReplaceOperandsWithMap[V] = True;
21240b57cec5SDimitry Andric
2125e8d8bef9SDimitry Andric // Similarly, after assume(!NotV) we know that NotV == false.
2126e8d8bef9SDimitry Andric Value *NotV;
2127e8d8bef9SDimitry Andric if (match(V, m_Not(m_Value(NotV))))
2128e8d8bef9SDimitry Andric ReplaceOperandsWithMap[NotV] = ConstantInt::getFalse(V->getContext());
2129e8d8bef9SDimitry Andric
21308bcb0991SDimitry Andric // If we find an equality fact, canonicalize all dominated uses in this block
21318bcb0991SDimitry Andric // to one of the two values. We heuristically choice the "oldest" of the
21328bcb0991SDimitry Andric // two where age is determined by value number. (Note that propagateEquality
21338bcb0991SDimitry Andric // above handles the cross block case.)
21348bcb0991SDimitry Andric //
21358bcb0991SDimitry Andric // Key case to cover are:
21368bcb0991SDimitry Andric // 1)
21370b57cec5SDimitry Andric // %cmp = fcmp oeq float 3.000000e+00, %0 ; const on lhs could happen
21380b57cec5SDimitry Andric // call void @llvm.assume(i1 %cmp)
21390b57cec5SDimitry Andric // ret float %0 ; will change it to ret float 3.000000e+00
21408bcb0991SDimitry Andric // 2)
21418bcb0991SDimitry Andric // %load = load float, float* %addr
21428bcb0991SDimitry Andric // %cmp = fcmp oeq float %load, %0
21438bcb0991SDimitry Andric // call void @llvm.assume(i1 %cmp)
21448bcb0991SDimitry Andric // ret float %load ; will change it to ret float %0
21450b57cec5SDimitry Andric if (auto *CmpI = dyn_cast<CmpInst>(V)) {
2146480093f4SDimitry Andric if (impliesEquivalanceIfTrue(CmpI)) {
21470b57cec5SDimitry Andric Value *CmpLHS = CmpI->getOperand(0);
21480b57cec5SDimitry Andric Value *CmpRHS = CmpI->getOperand(1);
21498bcb0991SDimitry Andric // Heuristically pick the better replacement -- the choice of heuristic
21508bcb0991SDimitry Andric // isn't terribly important here, but the fact we canonicalize on some
21518bcb0991SDimitry Andric // replacement is for exposing other simplifications.
21528bcb0991SDimitry Andric // TODO: pull this out as a helper function and reuse w/existing
21538bcb0991SDimitry Andric // (slightly different) logic.
21548bcb0991SDimitry Andric if (isa<Constant>(CmpLHS) && !isa<Constant>(CmpRHS))
21550b57cec5SDimitry Andric std::swap(CmpLHS, CmpRHS);
21568bcb0991SDimitry Andric if (!isa<Instruction>(CmpLHS) && isa<Instruction>(CmpRHS))
21578bcb0991SDimitry Andric std::swap(CmpLHS, CmpRHS);
21588bcb0991SDimitry Andric if ((isa<Argument>(CmpLHS) && isa<Argument>(CmpRHS)) ||
21598bcb0991SDimitry Andric (isa<Instruction>(CmpLHS) && isa<Instruction>(CmpRHS))) {
21608bcb0991SDimitry Andric // Move the 'oldest' value to the right-hand side, using the value
21618bcb0991SDimitry Andric // number as a proxy for age.
21628bcb0991SDimitry Andric uint32_t LVN = VN.lookupOrAdd(CmpLHS);
21638bcb0991SDimitry Andric uint32_t RVN = VN.lookupOrAdd(CmpRHS);
21648bcb0991SDimitry Andric if (LVN < RVN)
21658bcb0991SDimitry Andric std::swap(CmpLHS, CmpRHS);
21668bcb0991SDimitry Andric }
21670b57cec5SDimitry Andric
21688bcb0991SDimitry Andric // Handle degenerate case where we either haven't pruned a dead path or a
21698bcb0991SDimitry Andric // removed a trivial assume yet.
21708bcb0991SDimitry Andric if (isa<Constant>(CmpLHS) && isa<Constant>(CmpRHS))
21718bcb0991SDimitry Andric return Changed;
21728bcb0991SDimitry Andric
21738bcb0991SDimitry Andric LLVM_DEBUG(dbgs() << "Replacing dominated uses of "
21748bcb0991SDimitry Andric << *CmpLHS << " with "
21758bcb0991SDimitry Andric << *CmpRHS << " in block "
21768bcb0991SDimitry Andric << IntrinsicI->getParent()->getName() << "\n");
21778bcb0991SDimitry Andric
21788bcb0991SDimitry Andric
21798bcb0991SDimitry Andric // Setup the replacement map - this handles uses within the same block
21808bcb0991SDimitry Andric if (hasUsersIn(CmpLHS, IntrinsicI->getParent()))
21818bcb0991SDimitry Andric ReplaceOperandsWithMap[CmpLHS] = CmpRHS;
21828bcb0991SDimitry Andric
21838bcb0991SDimitry Andric // NOTE: The non-block local cases are handled by the call to
21848bcb0991SDimitry Andric // propagateEquality above; this block is just about handling the block
21858bcb0991SDimitry Andric // local cases. TODO: There's a bunch of logic in propagateEqualiy which
21868bcb0991SDimitry Andric // isn't duplicated for the block local case, can we share it somehow?
21870b57cec5SDimitry Andric }
21880b57cec5SDimitry Andric }
21890b57cec5SDimitry Andric return Changed;
21900b57cec5SDimitry Andric }
21910b57cec5SDimitry Andric
patchAndReplaceAllUsesWith(Instruction * I,Value * Repl)21920b57cec5SDimitry Andric static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl) {
21930b57cec5SDimitry Andric patchReplacementInstruction(I, Repl);
21940b57cec5SDimitry Andric I->replaceAllUsesWith(Repl);
21950b57cec5SDimitry Andric }
21960b57cec5SDimitry Andric
21970b57cec5SDimitry Andric /// Attempt to eliminate a load, first by eliminating it
21980b57cec5SDimitry Andric /// locally, and then attempting non-local elimination if that fails.
processLoad(LoadInst * L)2199349cc55cSDimitry Andric bool GVNPass::processLoad(LoadInst *L) {
22000b57cec5SDimitry Andric if (!MD)
22010b57cec5SDimitry Andric return false;
22020b57cec5SDimitry Andric
22030b57cec5SDimitry Andric // This code hasn't been audited for ordered or volatile memory access
22040b57cec5SDimitry Andric if (!L->isUnordered())
22050b57cec5SDimitry Andric return false;
22060b57cec5SDimitry Andric
22070b57cec5SDimitry Andric if (L->use_empty()) {
22080b57cec5SDimitry Andric markInstructionForDeletion(L);
22090b57cec5SDimitry Andric return true;
22100b57cec5SDimitry Andric }
22110b57cec5SDimitry Andric
22120b57cec5SDimitry Andric // ... to a pointer that has been loaded from before...
22130b57cec5SDimitry Andric MemDepResult Dep = MD->getDependency(L);
22140b57cec5SDimitry Andric
22150b57cec5SDimitry Andric // If it is defined in another block, try harder.
22160b57cec5SDimitry Andric if (Dep.isNonLocal())
22170b57cec5SDimitry Andric return processNonLocalLoad(L);
22180b57cec5SDimitry Andric
22190b57cec5SDimitry Andric // Only handle the local case below
2220bdd1243dSDimitry Andric if (!Dep.isLocal()) {
22210b57cec5SDimitry Andric // This might be a NonFuncLocal or an Unknown
22220b57cec5SDimitry Andric LLVM_DEBUG(
22230b57cec5SDimitry Andric // fast print dep, using operator<< on instruction is too slow.
22240b57cec5SDimitry Andric dbgs() << "GVN: load "; L->printAsOperand(dbgs());
22250b57cec5SDimitry Andric dbgs() << " has unknown dependence\n";);
22260b57cec5SDimitry Andric return false;
22270b57cec5SDimitry Andric }
22280b57cec5SDimitry Andric
2229bdd1243dSDimitry Andric auto AV = AnalyzeLoadAvailability(L, Dep, L->getPointerOperand());
2230bdd1243dSDimitry Andric if (!AV)
2231bdd1243dSDimitry Andric return false;
2232bdd1243dSDimitry Andric
2233bdd1243dSDimitry Andric Value *AvailableValue = AV->MaterializeAdjustedValue(L, L, *this);
22340b57cec5SDimitry Andric
223506c3fb27SDimitry Andric // MaterializeAdjustedValue is responsible for combining metadata.
22365f757f3fSDimitry Andric ICF->removeUsersOf(L);
223706c3fb27SDimitry Andric L->replaceAllUsesWith(AvailableValue);
22380b57cec5SDimitry Andric markInstructionForDeletion(L);
2239e8d8bef9SDimitry Andric if (MSSAU)
2240e8d8bef9SDimitry Andric MSSAU->removeMemoryAccess(L);
22410b57cec5SDimitry Andric ++NumGVNLoad;
22420b57cec5SDimitry Andric reportLoadElim(L, AvailableValue, ORE);
2243fe6060f1SDimitry Andric // Tell MDA to reexamine the reused pointer since we might have more
22440b57cec5SDimitry Andric // information after forwarding it.
22450b57cec5SDimitry Andric if (MD && AvailableValue->getType()->isPtrOrPtrVectorTy())
22460b57cec5SDimitry Andric MD->invalidateCachedPointerInfo(AvailableValue);
22470b57cec5SDimitry Andric return true;
22480b57cec5SDimitry Andric }
22490b57cec5SDimitry Andric
22500b57cec5SDimitry Andric /// Return a pair the first field showing the value number of \p Exp and the
22510b57cec5SDimitry Andric /// second field showing whether it is a value number newly created.
22520b57cec5SDimitry Andric std::pair<uint32_t, bool>
assignExpNewValueNum(Expression & Exp)2253349cc55cSDimitry Andric GVNPass::ValueTable::assignExpNewValueNum(Expression &Exp) {
22540b57cec5SDimitry Andric uint32_t &e = expressionNumbering[Exp];
22550b57cec5SDimitry Andric bool CreateNewValNum = !e;
22560b57cec5SDimitry Andric if (CreateNewValNum) {
22570b57cec5SDimitry Andric Expressions.push_back(Exp);
22580b57cec5SDimitry Andric if (ExprIdx.size() < nextValueNumber + 1)
22590b57cec5SDimitry Andric ExprIdx.resize(nextValueNumber * 2);
22600b57cec5SDimitry Andric e = nextValueNumber;
22610b57cec5SDimitry Andric ExprIdx[nextValueNumber++] = nextExprNumber++;
22620b57cec5SDimitry Andric }
22630b57cec5SDimitry Andric return {e, CreateNewValNum};
22640b57cec5SDimitry Andric }
22650b57cec5SDimitry Andric
22660b57cec5SDimitry Andric /// Return whether all the values related with the same \p num are
22670b57cec5SDimitry Andric /// defined in \p BB.
areAllValsInBB(uint32_t Num,const BasicBlock * BB,GVNPass & Gvn)2268349cc55cSDimitry Andric bool GVNPass::ValueTable::areAllValsInBB(uint32_t Num, const BasicBlock *BB,
2269349cc55cSDimitry Andric GVNPass &Gvn) {
2270*0fca6ea1SDimitry Andric return all_of(
2271*0fca6ea1SDimitry Andric Gvn.LeaderTable.getLeaders(Num),
2272*0fca6ea1SDimitry Andric [=](const LeaderMap::LeaderTableEntry &L) { return L.BB == BB; });
22730b57cec5SDimitry Andric }
22740b57cec5SDimitry Andric
22750b57cec5SDimitry Andric /// Wrap phiTranslateImpl to provide caching functionality.
phiTranslate(const BasicBlock * Pred,const BasicBlock * PhiBlock,uint32_t Num,GVNPass & Gvn)2276349cc55cSDimitry Andric uint32_t GVNPass::ValueTable::phiTranslate(const BasicBlock *Pred,
2277349cc55cSDimitry Andric const BasicBlock *PhiBlock,
2278349cc55cSDimitry Andric uint32_t Num, GVNPass &Gvn) {
22790b57cec5SDimitry Andric auto FindRes = PhiTranslateTable.find({Num, Pred});
22800b57cec5SDimitry Andric if (FindRes != PhiTranslateTable.end())
22810b57cec5SDimitry Andric return FindRes->second;
22820b57cec5SDimitry Andric uint32_t NewNum = phiTranslateImpl(Pred, PhiBlock, Num, Gvn);
22830b57cec5SDimitry Andric PhiTranslateTable.insert({{Num, Pred}, NewNum});
22840b57cec5SDimitry Andric return NewNum;
22850b57cec5SDimitry Andric }
22860b57cec5SDimitry Andric
2287c14a5a88SDimitry Andric // Return true if the value number \p Num and NewNum have equal value.
2288c14a5a88SDimitry Andric // Return false if the result is unknown.
areCallValsEqual(uint32_t Num,uint32_t NewNum,const BasicBlock * Pred,const BasicBlock * PhiBlock,GVNPass & Gvn)2289349cc55cSDimitry Andric bool GVNPass::ValueTable::areCallValsEqual(uint32_t Num, uint32_t NewNum,
2290c14a5a88SDimitry Andric const BasicBlock *Pred,
2291349cc55cSDimitry Andric const BasicBlock *PhiBlock,
2292349cc55cSDimitry Andric GVNPass &Gvn) {
2293c14a5a88SDimitry Andric CallInst *Call = nullptr;
2294*0fca6ea1SDimitry Andric auto Leaders = Gvn.LeaderTable.getLeaders(Num);
2295*0fca6ea1SDimitry Andric for (const auto &Entry : Leaders) {
2296*0fca6ea1SDimitry Andric Call = dyn_cast<CallInst>(Entry.Val);
2297c14a5a88SDimitry Andric if (Call && Call->getParent() == PhiBlock)
2298c14a5a88SDimitry Andric break;
2299c14a5a88SDimitry Andric }
2300c14a5a88SDimitry Andric
2301c14a5a88SDimitry Andric if (AA->doesNotAccessMemory(Call))
2302c14a5a88SDimitry Andric return true;
2303c14a5a88SDimitry Andric
2304c14a5a88SDimitry Andric if (!MD || !AA->onlyReadsMemory(Call))
2305c14a5a88SDimitry Andric return false;
2306c14a5a88SDimitry Andric
2307c14a5a88SDimitry Andric MemDepResult local_dep = MD->getDependency(Call);
2308c14a5a88SDimitry Andric if (!local_dep.isNonLocal())
2309c14a5a88SDimitry Andric return false;
2310c14a5a88SDimitry Andric
2311c14a5a88SDimitry Andric const MemoryDependenceResults::NonLocalDepInfo &deps =
2312c14a5a88SDimitry Andric MD->getNonLocalCallDependency(Call);
2313c14a5a88SDimitry Andric
2314c14a5a88SDimitry Andric // Check to see if the Call has no function local clobber.
2315fe6060f1SDimitry Andric for (const NonLocalDepEntry &D : deps) {
2316fe6060f1SDimitry Andric if (D.getResult().isNonFuncLocal())
2317c14a5a88SDimitry Andric return true;
2318c14a5a88SDimitry Andric }
2319c14a5a88SDimitry Andric return false;
2320c14a5a88SDimitry Andric }
2321c14a5a88SDimitry Andric
23220b57cec5SDimitry Andric /// Translate value number \p Num using phis, so that it has the values of
23230b57cec5SDimitry Andric /// the phis in BB.
phiTranslateImpl(const BasicBlock * Pred,const BasicBlock * PhiBlock,uint32_t Num,GVNPass & Gvn)2324349cc55cSDimitry Andric uint32_t GVNPass::ValueTable::phiTranslateImpl(const BasicBlock *Pred,
23250b57cec5SDimitry Andric const BasicBlock *PhiBlock,
2326349cc55cSDimitry Andric uint32_t Num, GVNPass &Gvn) {
23270b57cec5SDimitry Andric if (PHINode *PN = NumberingPhi[Num]) {
23280b57cec5SDimitry Andric for (unsigned i = 0; i != PN->getNumIncomingValues(); ++i) {
23290b57cec5SDimitry Andric if (PN->getParent() == PhiBlock && PN->getIncomingBlock(i) == Pred)
23300b57cec5SDimitry Andric if (uint32_t TransVal = lookup(PN->getIncomingValue(i), false))
23310b57cec5SDimitry Andric return TransVal;
23320b57cec5SDimitry Andric }
23330b57cec5SDimitry Andric return Num;
23340b57cec5SDimitry Andric }
23350b57cec5SDimitry Andric
23360b57cec5SDimitry Andric // If there is any value related with Num is defined in a BB other than
23370b57cec5SDimitry Andric // PhiBlock, it cannot depend on a phi in PhiBlock without going through
23380b57cec5SDimitry Andric // a backedge. We can do an early exit in that case to save compile time.
23390b57cec5SDimitry Andric if (!areAllValsInBB(Num, PhiBlock, Gvn))
23400b57cec5SDimitry Andric return Num;
23410b57cec5SDimitry Andric
23420b57cec5SDimitry Andric if (Num >= ExprIdx.size() || ExprIdx[Num] == 0)
23430b57cec5SDimitry Andric return Num;
23440b57cec5SDimitry Andric Expression Exp = Expressions[ExprIdx[Num]];
23450b57cec5SDimitry Andric
23460b57cec5SDimitry Andric for (unsigned i = 0; i < Exp.varargs.size(); i++) {
23470b57cec5SDimitry Andric // For InsertValue and ExtractValue, some varargs are index numbers
23480b57cec5SDimitry Andric // instead of value numbers. Those index numbers should not be
23490b57cec5SDimitry Andric // translated.
23500b57cec5SDimitry Andric if ((i > 1 && Exp.opcode == Instruction::InsertValue) ||
23515ffd83dbSDimitry Andric (i > 0 && Exp.opcode == Instruction::ExtractValue) ||
23525ffd83dbSDimitry Andric (i > 1 && Exp.opcode == Instruction::ShuffleVector))
23530b57cec5SDimitry Andric continue;
23540b57cec5SDimitry Andric Exp.varargs[i] = phiTranslate(Pred, PhiBlock, Exp.varargs[i], Gvn);
23550b57cec5SDimitry Andric }
23560b57cec5SDimitry Andric
23570b57cec5SDimitry Andric if (Exp.commutative) {
2358e8d8bef9SDimitry Andric assert(Exp.varargs.size() >= 2 && "Unsupported commutative instruction!");
23590b57cec5SDimitry Andric if (Exp.varargs[0] > Exp.varargs[1]) {
23600b57cec5SDimitry Andric std::swap(Exp.varargs[0], Exp.varargs[1]);
23610b57cec5SDimitry Andric uint32_t Opcode = Exp.opcode >> 8;
23620b57cec5SDimitry Andric if (Opcode == Instruction::ICmp || Opcode == Instruction::FCmp)
23630b57cec5SDimitry Andric Exp.opcode = (Opcode << 8) |
23640b57cec5SDimitry Andric CmpInst::getSwappedPredicate(
23650b57cec5SDimitry Andric static_cast<CmpInst::Predicate>(Exp.opcode & 255));
23660b57cec5SDimitry Andric }
23670b57cec5SDimitry Andric }
23680b57cec5SDimitry Andric
2369c14a5a88SDimitry Andric if (uint32_t NewNum = expressionNumbering[Exp]) {
2370c14a5a88SDimitry Andric if (Exp.opcode == Instruction::Call && NewNum != Num)
2371c14a5a88SDimitry Andric return areCallValsEqual(Num, NewNum, Pred, PhiBlock, Gvn) ? NewNum : Num;
23720b57cec5SDimitry Andric return NewNum;
2373c14a5a88SDimitry Andric }
23740b57cec5SDimitry Andric return Num;
23750b57cec5SDimitry Andric }
23760b57cec5SDimitry Andric
23770b57cec5SDimitry Andric /// Erase stale entry from phiTranslate cache so phiTranslate can be computed
23780b57cec5SDimitry Andric /// again.
eraseTranslateCacheEntry(uint32_t Num,const BasicBlock & CurrBlock)2379349cc55cSDimitry Andric void GVNPass::ValueTable::eraseTranslateCacheEntry(
2380349cc55cSDimitry Andric uint32_t Num, const BasicBlock &CurrBlock) {
2381e8d8bef9SDimitry Andric for (const BasicBlock *Pred : predecessors(&CurrBlock))
2382e8d8bef9SDimitry Andric PhiTranslateTable.erase({Num, Pred});
23830b57cec5SDimitry Andric }
23840b57cec5SDimitry Andric
23850b57cec5SDimitry Andric // In order to find a leader for a given value number at a
23860b57cec5SDimitry Andric // specific basic block, we first obtain the list of all Values for that number,
23870b57cec5SDimitry Andric // and then scan the list to find one whose block dominates the block in
23880b57cec5SDimitry Andric // question. This is fast because dominator tree queries consist of only
23890b57cec5SDimitry Andric // a few comparisons of DFS numbers.
findLeader(const BasicBlock * BB,uint32_t num)2390349cc55cSDimitry Andric Value *GVNPass::findLeader(const BasicBlock *BB, uint32_t num) {
2391*0fca6ea1SDimitry Andric auto Leaders = LeaderTable.getLeaders(num);
2392*0fca6ea1SDimitry Andric if (Leaders.empty())
2393*0fca6ea1SDimitry Andric return nullptr;
23940b57cec5SDimitry Andric
23950b57cec5SDimitry Andric Value *Val = nullptr;
2396*0fca6ea1SDimitry Andric for (const auto &Entry : Leaders) {
2397*0fca6ea1SDimitry Andric if (DT->dominates(Entry.BB, BB)) {
2398*0fca6ea1SDimitry Andric Val = Entry.Val;
2399*0fca6ea1SDimitry Andric if (isa<Constant>(Val))
2400*0fca6ea1SDimitry Andric return Val;
24010b57cec5SDimitry Andric }
24020b57cec5SDimitry Andric }
24030b57cec5SDimitry Andric
24040b57cec5SDimitry Andric return Val;
24050b57cec5SDimitry Andric }
24060b57cec5SDimitry Andric
24070b57cec5SDimitry Andric /// There is an edge from 'Src' to 'Dst'. Return
24080b57cec5SDimitry Andric /// true if every path from the entry block to 'Dst' passes via this edge. In
24090b57cec5SDimitry Andric /// particular 'Dst' must not be reachable via another edge from 'Src'.
isOnlyReachableViaThisEdge(const BasicBlockEdge & E,DominatorTree * DT)24100b57cec5SDimitry Andric static bool isOnlyReachableViaThisEdge(const BasicBlockEdge &E,
24110b57cec5SDimitry Andric DominatorTree *DT) {
24120b57cec5SDimitry Andric // While in theory it is interesting to consider the case in which Dst has
24130b57cec5SDimitry Andric // more than one predecessor, because Dst might be part of a loop which is
24140b57cec5SDimitry Andric // only reachable from Src, in practice it is pointless since at the time
24150b57cec5SDimitry Andric // GVN runs all such loops have preheaders, which means that Dst will have
24160b57cec5SDimitry Andric // been changed to have only one predecessor, namely Src.
24170b57cec5SDimitry Andric const BasicBlock *Pred = E.getEnd()->getSinglePredecessor();
24180b57cec5SDimitry Andric assert((!Pred || Pred == E.getStart()) &&
24190b57cec5SDimitry Andric "No edge between these basic blocks!");
24200b57cec5SDimitry Andric return Pred != nullptr;
24210b57cec5SDimitry Andric }
24220b57cec5SDimitry Andric
assignBlockRPONumber(Function & F)2423349cc55cSDimitry Andric void GVNPass::assignBlockRPONumber(Function &F) {
24240b57cec5SDimitry Andric BlockRPONumber.clear();
24250b57cec5SDimitry Andric uint32_t NextBlockNumber = 1;
24260b57cec5SDimitry Andric ReversePostOrderTraversal<Function *> RPOT(&F);
24270b57cec5SDimitry Andric for (BasicBlock *BB : RPOT)
24280b57cec5SDimitry Andric BlockRPONumber[BB] = NextBlockNumber++;
24290b57cec5SDimitry Andric InvalidBlockRPONumbers = false;
24300b57cec5SDimitry Andric }
24310b57cec5SDimitry Andric
replaceOperandsForInBlockEquality(Instruction * Instr) const2432349cc55cSDimitry Andric bool GVNPass::replaceOperandsForInBlockEquality(Instruction *Instr) const {
24330b57cec5SDimitry Andric bool Changed = false;
24340b57cec5SDimitry Andric for (unsigned OpNum = 0; OpNum < Instr->getNumOperands(); ++OpNum) {
24350b57cec5SDimitry Andric Value *Operand = Instr->getOperand(OpNum);
24368bcb0991SDimitry Andric auto it = ReplaceOperandsWithMap.find(Operand);
24378bcb0991SDimitry Andric if (it != ReplaceOperandsWithMap.end()) {
24380b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "GVN replacing: " << *Operand << " with "
24390b57cec5SDimitry Andric << *it->second << " in instruction " << *Instr << '\n');
24400b57cec5SDimitry Andric Instr->setOperand(OpNum, it->second);
24410b57cec5SDimitry Andric Changed = true;
24420b57cec5SDimitry Andric }
24430b57cec5SDimitry Andric }
24440b57cec5SDimitry Andric return Changed;
24450b57cec5SDimitry Andric }
24460b57cec5SDimitry Andric
24470b57cec5SDimitry Andric /// The given values are known to be equal in every block
24480b57cec5SDimitry Andric /// dominated by 'Root'. Exploit this, for example by replacing 'LHS' with
24490b57cec5SDimitry Andric /// 'RHS' everywhere in the scope. Returns whether a change was made.
24500b57cec5SDimitry Andric /// If DominatesByEdge is false, then it means that we will propagate the RHS
24510b57cec5SDimitry Andric /// value starting from the end of Root.Start.
propagateEquality(Value * LHS,Value * RHS,const BasicBlockEdge & Root,bool DominatesByEdge)2452349cc55cSDimitry Andric bool GVNPass::propagateEquality(Value *LHS, Value *RHS,
2453349cc55cSDimitry Andric const BasicBlockEdge &Root,
24540b57cec5SDimitry Andric bool DominatesByEdge) {
24550b57cec5SDimitry Andric SmallVector<std::pair<Value*, Value*>, 4> Worklist;
24560b57cec5SDimitry Andric Worklist.push_back(std::make_pair(LHS, RHS));
24570b57cec5SDimitry Andric bool Changed = false;
24580b57cec5SDimitry Andric // For speed, compute a conservative fast approximation to
24590b57cec5SDimitry Andric // DT->dominates(Root, Root.getEnd());
24600b57cec5SDimitry Andric const bool RootDominatesEnd = isOnlyReachableViaThisEdge(Root, DT);
24610b57cec5SDimitry Andric
24620b57cec5SDimitry Andric while (!Worklist.empty()) {
24630b57cec5SDimitry Andric std::pair<Value*, Value*> Item = Worklist.pop_back_val();
24640b57cec5SDimitry Andric LHS = Item.first; RHS = Item.second;
24650b57cec5SDimitry Andric
24660b57cec5SDimitry Andric if (LHS == RHS)
24670b57cec5SDimitry Andric continue;
24680b57cec5SDimitry Andric assert(LHS->getType() == RHS->getType() && "Equality but unequal types!");
24690b57cec5SDimitry Andric
24700b57cec5SDimitry Andric // Don't try to propagate equalities between constants.
24710b57cec5SDimitry Andric if (isa<Constant>(LHS) && isa<Constant>(RHS))
24720b57cec5SDimitry Andric continue;
24730b57cec5SDimitry Andric
24740b57cec5SDimitry Andric // Prefer a constant on the right-hand side, or an Argument if no constants.
24750b57cec5SDimitry Andric if (isa<Constant>(LHS) || (isa<Argument>(LHS) && !isa<Constant>(RHS)))
24760b57cec5SDimitry Andric std::swap(LHS, RHS);
24770b57cec5SDimitry Andric assert((isa<Argument>(LHS) || isa<Instruction>(LHS)) && "Unexpected value!");
2478*0fca6ea1SDimitry Andric const DataLayout &DL =
2479*0fca6ea1SDimitry Andric isa<Argument>(LHS)
2480*0fca6ea1SDimitry Andric ? cast<Argument>(LHS)->getParent()->getDataLayout()
2481*0fca6ea1SDimitry Andric : cast<Instruction>(LHS)->getDataLayout();
24820b57cec5SDimitry Andric
24830b57cec5SDimitry Andric // If there is no obvious reason to prefer the left-hand side over the
24840b57cec5SDimitry Andric // right-hand side, ensure the longest lived term is on the right-hand side,
24850b57cec5SDimitry Andric // so the shortest lived term will be replaced by the longest lived.
24860b57cec5SDimitry Andric // This tends to expose more simplifications.
24870b57cec5SDimitry Andric uint32_t LVN = VN.lookupOrAdd(LHS);
24880b57cec5SDimitry Andric if ((isa<Argument>(LHS) && isa<Argument>(RHS)) ||
24890b57cec5SDimitry Andric (isa<Instruction>(LHS) && isa<Instruction>(RHS))) {
24900b57cec5SDimitry Andric // Move the 'oldest' value to the right-hand side, using the value number
24910b57cec5SDimitry Andric // as a proxy for age.
24920b57cec5SDimitry Andric uint32_t RVN = VN.lookupOrAdd(RHS);
24930b57cec5SDimitry Andric if (LVN < RVN) {
24940b57cec5SDimitry Andric std::swap(LHS, RHS);
24950b57cec5SDimitry Andric LVN = RVN;
24960b57cec5SDimitry Andric }
24970b57cec5SDimitry Andric }
24980b57cec5SDimitry Andric
24990b57cec5SDimitry Andric // If value numbering later sees that an instruction in the scope is equal
25000b57cec5SDimitry Andric // to 'LHS' then ensure it will be turned into 'RHS'. In order to preserve
25010b57cec5SDimitry Andric // the invariant that instructions only occur in the leader table for their
25020b57cec5SDimitry Andric // own value number (this is used by removeFromLeaderTable), do not do this
25030b57cec5SDimitry Andric // if RHS is an instruction (if an instruction in the scope is morphed into
25040b57cec5SDimitry Andric // LHS then it will be turned into RHS by the next GVN iteration anyway, so
25050b57cec5SDimitry Andric // using the leader table is about compiling faster, not optimizing better).
25060b57cec5SDimitry Andric // The leader table only tracks basic blocks, not edges. Only add to if we
25070b57cec5SDimitry Andric // have the simple case where the edge dominates the end.
2508*0fca6ea1SDimitry Andric if (RootDominatesEnd && !isa<Instruction>(RHS) &&
2509*0fca6ea1SDimitry Andric canReplacePointersIfEqual(LHS, RHS, DL))
2510*0fca6ea1SDimitry Andric LeaderTable.insert(LVN, RHS, Root.getEnd());
25110b57cec5SDimitry Andric
25120b57cec5SDimitry Andric // Replace all occurrences of 'LHS' with 'RHS' everywhere in the scope. As
25130b57cec5SDimitry Andric // LHS always has at least one use that is not dominated by Root, this will
25140b57cec5SDimitry Andric // never do anything if LHS has only one use.
25150b57cec5SDimitry Andric if (!LHS->hasOneUse()) {
2516*0fca6ea1SDimitry Andric // Create a callback that captures the DL.
2517*0fca6ea1SDimitry Andric auto canReplacePointersCallBack = [&DL](const Use &U, const Value *To) {
2518*0fca6ea1SDimitry Andric return canReplacePointersInUseIfEqual(U, To, DL);
2519*0fca6ea1SDimitry Andric };
25200b57cec5SDimitry Andric unsigned NumReplacements =
25210b57cec5SDimitry Andric DominatesByEdge
2522*0fca6ea1SDimitry Andric ? replaceDominatedUsesWithIf(LHS, RHS, *DT, Root,
2523*0fca6ea1SDimitry Andric canReplacePointersCallBack)
2524*0fca6ea1SDimitry Andric : replaceDominatedUsesWithIf(LHS, RHS, *DT, Root.getStart(),
2525*0fca6ea1SDimitry Andric canReplacePointersCallBack);
25260b57cec5SDimitry Andric
2527*0fca6ea1SDimitry Andric if (NumReplacements > 0) {
2528*0fca6ea1SDimitry Andric Changed = true;
25290b57cec5SDimitry Andric NumGVNEqProp += NumReplacements;
25300b57cec5SDimitry Andric // Cached information for anything that uses LHS will be invalid.
25310b57cec5SDimitry Andric if (MD)
25320b57cec5SDimitry Andric MD->invalidateCachedPointerInfo(LHS);
25330b57cec5SDimitry Andric }
2534*0fca6ea1SDimitry Andric }
25350b57cec5SDimitry Andric
25360b57cec5SDimitry Andric // Now try to deduce additional equalities from this one. For example, if
25370b57cec5SDimitry Andric // the known equality was "(A != B)" == "false" then it follows that A and B
25380b57cec5SDimitry Andric // are equal in the scope. Only boolean equalities with an explicit true or
25390b57cec5SDimitry Andric // false RHS are currently supported.
25400b57cec5SDimitry Andric if (!RHS->getType()->isIntegerTy(1))
25410b57cec5SDimitry Andric // Not a boolean equality - bail out.
25420b57cec5SDimitry Andric continue;
25430b57cec5SDimitry Andric ConstantInt *CI = dyn_cast<ConstantInt>(RHS);
25440b57cec5SDimitry Andric if (!CI)
25450b57cec5SDimitry Andric // RHS neither 'true' nor 'false' - bail out.
25460b57cec5SDimitry Andric continue;
25470b57cec5SDimitry Andric // Whether RHS equals 'true'. Otherwise it equals 'false'.
25480b57cec5SDimitry Andric bool isKnownTrue = CI->isMinusOne();
25490b57cec5SDimitry Andric bool isKnownFalse = !isKnownTrue;
25500b57cec5SDimitry Andric
25510b57cec5SDimitry Andric // If "A && B" is known true then both A and B are known true. If "A || B"
25520b57cec5SDimitry Andric // is known false then both A and B are known false.
25530b57cec5SDimitry Andric Value *A, *B;
2554e8d8bef9SDimitry Andric if ((isKnownTrue && match(LHS, m_LogicalAnd(m_Value(A), m_Value(B)))) ||
2555e8d8bef9SDimitry Andric (isKnownFalse && match(LHS, m_LogicalOr(m_Value(A), m_Value(B))))) {
25560b57cec5SDimitry Andric Worklist.push_back(std::make_pair(A, RHS));
25570b57cec5SDimitry Andric Worklist.push_back(std::make_pair(B, RHS));
25580b57cec5SDimitry Andric continue;
25590b57cec5SDimitry Andric }
25600b57cec5SDimitry Andric
25610b57cec5SDimitry Andric // If we are propagating an equality like "(A == B)" == "true" then also
25620b57cec5SDimitry Andric // propagate the equality A == B. When propagating a comparison such as
25630b57cec5SDimitry Andric // "(A >= B)" == "true", replace all instances of "A < B" with "false".
25640b57cec5SDimitry Andric if (CmpInst *Cmp = dyn_cast<CmpInst>(LHS)) {
25650b57cec5SDimitry Andric Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
25660b57cec5SDimitry Andric
25670b57cec5SDimitry Andric // If "A == B" is known true, or "A != B" is known false, then replace
2568480093f4SDimitry Andric // A with B everywhere in the scope. For floating point operations, we
2569480093f4SDimitry Andric // have to be careful since equality does not always imply equivalance.
2570480093f4SDimitry Andric if ((isKnownTrue && impliesEquivalanceIfTrue(Cmp)) ||
2571480093f4SDimitry Andric (isKnownFalse && impliesEquivalanceIfFalse(Cmp)))
25720b57cec5SDimitry Andric Worklist.push_back(std::make_pair(Op0, Op1));
25730b57cec5SDimitry Andric
25740b57cec5SDimitry Andric // If "A >= B" is known true, replace "A < B" with false everywhere.
25750b57cec5SDimitry Andric CmpInst::Predicate NotPred = Cmp->getInversePredicate();
25760b57cec5SDimitry Andric Constant *NotVal = ConstantInt::get(Cmp->getType(), isKnownFalse);
25770b57cec5SDimitry Andric // Since we don't have the instruction "A < B" immediately to hand, work
25780b57cec5SDimitry Andric // out the value number that it would have and use that to find an
25790b57cec5SDimitry Andric // appropriate instruction (if any).
25800b57cec5SDimitry Andric uint32_t NextNum = VN.getNextUnusedValueNumber();
25810b57cec5SDimitry Andric uint32_t Num = VN.lookupOrAddCmp(Cmp->getOpcode(), NotPred, Op0, Op1);
25820b57cec5SDimitry Andric // If the number we were assigned was brand new then there is no point in
25830b57cec5SDimitry Andric // looking for an instruction realizing it: there cannot be one!
25840b57cec5SDimitry Andric if (Num < NextNum) {
25850b57cec5SDimitry Andric Value *NotCmp = findLeader(Root.getEnd(), Num);
25860b57cec5SDimitry Andric if (NotCmp && isa<Instruction>(NotCmp)) {
25870b57cec5SDimitry Andric unsigned NumReplacements =
25880b57cec5SDimitry Andric DominatesByEdge
25890b57cec5SDimitry Andric ? replaceDominatedUsesWith(NotCmp, NotVal, *DT, Root)
25900b57cec5SDimitry Andric : replaceDominatedUsesWith(NotCmp, NotVal, *DT,
25910b57cec5SDimitry Andric Root.getStart());
25920b57cec5SDimitry Andric Changed |= NumReplacements > 0;
25930b57cec5SDimitry Andric NumGVNEqProp += NumReplacements;
25940b57cec5SDimitry Andric // Cached information for anything that uses NotCmp will be invalid.
25950b57cec5SDimitry Andric if (MD)
25960b57cec5SDimitry Andric MD->invalidateCachedPointerInfo(NotCmp);
25970b57cec5SDimitry Andric }
25980b57cec5SDimitry Andric }
25990b57cec5SDimitry Andric // Ensure that any instruction in scope that gets the "A < B" value number
26000b57cec5SDimitry Andric // is replaced with false.
26010b57cec5SDimitry Andric // The leader table only tracks basic blocks, not edges. Only add to if we
26020b57cec5SDimitry Andric // have the simple case where the edge dominates the end.
26030b57cec5SDimitry Andric if (RootDominatesEnd)
2604*0fca6ea1SDimitry Andric LeaderTable.insert(Num, NotVal, Root.getEnd());
26050b57cec5SDimitry Andric
26060b57cec5SDimitry Andric continue;
26070b57cec5SDimitry Andric }
26080b57cec5SDimitry Andric }
26090b57cec5SDimitry Andric
26100b57cec5SDimitry Andric return Changed;
26110b57cec5SDimitry Andric }
26120b57cec5SDimitry Andric
26130b57cec5SDimitry Andric /// When calculating availability, handle an instruction
26140b57cec5SDimitry Andric /// by inserting it into the appropriate sets
processInstruction(Instruction * I)2615349cc55cSDimitry Andric bool GVNPass::processInstruction(Instruction *I) {
26160b57cec5SDimitry Andric // Ignore dbg info intrinsics.
26170b57cec5SDimitry Andric if (isa<DbgInfoIntrinsic>(I))
26180b57cec5SDimitry Andric return false;
26190b57cec5SDimitry Andric
26200b57cec5SDimitry Andric // If the instruction can be easily simplified then do so now in preference
26210b57cec5SDimitry Andric // to value numbering it. Value numbering often exposes redundancies, for
26220b57cec5SDimitry Andric // example if it determines that %y is equal to %x then the instruction
26230b57cec5SDimitry Andric // "%z = and i32 %x, %y" becomes "%z = and i32 %x, %x" which we now simplify.
2624*0fca6ea1SDimitry Andric const DataLayout &DL = I->getDataLayout();
262581ad6265SDimitry Andric if (Value *V = simplifyInstruction(I, {DL, TLI, DT, AC})) {
26260b57cec5SDimitry Andric bool Changed = false;
26270b57cec5SDimitry Andric if (!I->use_empty()) {
2628fe6060f1SDimitry Andric // Simplification can cause a special instruction to become not special.
2629fe6060f1SDimitry Andric // For example, devirtualization to a willreturn function.
2630fe6060f1SDimitry Andric ICF->removeUsersOf(I);
26310b57cec5SDimitry Andric I->replaceAllUsesWith(V);
26320b57cec5SDimitry Andric Changed = true;
26330b57cec5SDimitry Andric }
26340b57cec5SDimitry Andric if (isInstructionTriviallyDead(I, TLI)) {
26350b57cec5SDimitry Andric markInstructionForDeletion(I);
26360b57cec5SDimitry Andric Changed = true;
26370b57cec5SDimitry Andric }
26380b57cec5SDimitry Andric if (Changed) {
26390b57cec5SDimitry Andric if (MD && V->getType()->isPtrOrPtrVectorTy())
26400b57cec5SDimitry Andric MD->invalidateCachedPointerInfo(V);
26410b57cec5SDimitry Andric ++NumGVNSimpl;
26420b57cec5SDimitry Andric return true;
26430b57cec5SDimitry Andric }
26440b57cec5SDimitry Andric }
26450b57cec5SDimitry Andric
2646fe6060f1SDimitry Andric if (auto *Assume = dyn_cast<AssumeInst>(I))
2647fe6060f1SDimitry Andric return processAssumeIntrinsic(Assume);
26480b57cec5SDimitry Andric
2649fe6060f1SDimitry Andric if (LoadInst *Load = dyn_cast<LoadInst>(I)) {
2650fe6060f1SDimitry Andric if (processLoad(Load))
26510b57cec5SDimitry Andric return true;
26520b57cec5SDimitry Andric
2653fe6060f1SDimitry Andric unsigned Num = VN.lookupOrAdd(Load);
2654*0fca6ea1SDimitry Andric LeaderTable.insert(Num, Load, Load->getParent());
26550b57cec5SDimitry Andric return false;
26560b57cec5SDimitry Andric }
26570b57cec5SDimitry Andric
26580b57cec5SDimitry Andric // For conditional branches, we can perform simple conditional propagation on
26590b57cec5SDimitry Andric // the condition value itself.
26600b57cec5SDimitry Andric if (BranchInst *BI = dyn_cast<BranchInst>(I)) {
26610b57cec5SDimitry Andric if (!BI->isConditional())
26620b57cec5SDimitry Andric return false;
26630b57cec5SDimitry Andric
26640b57cec5SDimitry Andric if (isa<Constant>(BI->getCondition()))
26650b57cec5SDimitry Andric return processFoldableCondBr(BI);
26660b57cec5SDimitry Andric
26670b57cec5SDimitry Andric Value *BranchCond = BI->getCondition();
26680b57cec5SDimitry Andric BasicBlock *TrueSucc = BI->getSuccessor(0);
26690b57cec5SDimitry Andric BasicBlock *FalseSucc = BI->getSuccessor(1);
26700b57cec5SDimitry Andric // Avoid multiple edges early.
26710b57cec5SDimitry Andric if (TrueSucc == FalseSucc)
26720b57cec5SDimitry Andric return false;
26730b57cec5SDimitry Andric
26740b57cec5SDimitry Andric BasicBlock *Parent = BI->getParent();
26750b57cec5SDimitry Andric bool Changed = false;
26760b57cec5SDimitry Andric
26770b57cec5SDimitry Andric Value *TrueVal = ConstantInt::getTrue(TrueSucc->getContext());
26780b57cec5SDimitry Andric BasicBlockEdge TrueE(Parent, TrueSucc);
26790b57cec5SDimitry Andric Changed |= propagateEquality(BranchCond, TrueVal, TrueE, true);
26800b57cec5SDimitry Andric
26810b57cec5SDimitry Andric Value *FalseVal = ConstantInt::getFalse(FalseSucc->getContext());
26820b57cec5SDimitry Andric BasicBlockEdge FalseE(Parent, FalseSucc);
26830b57cec5SDimitry Andric Changed |= propagateEquality(BranchCond, FalseVal, FalseE, true);
26840b57cec5SDimitry Andric
26850b57cec5SDimitry Andric return Changed;
26860b57cec5SDimitry Andric }
26870b57cec5SDimitry Andric
26880b57cec5SDimitry Andric // For switches, propagate the case values into the case destinations.
26890b57cec5SDimitry Andric if (SwitchInst *SI = dyn_cast<SwitchInst>(I)) {
26900b57cec5SDimitry Andric Value *SwitchCond = SI->getCondition();
26910b57cec5SDimitry Andric BasicBlock *Parent = SI->getParent();
26920b57cec5SDimitry Andric bool Changed = false;
26930b57cec5SDimitry Andric
26940b57cec5SDimitry Andric // Remember how many outgoing edges there are to every successor.
26950b57cec5SDimitry Andric SmallDenseMap<BasicBlock *, unsigned, 16> SwitchEdges;
2696*0fca6ea1SDimitry Andric for (BasicBlock *Succ : successors(Parent))
2697*0fca6ea1SDimitry Andric ++SwitchEdges[Succ];
26980b57cec5SDimitry Andric
26990b57cec5SDimitry Andric for (SwitchInst::CaseIt i = SI->case_begin(), e = SI->case_end();
27000b57cec5SDimitry Andric i != e; ++i) {
27010b57cec5SDimitry Andric BasicBlock *Dst = i->getCaseSuccessor();
27020b57cec5SDimitry Andric // If there is only a single edge, propagate the case value into it.
27030b57cec5SDimitry Andric if (SwitchEdges.lookup(Dst) == 1) {
27040b57cec5SDimitry Andric BasicBlockEdge E(Parent, Dst);
27050b57cec5SDimitry Andric Changed |= propagateEquality(SwitchCond, i->getCaseValue(), E, true);
27060b57cec5SDimitry Andric }
27070b57cec5SDimitry Andric }
27080b57cec5SDimitry Andric return Changed;
27090b57cec5SDimitry Andric }
27100b57cec5SDimitry Andric
27110b57cec5SDimitry Andric // Instructions with void type don't return a value, so there's
27120b57cec5SDimitry Andric // no point in trying to find redundancies in them.
27130b57cec5SDimitry Andric if (I->getType()->isVoidTy())
27140b57cec5SDimitry Andric return false;
27150b57cec5SDimitry Andric
27160b57cec5SDimitry Andric uint32_t NextNum = VN.getNextUnusedValueNumber();
27170b57cec5SDimitry Andric unsigned Num = VN.lookupOrAdd(I);
27180b57cec5SDimitry Andric
27190b57cec5SDimitry Andric // Allocations are always uniquely numbered, so we can save time and memory
27200b57cec5SDimitry Andric // by fast failing them.
27210b57cec5SDimitry Andric if (isa<AllocaInst>(I) || I->isTerminator() || isa<PHINode>(I)) {
2722*0fca6ea1SDimitry Andric LeaderTable.insert(Num, I, I->getParent());
27230b57cec5SDimitry Andric return false;
27240b57cec5SDimitry Andric }
27250b57cec5SDimitry Andric
27260b57cec5SDimitry Andric // If the number we were assigned was a brand new VN, then we don't
27270b57cec5SDimitry Andric // need to do a lookup to see if the number already exists
27280b57cec5SDimitry Andric // somewhere in the domtree: it can't!
27290b57cec5SDimitry Andric if (Num >= NextNum) {
2730*0fca6ea1SDimitry Andric LeaderTable.insert(Num, I, I->getParent());
27310b57cec5SDimitry Andric return false;
27320b57cec5SDimitry Andric }
27330b57cec5SDimitry Andric
27340b57cec5SDimitry Andric // Perform fast-path value-number based elimination of values inherited from
27350b57cec5SDimitry Andric // dominators.
27360b57cec5SDimitry Andric Value *Repl = findLeader(I->getParent(), Num);
27370b57cec5SDimitry Andric if (!Repl) {
27380b57cec5SDimitry Andric // Failure, just remember this instance for future use.
2739*0fca6ea1SDimitry Andric LeaderTable.insert(Num, I, I->getParent());
27400b57cec5SDimitry Andric return false;
274106c3fb27SDimitry Andric }
274206c3fb27SDimitry Andric
274306c3fb27SDimitry Andric if (Repl == I) {
27440b57cec5SDimitry Andric // If I was the result of a shortcut PRE, it might already be in the table
27450b57cec5SDimitry Andric // and the best replacement for itself. Nothing to do.
27460b57cec5SDimitry Andric return false;
27470b57cec5SDimitry Andric }
27480b57cec5SDimitry Andric
27490b57cec5SDimitry Andric // Remove it!
27500b57cec5SDimitry Andric patchAndReplaceAllUsesWith(I, Repl);
27510b57cec5SDimitry Andric if (MD && Repl->getType()->isPtrOrPtrVectorTy())
27520b57cec5SDimitry Andric MD->invalidateCachedPointerInfo(Repl);
27530b57cec5SDimitry Andric markInstructionForDeletion(I);
27540b57cec5SDimitry Andric return true;
27550b57cec5SDimitry Andric }
27560b57cec5SDimitry Andric
27570b57cec5SDimitry Andric /// runOnFunction - This is the main transformation entry point for a function.
runImpl(Function & F,AssumptionCache & RunAC,DominatorTree & RunDT,const TargetLibraryInfo & RunTLI,AAResults & RunAA,MemoryDependenceResults * RunMD,LoopInfo & LI,OptimizationRemarkEmitter * RunORE,MemorySSA * MSSA)2758349cc55cSDimitry Andric bool GVNPass::runImpl(Function &F, AssumptionCache &RunAC, DominatorTree &RunDT,
27590b57cec5SDimitry Andric const TargetLibraryInfo &RunTLI, AAResults &RunAA,
27605f757f3fSDimitry Andric MemoryDependenceResults *RunMD, LoopInfo &LI,
2761e8d8bef9SDimitry Andric OptimizationRemarkEmitter *RunORE, MemorySSA *MSSA) {
27620b57cec5SDimitry Andric AC = &RunAC;
27630b57cec5SDimitry Andric DT = &RunDT;
27640b57cec5SDimitry Andric VN.setDomTree(DT);
27650b57cec5SDimitry Andric TLI = &RunTLI;
27660b57cec5SDimitry Andric VN.setAliasAnalysis(&RunAA);
27670b57cec5SDimitry Andric MD = RunMD;
27685ffd83dbSDimitry Andric ImplicitControlFlowTracking ImplicitCFT;
27690b57cec5SDimitry Andric ICF = &ImplicitCFT;
27705f757f3fSDimitry Andric this->LI = &LI;
27710b57cec5SDimitry Andric VN.setMemDep(MD);
27720b57cec5SDimitry Andric ORE = RunORE;
27730b57cec5SDimitry Andric InvalidBlockRPONumbers = true;
2774e8d8bef9SDimitry Andric MemorySSAUpdater Updater(MSSA);
2775e8d8bef9SDimitry Andric MSSAU = MSSA ? &Updater : nullptr;
27760b57cec5SDimitry Andric
27770b57cec5SDimitry Andric bool Changed = false;
27780b57cec5SDimitry Andric bool ShouldContinue = true;
27790b57cec5SDimitry Andric
2780*0fca6ea1SDimitry Andric DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
27810b57cec5SDimitry Andric // Merge unconditional branches, allowing PRE to catch more
27820b57cec5SDimitry Andric // optimization opportunities.
2783349cc55cSDimitry Andric for (BasicBlock &BB : llvm::make_early_inc_range(F)) {
27845f757f3fSDimitry Andric bool removedBlock = MergeBlockIntoPredecessor(&BB, &DTU, &LI, MSSAU, MD);
27850b57cec5SDimitry Andric if (removedBlock)
27860b57cec5SDimitry Andric ++NumGVNBlocks;
27870b57cec5SDimitry Andric
27880b57cec5SDimitry Andric Changed |= removedBlock;
27890b57cec5SDimitry Andric }
2790*0fca6ea1SDimitry Andric DTU.flush();
27910b57cec5SDimitry Andric
27920b57cec5SDimitry Andric unsigned Iteration = 0;
27930b57cec5SDimitry Andric while (ShouldContinue) {
27940b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "GVN iteration: " << Iteration << "\n");
279581ad6265SDimitry Andric (void) Iteration;
27960b57cec5SDimitry Andric ShouldContinue = iterateOnFunction(F);
27970b57cec5SDimitry Andric Changed |= ShouldContinue;
27980b57cec5SDimitry Andric ++Iteration;
27990b57cec5SDimitry Andric }
28000b57cec5SDimitry Andric
28015ffd83dbSDimitry Andric if (isPREEnabled()) {
28020b57cec5SDimitry Andric // Fabricate val-num for dead-code in order to suppress assertion in
28030b57cec5SDimitry Andric // performPRE().
28040b57cec5SDimitry Andric assignValNumForDeadCode();
28050b57cec5SDimitry Andric bool PREChanged = true;
28060b57cec5SDimitry Andric while (PREChanged) {
28070b57cec5SDimitry Andric PREChanged = performPRE(F);
28080b57cec5SDimitry Andric Changed |= PREChanged;
28090b57cec5SDimitry Andric }
28100b57cec5SDimitry Andric }
28110b57cec5SDimitry Andric
28120b57cec5SDimitry Andric // FIXME: Should perform GVN again after PRE does something. PRE can move
28130b57cec5SDimitry Andric // computations into blocks where they become fully redundant. Note that
28140b57cec5SDimitry Andric // we can't do this until PRE's critical edge splitting updates memdep.
28150b57cec5SDimitry Andric // Actually, when this happens, we should just fully integrate PRE into GVN.
28160b57cec5SDimitry Andric
28170b57cec5SDimitry Andric cleanupGlobalSets();
28180b57cec5SDimitry Andric // Do not cleanup DeadBlocks in cleanupGlobalSets() as it's called for each
28190b57cec5SDimitry Andric // iteration.
28200b57cec5SDimitry Andric DeadBlocks.clear();
28210b57cec5SDimitry Andric
2822e8d8bef9SDimitry Andric if (MSSA && VerifyMemorySSA)
2823e8d8bef9SDimitry Andric MSSA->verifyMemorySSA();
2824e8d8bef9SDimitry Andric
28250b57cec5SDimitry Andric return Changed;
28260b57cec5SDimitry Andric }
28270b57cec5SDimitry Andric
processBlock(BasicBlock * BB)2828349cc55cSDimitry Andric bool GVNPass::processBlock(BasicBlock *BB) {
28290b57cec5SDimitry Andric // FIXME: Kill off InstrsToErase by doing erasing eagerly in a helper function
28300b57cec5SDimitry Andric // (and incrementing BI before processing an instruction).
28310b57cec5SDimitry Andric assert(InstrsToErase.empty() &&
28320b57cec5SDimitry Andric "We expect InstrsToErase to be empty across iterations");
28330b57cec5SDimitry Andric if (DeadBlocks.count(BB))
28340b57cec5SDimitry Andric return false;
28350b57cec5SDimitry Andric
28360b57cec5SDimitry Andric // Clearing map before every BB because it can be used only for single BB.
28378bcb0991SDimitry Andric ReplaceOperandsWithMap.clear();
28380b57cec5SDimitry Andric bool ChangedFunction = false;
28390b57cec5SDimitry Andric
2840fe6060f1SDimitry Andric // Since we may not have visited the input blocks of the phis, we can't
2841fe6060f1SDimitry Andric // use our normal hash approach for phis. Instead, simply look for
2842fe6060f1SDimitry Andric // obvious duplicates. The first pass of GVN will tend to create
2843fe6060f1SDimitry Andric // identical phis, and the second or later passes can eliminate them.
28444542f901SDimitry Andric SmallPtrSet<PHINode *, 8> PHINodesToRemove;
28454542f901SDimitry Andric ChangedFunction |= EliminateDuplicatePHINodes(BB, PHINodesToRemove);
28464542f901SDimitry Andric for (PHINode *PN : PHINodesToRemove) {
28474542f901SDimitry Andric VN.erase(PN);
28484542f901SDimitry Andric removeInstruction(PN);
28494542f901SDimitry Andric }
2850fe6060f1SDimitry Andric
28510b57cec5SDimitry Andric for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
28520b57cec5SDimitry Andric BI != BE;) {
28538bcb0991SDimitry Andric if (!ReplaceOperandsWithMap.empty())
28548bcb0991SDimitry Andric ChangedFunction |= replaceOperandsForInBlockEquality(&*BI);
28550b57cec5SDimitry Andric ChangedFunction |= processInstruction(&*BI);
28560b57cec5SDimitry Andric
28570b57cec5SDimitry Andric if (InstrsToErase.empty()) {
28580b57cec5SDimitry Andric ++BI;
28590b57cec5SDimitry Andric continue;
28600b57cec5SDimitry Andric }
28610b57cec5SDimitry Andric
28620b57cec5SDimitry Andric // If we need some instructions deleted, do it now.
28630b57cec5SDimitry Andric NumGVNInstr += InstrsToErase.size();
28640b57cec5SDimitry Andric
28650b57cec5SDimitry Andric // Avoid iterator invalidation.
28660b57cec5SDimitry Andric bool AtStart = BI == BB->begin();
28670b57cec5SDimitry Andric if (!AtStart)
28680b57cec5SDimitry Andric --BI;
28690b57cec5SDimitry Andric
28700b57cec5SDimitry Andric for (auto *I : InstrsToErase) {
28710b57cec5SDimitry Andric assert(I->getParent() == BB && "Removing instruction from wrong block?");
28720b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "GVN removed: " << *I << '\n');
28735ffd83dbSDimitry Andric salvageKnowledge(I, AC);
28740b57cec5SDimitry Andric salvageDebugInfo(*I);
287506c3fb27SDimitry Andric removeInstruction(I);
28760b57cec5SDimitry Andric }
28770b57cec5SDimitry Andric InstrsToErase.clear();
28780b57cec5SDimitry Andric
28790b57cec5SDimitry Andric if (AtStart)
28800b57cec5SDimitry Andric BI = BB->begin();
28810b57cec5SDimitry Andric else
28820b57cec5SDimitry Andric ++BI;
28830b57cec5SDimitry Andric }
28840b57cec5SDimitry Andric
28850b57cec5SDimitry Andric return ChangedFunction;
28860b57cec5SDimitry Andric }
28870b57cec5SDimitry Andric
28880b57cec5SDimitry Andric // Instantiate an expression in a predecessor that lacked it.
performScalarPREInsertion(Instruction * Instr,BasicBlock * Pred,BasicBlock * Curr,unsigned int ValNo)2889349cc55cSDimitry Andric bool GVNPass::performScalarPREInsertion(Instruction *Instr, BasicBlock *Pred,
28900b57cec5SDimitry Andric BasicBlock *Curr, unsigned int ValNo) {
28910b57cec5SDimitry Andric // Because we are going top-down through the block, all value numbers
28920b57cec5SDimitry Andric // will be available in the predecessor by the time we need them. Any
28930b57cec5SDimitry Andric // that weren't originally present will have been instantiated earlier
28940b57cec5SDimitry Andric // in this loop.
28950b57cec5SDimitry Andric bool success = true;
28960b57cec5SDimitry Andric for (unsigned i = 0, e = Instr->getNumOperands(); i != e; ++i) {
28970b57cec5SDimitry Andric Value *Op = Instr->getOperand(i);
28980b57cec5SDimitry Andric if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
28990b57cec5SDimitry Andric continue;
29000b57cec5SDimitry Andric // This could be a newly inserted instruction, in which case, we won't
29010b57cec5SDimitry Andric // find a value number, and should give up before we hurt ourselves.
29020b57cec5SDimitry Andric // FIXME: Rewrite the infrastructure to let it easier to value number
29030b57cec5SDimitry Andric // and process newly inserted instructions.
29040b57cec5SDimitry Andric if (!VN.exists(Op)) {
29050b57cec5SDimitry Andric success = false;
29060b57cec5SDimitry Andric break;
29070b57cec5SDimitry Andric }
29080b57cec5SDimitry Andric uint32_t TValNo =
29090b57cec5SDimitry Andric VN.phiTranslate(Pred, Curr, VN.lookup(Op), *this);
29100b57cec5SDimitry Andric if (Value *V = findLeader(Pred, TValNo)) {
29110b57cec5SDimitry Andric Instr->setOperand(i, V);
29120b57cec5SDimitry Andric } else {
29130b57cec5SDimitry Andric success = false;
29140b57cec5SDimitry Andric break;
29150b57cec5SDimitry Andric }
29160b57cec5SDimitry Andric }
29170b57cec5SDimitry Andric
29180b57cec5SDimitry Andric // Fail out if we encounter an operand that is not available in
29190b57cec5SDimitry Andric // the PRE predecessor. This is typically because of loads which
29200b57cec5SDimitry Andric // are not value numbered precisely.
29210b57cec5SDimitry Andric if (!success)
29220b57cec5SDimitry Andric return false;
29230b57cec5SDimitry Andric
29240b57cec5SDimitry Andric Instr->insertBefore(Pred->getTerminator());
29250b57cec5SDimitry Andric Instr->setName(Instr->getName() + ".pre");
29260b57cec5SDimitry Andric Instr->setDebugLoc(Instr->getDebugLoc());
29270b57cec5SDimitry Andric
2928fe6060f1SDimitry Andric ICF->insertInstructionTo(Instr, Pred);
2929fe6060f1SDimitry Andric
29300b57cec5SDimitry Andric unsigned Num = VN.lookupOrAdd(Instr);
29310b57cec5SDimitry Andric VN.add(Instr, Num);
29320b57cec5SDimitry Andric
29330b57cec5SDimitry Andric // Update the availability map to include the new instruction.
2934*0fca6ea1SDimitry Andric LeaderTable.insert(Num, Instr, Pred);
29350b57cec5SDimitry Andric return true;
29360b57cec5SDimitry Andric }
29370b57cec5SDimitry Andric
performScalarPRE(Instruction * CurInst)2938349cc55cSDimitry Andric bool GVNPass::performScalarPRE(Instruction *CurInst) {
29390b57cec5SDimitry Andric if (isa<AllocaInst>(CurInst) || CurInst->isTerminator() ||
29400b57cec5SDimitry Andric isa<PHINode>(CurInst) || CurInst->getType()->isVoidTy() ||
29410b57cec5SDimitry Andric CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
29420b57cec5SDimitry Andric isa<DbgInfoIntrinsic>(CurInst))
29430b57cec5SDimitry Andric return false;
29440b57cec5SDimitry Andric
29450b57cec5SDimitry Andric // Don't do PRE on compares. The PHI would prevent CodeGenPrepare from
29460b57cec5SDimitry Andric // sinking the compare again, and it would force the code generator to
29470b57cec5SDimitry Andric // move the i1 from processor flags or predicate registers into a general
29480b57cec5SDimitry Andric // purpose register.
29490b57cec5SDimitry Andric if (isa<CmpInst>(CurInst))
29500b57cec5SDimitry Andric return false;
29510b57cec5SDimitry Andric
29520b57cec5SDimitry Andric // Don't do PRE on GEPs. The inserted PHI would prevent CodeGenPrepare from
29530b57cec5SDimitry Andric // sinking the addressing mode computation back to its uses. Extending the
29540b57cec5SDimitry Andric // GEP's live range increases the register pressure, and therefore it can
29550b57cec5SDimitry Andric // introduce unnecessary spills.
29560b57cec5SDimitry Andric //
29570b57cec5SDimitry Andric // This doesn't prevent Load PRE. PHI translation will make the GEP available
29580b57cec5SDimitry Andric // to the load by moving it to the predecessor block if necessary.
29590b57cec5SDimitry Andric if (isa<GetElementPtrInst>(CurInst))
29600b57cec5SDimitry Andric return false;
29610b57cec5SDimitry Andric
2962e8d8bef9SDimitry Andric if (auto *CallB = dyn_cast<CallBase>(CurInst)) {
29630b57cec5SDimitry Andric // We don't currently value number ANY inline asm calls.
29640b57cec5SDimitry Andric if (CallB->isInlineAsm())
29650b57cec5SDimitry Andric return false;
2966e8d8bef9SDimitry Andric }
29670b57cec5SDimitry Andric
29680b57cec5SDimitry Andric uint32_t ValNo = VN.lookup(CurInst);
29690b57cec5SDimitry Andric
29700b57cec5SDimitry Andric // Look for the predecessors for PRE opportunities. We're
29710b57cec5SDimitry Andric // only trying to solve the basic diamond case, where
29720b57cec5SDimitry Andric // a value is computed in the successor and one predecessor,
29730b57cec5SDimitry Andric // but not the other. We also explicitly disallow cases
29740b57cec5SDimitry Andric // where the successor is its own predecessor, because they're
29750b57cec5SDimitry Andric // more complicated to get right.
29760b57cec5SDimitry Andric unsigned NumWith = 0;
29770b57cec5SDimitry Andric unsigned NumWithout = 0;
29780b57cec5SDimitry Andric BasicBlock *PREPred = nullptr;
29790b57cec5SDimitry Andric BasicBlock *CurrentBlock = CurInst->getParent();
29800b57cec5SDimitry Andric
29810b57cec5SDimitry Andric // Update the RPO numbers for this function.
29820b57cec5SDimitry Andric if (InvalidBlockRPONumbers)
29830b57cec5SDimitry Andric assignBlockRPONumber(*CurrentBlock->getParent());
29840b57cec5SDimitry Andric
29850b57cec5SDimitry Andric SmallVector<std::pair<Value *, BasicBlock *>, 8> predMap;
29860b57cec5SDimitry Andric for (BasicBlock *P : predecessors(CurrentBlock)) {
29870b57cec5SDimitry Andric // We're not interested in PRE where blocks with predecessors that are
29880b57cec5SDimitry Andric // not reachable.
29890b57cec5SDimitry Andric if (!DT->isReachableFromEntry(P)) {
29900b57cec5SDimitry Andric NumWithout = 2;
29910b57cec5SDimitry Andric break;
29920b57cec5SDimitry Andric }
2993bdd1243dSDimitry Andric // It is not safe to do PRE when P->CurrentBlock is a loop backedge.
29940b57cec5SDimitry Andric assert(BlockRPONumber.count(P) && BlockRPONumber.count(CurrentBlock) &&
29950b57cec5SDimitry Andric "Invalid BlockRPONumber map.");
2996bdd1243dSDimitry Andric if (BlockRPONumber[P] >= BlockRPONumber[CurrentBlock]) {
29970b57cec5SDimitry Andric NumWithout = 2;
29980b57cec5SDimitry Andric break;
29990b57cec5SDimitry Andric }
30000b57cec5SDimitry Andric
30010b57cec5SDimitry Andric uint32_t TValNo = VN.phiTranslate(P, CurrentBlock, ValNo, *this);
30020b57cec5SDimitry Andric Value *predV = findLeader(P, TValNo);
30030b57cec5SDimitry Andric if (!predV) {
30040b57cec5SDimitry Andric predMap.push_back(std::make_pair(static_cast<Value *>(nullptr), P));
30050b57cec5SDimitry Andric PREPred = P;
30060b57cec5SDimitry Andric ++NumWithout;
30070b57cec5SDimitry Andric } else if (predV == CurInst) {
30080b57cec5SDimitry Andric /* CurInst dominates this predecessor. */
30090b57cec5SDimitry Andric NumWithout = 2;
30100b57cec5SDimitry Andric break;
30110b57cec5SDimitry Andric } else {
30120b57cec5SDimitry Andric predMap.push_back(std::make_pair(predV, P));
30130b57cec5SDimitry Andric ++NumWith;
30140b57cec5SDimitry Andric }
30150b57cec5SDimitry Andric }
30160b57cec5SDimitry Andric
30170b57cec5SDimitry Andric // Don't do PRE when it might increase code size, i.e. when
30180b57cec5SDimitry Andric // we would need to insert instructions in more than one pred.
30190b57cec5SDimitry Andric if (NumWithout > 1 || NumWith == 0)
30200b57cec5SDimitry Andric return false;
30210b57cec5SDimitry Andric
30220b57cec5SDimitry Andric // We may have a case where all predecessors have the instruction,
30230b57cec5SDimitry Andric // and we just need to insert a phi node. Otherwise, perform
30240b57cec5SDimitry Andric // insertion.
30250b57cec5SDimitry Andric Instruction *PREInstr = nullptr;
30260b57cec5SDimitry Andric
30270b57cec5SDimitry Andric if (NumWithout != 0) {
30280b57cec5SDimitry Andric if (!isSafeToSpeculativelyExecute(CurInst)) {
30290b57cec5SDimitry Andric // It is only valid to insert a new instruction if the current instruction
30300b57cec5SDimitry Andric // is always executed. An instruction with implicit control flow could
30310b57cec5SDimitry Andric // prevent us from doing it. If we cannot speculate the execution, then
30320b57cec5SDimitry Andric // PRE should be prohibited.
30330b57cec5SDimitry Andric if (ICF->isDominatedByICFIFromSameBlock(CurInst))
30340b57cec5SDimitry Andric return false;
30350b57cec5SDimitry Andric }
30360b57cec5SDimitry Andric
30370b57cec5SDimitry Andric // Don't do PRE across indirect branch.
30380b57cec5SDimitry Andric if (isa<IndirectBrInst>(PREPred->getTerminator()))
30390b57cec5SDimitry Andric return false;
30400b57cec5SDimitry Andric
30410b57cec5SDimitry Andric // We can't do PRE safely on a critical edge, so instead we schedule
30420b57cec5SDimitry Andric // the edge to be split and perform the PRE the next time we iterate
30430b57cec5SDimitry Andric // on the function.
30440b57cec5SDimitry Andric unsigned SuccNum = GetSuccessorNumber(PREPred, CurrentBlock);
30450b57cec5SDimitry Andric if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
30460b57cec5SDimitry Andric toSplit.push_back(std::make_pair(PREPred->getTerminator(), SuccNum));
30470b57cec5SDimitry Andric return false;
30480b57cec5SDimitry Andric }
30490b57cec5SDimitry Andric // We need to insert somewhere, so let's give it a shot
30500b57cec5SDimitry Andric PREInstr = CurInst->clone();
30510b57cec5SDimitry Andric if (!performScalarPREInsertion(PREInstr, PREPred, CurrentBlock, ValNo)) {
30520b57cec5SDimitry Andric // If we failed insertion, make sure we remove the instruction.
305306c3fb27SDimitry Andric #ifndef NDEBUG
305406c3fb27SDimitry Andric verifyRemoved(PREInstr);
305506c3fb27SDimitry Andric #endif
30560b57cec5SDimitry Andric PREInstr->deleteValue();
30570b57cec5SDimitry Andric return false;
30580b57cec5SDimitry Andric }
30590b57cec5SDimitry Andric }
30600b57cec5SDimitry Andric
30610b57cec5SDimitry Andric // Either we should have filled in the PRE instruction, or we should
30620b57cec5SDimitry Andric // not have needed insertions.
30630b57cec5SDimitry Andric assert(PREInstr != nullptr || NumWithout == 0);
30640b57cec5SDimitry Andric
30650b57cec5SDimitry Andric ++NumGVNPRE;
30660b57cec5SDimitry Andric
30670b57cec5SDimitry Andric // Create a PHI to make the value available in this block.
30685f757f3fSDimitry Andric PHINode *Phi = PHINode::Create(CurInst->getType(), predMap.size(),
30695f757f3fSDimitry Andric CurInst->getName() + ".pre-phi");
30705f757f3fSDimitry Andric Phi->insertBefore(CurrentBlock->begin());
30710b57cec5SDimitry Andric for (unsigned i = 0, e = predMap.size(); i != e; ++i) {
30720b57cec5SDimitry Andric if (Value *V = predMap[i].first) {
30730b57cec5SDimitry Andric // If we use an existing value in this phi, we have to patch the original
30740b57cec5SDimitry Andric // value because the phi will be used to replace a later value.
30750b57cec5SDimitry Andric patchReplacementInstruction(CurInst, V);
30760b57cec5SDimitry Andric Phi->addIncoming(V, predMap[i].second);
30770b57cec5SDimitry Andric } else
30780b57cec5SDimitry Andric Phi->addIncoming(PREInstr, PREPred);
30790b57cec5SDimitry Andric }
30800b57cec5SDimitry Andric
30810b57cec5SDimitry Andric VN.add(Phi, ValNo);
30820b57cec5SDimitry Andric // After creating a new PHI for ValNo, the phi translate result for ValNo will
30830b57cec5SDimitry Andric // be changed, so erase the related stale entries in phi translate cache.
30840b57cec5SDimitry Andric VN.eraseTranslateCacheEntry(ValNo, *CurrentBlock);
3085*0fca6ea1SDimitry Andric LeaderTable.insert(ValNo, Phi, CurrentBlock);
30860b57cec5SDimitry Andric Phi->setDebugLoc(CurInst->getDebugLoc());
30870b57cec5SDimitry Andric CurInst->replaceAllUsesWith(Phi);
30880b57cec5SDimitry Andric if (MD && Phi->getType()->isPtrOrPtrVectorTy())
30890b57cec5SDimitry Andric MD->invalidateCachedPointerInfo(Phi);
30900b57cec5SDimitry Andric VN.erase(CurInst);
3091*0fca6ea1SDimitry Andric LeaderTable.erase(ValNo, CurInst, CurrentBlock);
30920b57cec5SDimitry Andric
30930b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "GVN PRE removed: " << *CurInst << '\n');
309406c3fb27SDimitry Andric removeInstruction(CurInst);
30950b57cec5SDimitry Andric ++NumGVNInstr;
30960b57cec5SDimitry Andric
30970b57cec5SDimitry Andric return true;
30980b57cec5SDimitry Andric }
30990b57cec5SDimitry Andric
31000b57cec5SDimitry Andric /// Perform a purely local form of PRE that looks for diamond
31010b57cec5SDimitry Andric /// control flow patterns and attempts to perform simple PRE at the join point.
performPRE(Function & F)3102349cc55cSDimitry Andric bool GVNPass::performPRE(Function &F) {
31030b57cec5SDimitry Andric bool Changed = false;
31040b57cec5SDimitry Andric for (BasicBlock *CurrentBlock : depth_first(&F.getEntryBlock())) {
31050b57cec5SDimitry Andric // Nothing to PRE in the entry block.
31060b57cec5SDimitry Andric if (CurrentBlock == &F.getEntryBlock())
31070b57cec5SDimitry Andric continue;
31080b57cec5SDimitry Andric
31090b57cec5SDimitry Andric // Don't perform PRE on an EH pad.
31100b57cec5SDimitry Andric if (CurrentBlock->isEHPad())
31110b57cec5SDimitry Andric continue;
31120b57cec5SDimitry Andric
31130b57cec5SDimitry Andric for (BasicBlock::iterator BI = CurrentBlock->begin(),
31140b57cec5SDimitry Andric BE = CurrentBlock->end();
31150b57cec5SDimitry Andric BI != BE;) {
31160b57cec5SDimitry Andric Instruction *CurInst = &*BI++;
31170b57cec5SDimitry Andric Changed |= performScalarPRE(CurInst);
31180b57cec5SDimitry Andric }
31190b57cec5SDimitry Andric }
31200b57cec5SDimitry Andric
31210b57cec5SDimitry Andric if (splitCriticalEdges())
31220b57cec5SDimitry Andric Changed = true;
31230b57cec5SDimitry Andric
31240b57cec5SDimitry Andric return Changed;
31250b57cec5SDimitry Andric }
31260b57cec5SDimitry Andric
31270b57cec5SDimitry Andric /// Split the critical edge connecting the given two blocks, and return
31280b57cec5SDimitry Andric /// the block inserted to the critical edge.
splitCriticalEdges(BasicBlock * Pred,BasicBlock * Succ)3129349cc55cSDimitry Andric BasicBlock *GVNPass::splitCriticalEdges(BasicBlock *Pred, BasicBlock *Succ) {
31305ffd83dbSDimitry Andric // GVN does not require loop-simplify, do not try to preserve it if it is not
31315ffd83dbSDimitry Andric // possible.
31325ffd83dbSDimitry Andric BasicBlock *BB = SplitCriticalEdge(
31335ffd83dbSDimitry Andric Pred, Succ,
3134e8d8bef9SDimitry Andric CriticalEdgeSplittingOptions(DT, LI, MSSAU).unsetPreserveLoopSimplify());
3135e8d8bef9SDimitry Andric if (BB) {
31360b57cec5SDimitry Andric if (MD)
31370b57cec5SDimitry Andric MD->invalidateCachedPredecessors();
31380b57cec5SDimitry Andric InvalidBlockRPONumbers = true;
3139e8d8bef9SDimitry Andric }
31400b57cec5SDimitry Andric return BB;
31410b57cec5SDimitry Andric }
31420b57cec5SDimitry Andric
31430b57cec5SDimitry Andric /// Split critical edges found during the previous
31440b57cec5SDimitry Andric /// iteration that may enable further optimization.
splitCriticalEdges()3145349cc55cSDimitry Andric bool GVNPass::splitCriticalEdges() {
31460b57cec5SDimitry Andric if (toSplit.empty())
31470b57cec5SDimitry Andric return false;
3148e8d8bef9SDimitry Andric
3149e8d8bef9SDimitry Andric bool Changed = false;
31500b57cec5SDimitry Andric do {
31510b57cec5SDimitry Andric std::pair<Instruction *, unsigned> Edge = toSplit.pop_back_val();
3152e8d8bef9SDimitry Andric Changed |= SplitCriticalEdge(Edge.first, Edge.second,
3153e8d8bef9SDimitry Andric CriticalEdgeSplittingOptions(DT, LI, MSSAU)) !=
3154e8d8bef9SDimitry Andric nullptr;
31550b57cec5SDimitry Andric } while (!toSplit.empty());
3156e8d8bef9SDimitry Andric if (Changed) {
3157e8d8bef9SDimitry Andric if (MD)
3158e8d8bef9SDimitry Andric MD->invalidateCachedPredecessors();
31590b57cec5SDimitry Andric InvalidBlockRPONumbers = true;
3160e8d8bef9SDimitry Andric }
3161e8d8bef9SDimitry Andric return Changed;
31620b57cec5SDimitry Andric }
31630b57cec5SDimitry Andric
31640b57cec5SDimitry Andric /// Executes one iteration of GVN
iterateOnFunction(Function & F)3165349cc55cSDimitry Andric bool GVNPass::iterateOnFunction(Function &F) {
31660b57cec5SDimitry Andric cleanupGlobalSets();
31670b57cec5SDimitry Andric
31680b57cec5SDimitry Andric // Top-down walk of the dominator tree
31690b57cec5SDimitry Andric bool Changed = false;
31700b57cec5SDimitry Andric // Needed for value numbering with phi construction to work.
31710b57cec5SDimitry Andric // RPOT walks the graph in its constructor and will not be invalidated during
31720b57cec5SDimitry Andric // processBlock.
31730b57cec5SDimitry Andric ReversePostOrderTraversal<Function *> RPOT(&F);
31740b57cec5SDimitry Andric
31750b57cec5SDimitry Andric for (BasicBlock *BB : RPOT)
31760b57cec5SDimitry Andric Changed |= processBlock(BB);
31770b57cec5SDimitry Andric
31780b57cec5SDimitry Andric return Changed;
31790b57cec5SDimitry Andric }
31800b57cec5SDimitry Andric
cleanupGlobalSets()3181349cc55cSDimitry Andric void GVNPass::cleanupGlobalSets() {
31820b57cec5SDimitry Andric VN.clear();
31830b57cec5SDimitry Andric LeaderTable.clear();
31840b57cec5SDimitry Andric BlockRPONumber.clear();
31850b57cec5SDimitry Andric ICF->clear();
31860b57cec5SDimitry Andric InvalidBlockRPONumbers = true;
31870b57cec5SDimitry Andric }
31880b57cec5SDimitry Andric
removeInstruction(Instruction * I)318906c3fb27SDimitry Andric void GVNPass::removeInstruction(Instruction *I) {
319006c3fb27SDimitry Andric if (MD) MD->removeInstruction(I);
319106c3fb27SDimitry Andric if (MSSAU)
319206c3fb27SDimitry Andric MSSAU->removeMemoryAccess(I);
319306c3fb27SDimitry Andric #ifndef NDEBUG
319406c3fb27SDimitry Andric verifyRemoved(I);
319506c3fb27SDimitry Andric #endif
319606c3fb27SDimitry Andric ICF->removeInstruction(I);
319706c3fb27SDimitry Andric I->eraseFromParent();
319806c3fb27SDimitry Andric }
319906c3fb27SDimitry Andric
32000b57cec5SDimitry Andric /// Verify that the specified instruction does not occur in our
32010b57cec5SDimitry Andric /// internal data structures.
verifyRemoved(const Instruction * Inst) const3202349cc55cSDimitry Andric void GVNPass::verifyRemoved(const Instruction *Inst) const {
32030b57cec5SDimitry Andric VN.verifyRemoved(Inst);
3204*0fca6ea1SDimitry Andric LeaderTable.verifyRemoved(Inst);
32050b57cec5SDimitry Andric }
32060b57cec5SDimitry Andric
32070b57cec5SDimitry Andric /// BB is declared dead, which implied other blocks become dead as well. This
32080b57cec5SDimitry Andric /// function is to add all these blocks to "DeadBlocks". For the dead blocks'
32090b57cec5SDimitry Andric /// live successors, update their phi nodes by replacing the operands
32100b57cec5SDimitry Andric /// corresponding to dead blocks with UndefVal.
addDeadBlock(BasicBlock * BB)3211349cc55cSDimitry Andric void GVNPass::addDeadBlock(BasicBlock *BB) {
32120b57cec5SDimitry Andric SmallVector<BasicBlock *, 4> NewDead;
32130b57cec5SDimitry Andric SmallSetVector<BasicBlock *, 4> DF;
32140b57cec5SDimitry Andric
32150b57cec5SDimitry Andric NewDead.push_back(BB);
32160b57cec5SDimitry Andric while (!NewDead.empty()) {
32170b57cec5SDimitry Andric BasicBlock *D = NewDead.pop_back_val();
32180b57cec5SDimitry Andric if (DeadBlocks.count(D))
32190b57cec5SDimitry Andric continue;
32200b57cec5SDimitry Andric
32210b57cec5SDimitry Andric // All blocks dominated by D are dead.
32220b57cec5SDimitry Andric SmallVector<BasicBlock *, 8> Dom;
32230b57cec5SDimitry Andric DT->getDescendants(D, Dom);
32240b57cec5SDimitry Andric DeadBlocks.insert(Dom.begin(), Dom.end());
32250b57cec5SDimitry Andric
32260b57cec5SDimitry Andric // Figure out the dominance-frontier(D).
32270b57cec5SDimitry Andric for (BasicBlock *B : Dom) {
32280b57cec5SDimitry Andric for (BasicBlock *S : successors(B)) {
32290b57cec5SDimitry Andric if (DeadBlocks.count(S))
32300b57cec5SDimitry Andric continue;
32310b57cec5SDimitry Andric
32320b57cec5SDimitry Andric bool AllPredDead = true;
32330b57cec5SDimitry Andric for (BasicBlock *P : predecessors(S))
32340b57cec5SDimitry Andric if (!DeadBlocks.count(P)) {
32350b57cec5SDimitry Andric AllPredDead = false;
32360b57cec5SDimitry Andric break;
32370b57cec5SDimitry Andric }
32380b57cec5SDimitry Andric
32390b57cec5SDimitry Andric if (!AllPredDead) {
32400b57cec5SDimitry Andric // S could be proved dead later on. That is why we don't update phi
32410b57cec5SDimitry Andric // operands at this moment.
32420b57cec5SDimitry Andric DF.insert(S);
32430b57cec5SDimitry Andric } else {
32440b57cec5SDimitry Andric // While S is not dominated by D, it is dead by now. This could take
32450b57cec5SDimitry Andric // place if S already have a dead predecessor before D is declared
32460b57cec5SDimitry Andric // dead.
32470b57cec5SDimitry Andric NewDead.push_back(S);
32480b57cec5SDimitry Andric }
32490b57cec5SDimitry Andric }
32500b57cec5SDimitry Andric }
32510b57cec5SDimitry Andric }
32520b57cec5SDimitry Andric
32530b57cec5SDimitry Andric // For the dead blocks' live successors, update their phi nodes by replacing
32540b57cec5SDimitry Andric // the operands corresponding to dead blocks with UndefVal.
3255fe6060f1SDimitry Andric for (BasicBlock *B : DF) {
32560b57cec5SDimitry Andric if (DeadBlocks.count(B))
32570b57cec5SDimitry Andric continue;
32580b57cec5SDimitry Andric
32598bcb0991SDimitry Andric // First, split the critical edges. This might also create additional blocks
32608bcb0991SDimitry Andric // to preserve LoopSimplify form and adjust edges accordingly.
3261e8d8bef9SDimitry Andric SmallVector<BasicBlock *, 4> Preds(predecessors(B));
32620b57cec5SDimitry Andric for (BasicBlock *P : Preds) {
32630b57cec5SDimitry Andric if (!DeadBlocks.count(P))
32640b57cec5SDimitry Andric continue;
32650b57cec5SDimitry Andric
3266e8d8bef9SDimitry Andric if (llvm::is_contained(successors(P), B) &&
32678bcb0991SDimitry Andric isCriticalEdge(P->getTerminator(), B)) {
32680b57cec5SDimitry Andric if (BasicBlock *S = splitCriticalEdges(P, B))
32690b57cec5SDimitry Andric DeadBlocks.insert(P = S);
32700b57cec5SDimitry Andric }
32718bcb0991SDimitry Andric }
32720b57cec5SDimitry Andric
327304eeddc0SDimitry Andric // Now poison the incoming values from the dead predecessors.
32748bcb0991SDimitry Andric for (BasicBlock *P : predecessors(B)) {
32758bcb0991SDimitry Andric if (!DeadBlocks.count(P))
32768bcb0991SDimitry Andric continue;
32778bcb0991SDimitry Andric for (PHINode &Phi : B->phis()) {
327804eeddc0SDimitry Andric Phi.setIncomingValueForBlock(P, PoisonValue::get(Phi.getType()));
32790b57cec5SDimitry Andric if (MD)
32800b57cec5SDimitry Andric MD->invalidateCachedPointerInfo(&Phi);
32810b57cec5SDimitry Andric }
32820b57cec5SDimitry Andric }
32830b57cec5SDimitry Andric }
32840b57cec5SDimitry Andric }
32850b57cec5SDimitry Andric
32860b57cec5SDimitry Andric // If the given branch is recognized as a foldable branch (i.e. conditional
32870b57cec5SDimitry Andric // branch with constant condition), it will perform following analyses and
32880b57cec5SDimitry Andric // transformation.
32890b57cec5SDimitry Andric // 1) If the dead out-coming edge is a critical-edge, split it. Let
32900b57cec5SDimitry Andric // R be the target of the dead out-coming edge.
32910b57cec5SDimitry Andric // 1) Identify the set of dead blocks implied by the branch's dead outcoming
32920b57cec5SDimitry Andric // edge. The result of this step will be {X| X is dominated by R}
32930b57cec5SDimitry Andric // 2) Identify those blocks which haves at least one dead predecessor. The
32940b57cec5SDimitry Andric // result of this step will be dominance-frontier(R).
32950b57cec5SDimitry Andric // 3) Update the PHIs in DF(R) by replacing the operands corresponding to
32960b57cec5SDimitry Andric // dead blocks with "UndefVal" in an hope these PHIs will optimized away.
32970b57cec5SDimitry Andric //
32980b57cec5SDimitry Andric // Return true iff *NEW* dead code are found.
processFoldableCondBr(BranchInst * BI)3299349cc55cSDimitry Andric bool GVNPass::processFoldableCondBr(BranchInst *BI) {
33000b57cec5SDimitry Andric if (!BI || BI->isUnconditional())
33010b57cec5SDimitry Andric return false;
33020b57cec5SDimitry Andric
33030b57cec5SDimitry Andric // If a branch has two identical successors, we cannot declare either dead.
33040b57cec5SDimitry Andric if (BI->getSuccessor(0) == BI->getSuccessor(1))
33050b57cec5SDimitry Andric return false;
33060b57cec5SDimitry Andric
33070b57cec5SDimitry Andric ConstantInt *Cond = dyn_cast<ConstantInt>(BI->getCondition());
33080b57cec5SDimitry Andric if (!Cond)
33090b57cec5SDimitry Andric return false;
33100b57cec5SDimitry Andric
33110b57cec5SDimitry Andric BasicBlock *DeadRoot =
33120b57cec5SDimitry Andric Cond->getZExtValue() ? BI->getSuccessor(1) : BI->getSuccessor(0);
33130b57cec5SDimitry Andric if (DeadBlocks.count(DeadRoot))
33140b57cec5SDimitry Andric return false;
33150b57cec5SDimitry Andric
33160b57cec5SDimitry Andric if (!DeadRoot->getSinglePredecessor())
33170b57cec5SDimitry Andric DeadRoot = splitCriticalEdges(BI->getParent(), DeadRoot);
33180b57cec5SDimitry Andric
33190b57cec5SDimitry Andric addDeadBlock(DeadRoot);
33200b57cec5SDimitry Andric return true;
33210b57cec5SDimitry Andric }
33220b57cec5SDimitry Andric
33230b57cec5SDimitry Andric // performPRE() will trigger assert if it comes across an instruction without
33240b57cec5SDimitry Andric // associated val-num. As it normally has far more live instructions than dead
33250b57cec5SDimitry Andric // instructions, it makes more sense just to "fabricate" a val-number for the
33260b57cec5SDimitry Andric // dead code than checking if instruction involved is dead or not.
assignValNumForDeadCode()3327349cc55cSDimitry Andric void GVNPass::assignValNumForDeadCode() {
33280b57cec5SDimitry Andric for (BasicBlock *BB : DeadBlocks) {
33290b57cec5SDimitry Andric for (Instruction &Inst : *BB) {
33300b57cec5SDimitry Andric unsigned ValNum = VN.lookupOrAdd(&Inst);
3331*0fca6ea1SDimitry Andric LeaderTable.insert(ValNum, &Inst, BB);
33320b57cec5SDimitry Andric }
33330b57cec5SDimitry Andric }
33340b57cec5SDimitry Andric }
33350b57cec5SDimitry Andric
33360b57cec5SDimitry Andric class llvm::gvn::GVNLegacyPass : public FunctionPass {
33370b57cec5SDimitry Andric public:
33380b57cec5SDimitry Andric static char ID; // Pass identification, replacement for typeid
33390b57cec5SDimitry Andric
GVNLegacyPass(bool NoMemDepAnalysis=!GVNEnableMemDep)33405ffd83dbSDimitry Andric explicit GVNLegacyPass(bool NoMemDepAnalysis = !GVNEnableMemDep)
33415ffd83dbSDimitry Andric : FunctionPass(ID), Impl(GVNOptions().setMemDep(!NoMemDepAnalysis)) {
33420b57cec5SDimitry Andric initializeGVNLegacyPassPass(*PassRegistry::getPassRegistry());
33430b57cec5SDimitry Andric }
33440b57cec5SDimitry Andric
runOnFunction(Function & F)33450b57cec5SDimitry Andric bool runOnFunction(Function &F) override {
33460b57cec5SDimitry Andric if (skipFunction(F))
33470b57cec5SDimitry Andric return false;
33480b57cec5SDimitry Andric
3349e8d8bef9SDimitry Andric auto *MSSAWP = getAnalysisIfAvailable<MemorySSAWrapperPass>();
33500b57cec5SDimitry Andric return Impl.runImpl(
33510b57cec5SDimitry Andric F, getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F),
33520b57cec5SDimitry Andric getAnalysis<DominatorTreeWrapperPass>().getDomTree(),
33538bcb0991SDimitry Andric getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F),
33540b57cec5SDimitry Andric getAnalysis<AAResultsWrapperPass>().getAAResults(),
33555ffd83dbSDimitry Andric Impl.isMemDepEnabled()
33565ffd83dbSDimitry Andric ? &getAnalysis<MemoryDependenceWrapperPass>().getMemDep()
33575ffd83dbSDimitry Andric : nullptr,
33585f757f3fSDimitry Andric getAnalysis<LoopInfoWrapperPass>().getLoopInfo(),
3359e8d8bef9SDimitry Andric &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE(),
3360e8d8bef9SDimitry Andric MSSAWP ? &MSSAWP->getMSSA() : nullptr);
33610b57cec5SDimitry Andric }
33620b57cec5SDimitry Andric
getAnalysisUsage(AnalysisUsage & AU) const33630b57cec5SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override {
33640b57cec5SDimitry Andric AU.addRequired<AssumptionCacheTracker>();
33650b57cec5SDimitry Andric AU.addRequired<DominatorTreeWrapperPass>();
33660b57cec5SDimitry Andric AU.addRequired<TargetLibraryInfoWrapperPass>();
33678bcb0991SDimitry Andric AU.addRequired<LoopInfoWrapperPass>();
33685ffd83dbSDimitry Andric if (Impl.isMemDepEnabled())
33690b57cec5SDimitry Andric AU.addRequired<MemoryDependenceWrapperPass>();
33700b57cec5SDimitry Andric AU.addRequired<AAResultsWrapperPass>();
33710b57cec5SDimitry Andric AU.addPreserved<DominatorTreeWrapperPass>();
33720b57cec5SDimitry Andric AU.addPreserved<GlobalsAAWrapperPass>();
33730b57cec5SDimitry Andric AU.addPreserved<TargetLibraryInfoWrapperPass>();
33748bcb0991SDimitry Andric AU.addPreserved<LoopInfoWrapperPass>();
33750b57cec5SDimitry Andric AU.addRequired<OptimizationRemarkEmitterWrapperPass>();
3376e8d8bef9SDimitry Andric AU.addPreserved<MemorySSAWrapperPass>();
33770b57cec5SDimitry Andric }
33780b57cec5SDimitry Andric
33790b57cec5SDimitry Andric private:
3380349cc55cSDimitry Andric GVNPass Impl;
33810b57cec5SDimitry Andric };
33820b57cec5SDimitry Andric
33830b57cec5SDimitry Andric char GVNLegacyPass::ID = 0;
33840b57cec5SDimitry Andric
33850b57cec5SDimitry Andric INITIALIZE_PASS_BEGIN(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)33860b57cec5SDimitry Andric INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
33870b57cec5SDimitry Andric INITIALIZE_PASS_DEPENDENCY(MemoryDependenceWrapperPass)
33880b57cec5SDimitry Andric INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
33890b57cec5SDimitry Andric INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
33900b57cec5SDimitry Andric INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
33910b57cec5SDimitry Andric INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)
33920b57cec5SDimitry Andric INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass)
33930b57cec5SDimitry Andric INITIALIZE_PASS_END(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
33940b57cec5SDimitry Andric
33950b57cec5SDimitry Andric // The public interface to this file...
33960b57cec5SDimitry Andric FunctionPass *llvm::createGVNPass(bool NoMemDepAnalysis) {
33970b57cec5SDimitry Andric return new GVNLegacyPass(NoMemDepAnalysis);
33980b57cec5SDimitry Andric }
3399