Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
Revert r337904: [IPSCCP] Use PredicateInfo to propagate facts from cm…
Browse files Browse the repository at this point in the history
…p instructions.

I suspect it is causing the clang-stage2-Rthinlto failures.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337956 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
fhahn committed Jul 25, 2018
1 parent 4ed456c commit 95ba981
Show file tree
Hide file tree
Showing 8 changed files with 15 additions and 161 deletions.
6 changes: 1 addition & 5 deletions include/llvm/Transforms/Scalar/SCCP.h
Expand Up @@ -21,13 +21,11 @@
#ifndef LLVM_TRANSFORMS_SCALAR_SCCP_H
#define LLVM_TRANSFORMS_SCALAR_SCCP_H

#include "llvm/ADT/STLExtras.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Transforms/Utils/PredicateInfo.h"

namespace llvm {

Expand All @@ -39,9 +37,7 @@ class SCCPPass : public PassInfoMixin<SCCPPass> {
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
};

bool runIPSCCP(
Module &M, const DataLayout &DL, const TargetLibraryInfo *TLI,
function_ref<std::unique_ptr<PredicateInfo>(Function &)> getPredicateInfo);
bool runIPSCCP(Module &M, const DataLayout &DL, const TargetLibraryInfo *TLI);
} // end namespace llvm

#endif // LLVM_TRANSFORMS_SCALAR_SCCP_H
24 changes: 2 additions & 22 deletions lib/Transforms/IPO/SCCP.cpp
@@ -1,5 +1,4 @@
#include "llvm/Transforms/IPO/SCCP.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Scalar/SCCP.h"
Expand All @@ -9,15 +8,7 @@ using namespace llvm;
PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) {
const DataLayout &DL = M.getDataLayout();
auto &TLI = AM.getResult<TargetLibraryAnalysis>(M);
auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
auto getPredicateInfo =
[&FAM](Function &F) -> std::unique_ptr<PredicateInfo> {
return make_unique<PredicateInfo>(F,
FAM.getResult<DominatorTreeAnalysis>(F),
FAM.getResult<AssumptionAnalysis>(F));
};

if (!runIPSCCP(M, DL, &TLI, getPredicateInfo))
if (!runIPSCCP(M, DL, &TLI))
return PreservedAnalyses::all();
return PreservedAnalyses::none();
}
Expand All @@ -43,20 +34,10 @@ class IPSCCPLegacyPass : public ModulePass {
const DataLayout &DL = M.getDataLayout();
const TargetLibraryInfo *TLI =
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();

auto getPredicateInfo =
[this](Function &F) -> std::unique_ptr<PredicateInfo> {
return make_unique<PredicateInfo>(
F, this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree(),
this->getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F));
};

return runIPSCCP(M, DL, TLI, getPredicateInfo);
return runIPSCCP(M, DL, TLI);
}

void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<AssumptionCacheTracker>();
AU.addRequired<DominatorTreeWrapperPass>();
AU.addRequired<TargetLibraryInfoWrapperPass>();
}
};
Expand All @@ -68,7 +49,6 @@ char IPSCCPLegacyPass::ID = 0;
INITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp",
"Interprocedural Sparse Conditional Constant Propagation",
false, false)
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
INITIALIZE_PASS_END(IPSCCPLegacyPass, "ipsccp",
"Interprocedural Sparse Conditional Constant Propagation",
Expand Down
126 changes: 8 additions & 118 deletions lib/Transforms/Scalar/SCCP.cpp
Expand Up @@ -55,7 +55,6 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Utils/PredicateInfo.h"
#include <cassert>
#include <utility>
#include <vector>
Expand Down Expand Up @@ -247,21 +246,7 @@ class SCCPSolver : public InstVisitor<SCCPSolver> {
using Edge = std::pair<BasicBlock *, BasicBlock *>;
DenseSet<Edge> KnownFeasibleEdges;

DenseMap<Function *, std::unique_ptr<PredicateInfo>> PredInfos;
DenseMap<Value *, SmallPtrSet<User *, 2>> AdditionalUsers;

public:
void addPredInfo(Function &F, std::unique_ptr<PredicateInfo> PI) {
PredInfos[&F] = std::move(PI);
}

const PredicateBase *getPredicateInfoFor(Instruction *I) {
auto PI = PredInfos.find(I->getFunction());
if (PI == PredInfos.end())
return nullptr;
return PI->second->getPredicateInfoFor(I);
}

SCCPSolver(const DataLayout &DL, const TargetLibraryInfo *tli)
: DL(DL), TLI(tli) {}

Expand Down Expand Up @@ -573,26 +558,6 @@ class SCCPSolver : public InstVisitor<SCCPSolver> {
visit(*I);
}

// Add U as additional user of V.
void addAdditionalUser(Value *V, User *U) {
auto Iter = AdditionalUsers.insert({V, {}});
Iter.first->second.insert(U);
}

// Mark I's users as changed, including AdditionalUsers.
void markUsersAsChanged(Value *I) {
for (User *U : I->users())
if (auto *UI = dyn_cast<Instruction>(U))
OperandChangedState(UI);

auto Iter = AdditionalUsers.find(I);
if (Iter != AdditionalUsers.end()) {
for (User *U : Iter->second)
if (auto *UI = dyn_cast<Instruction>(U))
OperandChangedState(UI);
}
}

private:
friend class InstVisitor<SCCPSolver>;

Expand Down Expand Up @@ -1154,65 +1119,6 @@ void SCCPSolver::visitCallSite(CallSite CS) {
Function *F = CS.getCalledFunction();
Instruction *I = CS.getInstruction();

if (auto *II = dyn_cast<IntrinsicInst>(I)) {
if (II->getIntrinsicID() == Intrinsic::ssa_copy) {
if (ValueState[I].isOverdefined())
return;

auto *PI = getPredicateInfoFor(I);
if (!PI)
return;

auto *PBranch = dyn_cast<PredicateBranch>(getPredicateInfoFor(I));
if (!PBranch) {
mergeInValue(ValueState[I], I, getValueState(PI->OriginalOp));
return;
}

Value *CopyOf = I->getOperand(0);
Value *Cond = PBranch->Condition;

// Everything below relies on the condition being a comparison.
auto *Cmp = dyn_cast<CmpInst>(Cond);
if (!Cmp) {
mergeInValue(ValueState[I], I, getValueState(PI->OriginalOp));
return;
}

Value *CmpOp0 = Cmp->getOperand(0);
Value *CmpOp1 = Cmp->getOperand(1);
if (CopyOf != CmpOp0 && CopyOf != CmpOp1) {
mergeInValue(ValueState[I], I, getValueState(PI->OriginalOp));
return;
}

if (CmpOp0 != CopyOf)
std::swap(CmpOp0, CmpOp1);

LatticeVal OriginalVal = getValueState(CopyOf);
LatticeVal EqVal = getValueState(CmpOp1);
LatticeVal &IV = ValueState[I];
if (PBranch->TrueEdge && Cmp->getPredicate() == CmpInst::ICMP_EQ) {
addAdditionalUser(CmpOp1, I);
if (OriginalVal.isConstant())
mergeInValue(IV, I, OriginalVal);
else
mergeInValue(IV, I, EqVal);
return;
}
if (!PBranch->TrueEdge && Cmp->getPredicate() == CmpInst::ICMP_NE) {
addAdditionalUser(CmpOp1, I);
if (OriginalVal.isConstant())
mergeInValue(IV, I, OriginalVal);
else
mergeInValue(IV, I, EqVal);
return;
}

return (void)mergeInValue(IV, I, getValueState(PBranch->OriginalOp));
}
}

// The common case is that we aren't tracking the callee, either because we
// are not doing interprocedural analysis or the callee is indirect, or is
// external. Handle these cases first.
Expand Down Expand Up @@ -1332,7 +1238,9 @@ void SCCPSolver::Solve() {
// since all of its users will have already been marked as overdefined
// Update all of the users of this instruction's value.
//
markUsersAsChanged(I);
for (User *U : I->users())
if (auto *UI = dyn_cast<Instruction>(U))
OperandChangedState(UI);
}

// Process the instruction work list.
Expand All @@ -1349,7 +1257,9 @@ void SCCPSolver::Solve() {
// Update all of the users of this instruction's value.
//
if (I->getType()->isStructTy() || !getValueState(I).isOverdefined())
markUsersAsChanged(I);
for (User *U : I->users())
if (auto *UI = dyn_cast<Instruction>(U))
OperandChangedState(UI);
}

// Process the basic block work list.
Expand Down Expand Up @@ -1888,9 +1798,8 @@ static void findReturnsToZap(Function &F,
}
}

bool llvm::runIPSCCP(
Module &M, const DataLayout &DL, const TargetLibraryInfo *TLI,
function_ref<std::unique_ptr<PredicateInfo>(Function &)> getPredicateInfo) {
bool llvm::runIPSCCP(Module &M, const DataLayout &DL,
const TargetLibraryInfo *TLI) {
SCCPSolver Solver(DL, TLI);

// Loop over all functions, marking arguments to those with their addresses
Expand All @@ -1899,7 +1808,6 @@ bool llvm::runIPSCCP(
if (F.isDeclaration())
continue;

Solver.addPredInfo(F, getPredicateInfo(F));
// Determine if we can track the function's return values. If so, add the
// function to the solver's set of return-tracked functions.
if (canTrackReturnsInterprocedurally(&F))
Expand Down Expand Up @@ -2052,24 +1960,6 @@ bool llvm::runIPSCCP(
F.getBasicBlockList().erase(DeadBB);
}
BlocksToErase.clear();

for (BasicBlock &BB : F) {
for (BasicBlock::iterator BI = BB.begin(), E = BB.end(); BI != E;) {
Instruction *Inst = &*BI++;
if (const PredicateBase *PI = Solver.getPredicateInfoFor(Inst)) {
if (auto *II = dyn_cast<IntrinsicInst>(Inst)) {
if (II->getIntrinsicID() == Intrinsic::ssa_copy) {
Value *Op = II->getOperand(0);
Inst->replaceAllUsesWith(Op);
Inst->eraseFromParent();
continue;
}
}
Inst->replaceAllUsesWith(PI->OriginalOp);
Inst->eraseFromParent();
}
}
}
}

// If we inferred constant or undef return values for a function, we replaced
Expand Down
4 changes: 2 additions & 2 deletions test/Other/new-pm-lto-defaults.ll
Expand Up @@ -41,8 +41,6 @@
; CHECK-O2-NEXT: Running analysis: ProfileSummaryAnalysis
; CHECK-O2-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
; CHECK-O2-NEXT: Running pass: IPSCCPPass
; CHECK-O2-DAG: Running analysis: AssumptionAnalysis on foo
; CHECK-O2-DAG: Running analysis: DominatorTreeAnalysis on foo
; CHECK-O2-NEXT: Running pass: CalledValuePropagationPass
; CHECK-O-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}PostOrderFunctionAttrsPass>
; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}SCC
Expand All @@ -59,6 +57,8 @@
; CHECK-O1-NEXT: Running pass: LowerTypeTestsPass
; CHECK-O2-NEXT: Running pass: GlobalOptPass
; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PromotePass>
; CHECK-O2-NEXT: Running analysis: DominatorTreeAnalysis
; CHECK-O2-NEXT: Running analysis: AssumptionAnalysis
; CHECK-O2-NEXT: Running pass: ConstantMergePass
; CHECK-O2-NEXT: Running pass: DeadArgumentEliminationPass
; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}>
Expand Down
4 changes: 0 additions & 4 deletions test/Other/opt-O2-pipeline.ll
Expand Up @@ -28,7 +28,6 @@
; CHECK-NEXT: Force set function attributes
; CHECK-NEXT: Infer set function attributes
; CHECK-NEXT: Interprocedural Sparse Conditional Constant Propagation
; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
; CHECK-NEXT: Called Value Propagation
; CHECK-NEXT: Global Variable Optimizer
; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
Expand Down Expand Up @@ -271,9 +270,6 @@
; CHECK-NEXT: Module Verifier
; CHECK-NEXT: Bitcode Writer
; CHECK-NEXT: Pass Arguments:
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Dominator Tree Construction
; CHECK-NEXT: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Dominator Tree Construction
Expand Down
4 changes: 0 additions & 4 deletions test/Other/opt-O3-pipeline.ll
Expand Up @@ -30,7 +30,6 @@
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Call-site splitting
; CHECK-NEXT: Interprocedural Sparse Conditional Constant Propagation
; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
; CHECK-NEXT: Called Value Propagation
; CHECK-NEXT: Global Variable Optimizer
; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
Expand Down Expand Up @@ -275,9 +274,6 @@
; CHECK-NEXT: Module Verifier
; CHECK-NEXT: Bitcode Writer
; CHECK-NEXT: Pass Arguments:
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Dominator Tree Construction
; CHECK-NEXT: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Dominator Tree Construction
Expand Down
4 changes: 0 additions & 4 deletions test/Other/opt-Os-pipeline.ll
Expand Up @@ -28,7 +28,6 @@
; CHECK-NEXT: Force set function attributes
; CHECK-NEXT: Infer set function attributes
; CHECK-NEXT: Interprocedural Sparse Conditional Constant Propagation
; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
; CHECK-NEXT: Called Value Propagation
; CHECK-NEXT: Global Variable Optimizer
; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
Expand Down Expand Up @@ -258,9 +257,6 @@
; CHECK-NEXT: Module Verifier
; CHECK-NEXT: Bitcode Writer
; CHECK-NEXT: Pass Arguments:
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Dominator Tree Construction
; CHECK-NEXT: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Dominator Tree Construction
Expand Down
4 changes: 2 additions & 2 deletions test/Transforms/IPConstantProp/musttail-call.ll
Expand Up @@ -9,7 +9,7 @@ define i8* @start(i8 %v) {
%c1 = icmp eq i8 %v, 0
br i1 %c1, label %true, label %false
true:
; CHECK: %ca = musttail call i8* @side_effects(i8 0)
; CHECK: %ca = musttail call i8* @side_effects(i8 %v)
; CHECK: ret i8* %ca
%ca = musttail call i8* @side_effects(i8 %v)
ret i8* %ca
Expand All @@ -34,7 +34,7 @@ define internal i8* @side_effects(i8 %v) {
; is always `null`.
; The call can't be removed due to `external` call above, though.

; CHECK: %ca = musttail call i8* @start(i8 0)
; CHECK: %ca = musttail call i8* @start(i8 %v)
%ca = musttail call i8* @start(i8 %v)

; Thus the result must be returned anyway
Expand Down

0 comments on commit 95ba981

Please sign in to comment.