[llvm] r288046 - [GVN] Basic optimization remark support
Rafael EspĂndola via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 30 17:52:24 PST 2016
somehow with this change I am getting
Assertion failed: !NodePtr->isKnownSentinel()
Any idea what might be wrong? I will try to get a reduced testcase.
Cheers,
Rafael
On 29 November 2016 at 02:45, Adam Nemet via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: anemet
> Date: Mon Nov 28 11:45:28 2016
> New Revision: 288046
>
> URL: http://llvm.org/viewvc/llvm-project?rev=288046&view=rev
> Log:
> [GVN] Basic optimization remark support
>
> Follow-on patches will add more interesting cases.
>
> The goal of this patch-set is to get the GVN messages printed in
> opt-viewer from Dhrystone as was presented in my Dev Meeting talk. This
> is the optimization view for the function (the last remark in the
> function has a bug which is fixed in this series):
> http://lab.llvm.org:8080/artifacts/opt-view_test-suite/build/SingleSource/Benchmarks/Dhrystone/CMakeFiles/dry.dir/html/_org_test-suite_SingleSource_Benchmarks_Dhrystone_dry.c.html#L430
>
> Differential Revision: https://reviews.llvm.org/D26488
>
> Added:
> llvm/trunk/test/Transforms/GVN/opt-remarks.ll
> Modified:
> llvm/trunk/include/llvm/IR/DiagnosticInfo.h
> llvm/trunk/include/llvm/Transforms/Scalar/GVN.h
> llvm/trunk/lib/IR/DiagnosticInfo.cpp
> llvm/trunk/lib/Transforms/Scalar/GVN.cpp
>
> Modified: llvm/trunk/include/llvm/IR/DiagnosticInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DiagnosticInfo.h?rev=288046&r1=288045&r2=288046&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/DiagnosticInfo.h (original)
> +++ llvm/trunk/include/llvm/IR/DiagnosticInfo.h Mon Nov 28 11:45:28 2016
> @@ -392,6 +392,7 @@ public:
>
> explicit Argument(StringRef Str = "") : Key("String"), Val(Str) {}
> Argument(StringRef Key, Value *V);
> + Argument(StringRef Key, Type *T);
> Argument(StringRef Key, int N);
> Argument(StringRef Key, unsigned N);
> Argument(StringRef Key, bool B) : Key(Key), Val(B ? "true" : "false") {}
>
> Modified: llvm/trunk/include/llvm/Transforms/Scalar/GVN.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/GVN.h?rev=288046&r1=288045&r2=288046&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Scalar/GVN.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Scalar/GVN.h Mon Nov 28 11:45:28 2016
> @@ -28,6 +28,7 @@
> #include "llvm/IR/PassManager.h"
>
> namespace llvm {
> +class OptimizationRemarkEmitter;
>
> /// A private "module" namespace for types and utilities used by GVN. These
> /// are implementation details and should not be used by clients.
> @@ -109,6 +110,7 @@ private:
> const TargetLibraryInfo *TLI;
> AssumptionCache *AC;
> SetVector<BasicBlock *> DeadBlocks;
> + OptimizationRemarkEmitter *ORE;
>
> ValueTable VN;
>
> @@ -134,7 +136,7 @@ private:
>
> bool runImpl(Function &F, AssumptionCache &RunAC, DominatorTree &RunDT,
> const TargetLibraryInfo &RunTLI, AAResults &RunAA,
> - MemoryDependenceResults *RunMD);
> + MemoryDependenceResults *RunMD, OptimizationRemarkEmitter *ORE);
>
> /// Push a new Value to the LeaderTable onto the list for its value number.
> void addToLeaderTable(uint32_t N, Value *V, const BasicBlock *BB) {
>
> Modified: llvm/trunk/lib/IR/DiagnosticInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DiagnosticInfo.cpp?rev=288046&r1=288045&r2=288046&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/DiagnosticInfo.cpp (original)
> +++ llvm/trunk/lib/IR/DiagnosticInfo.cpp Mon Nov 28 11:45:28 2016
> @@ -180,6 +180,12 @@ DiagnosticInfoOptimizationBase::Argument
> DLoc = I->getDebugLoc();
> }
>
> +DiagnosticInfoOptimizationBase::Argument::Argument(StringRef Key, Type *T)
> + : Key(Key) {
> + raw_string_ostream OS(Val);
> + OS << *T;
> +}
> +
> DiagnosticInfoOptimizationBase::Argument::Argument(StringRef Key, int N)
> : Key(Key), Val(itostr(N)) {}
>
>
> Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=288046&r1=288045&r2=288046&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Mon Nov 28 11:45:28 2016
> @@ -33,6 +33,7 @@
> #include "llvm/Analysis/Loads.h"
> #include "llvm/Analysis/MemoryBuiltins.h"
> #include "llvm/Analysis/MemoryDependenceAnalysis.h"
> +#include "llvm/Analysis/OptimizationDiagnosticInfo.h"
> #include "llvm/Analysis/PHITransAddr.h"
> #include "llvm/Analysis/TargetLibraryInfo.h"
> #include "llvm/Analysis/ValueTracking.h"
> @@ -586,7 +587,8 @@ PreservedAnalyses GVN::run(Function &F,
> auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
> auto &AA = AM.getResult<AAManager>(F);
> auto &MemDep = AM.getResult<MemoryDependenceAnalysis>(F);
> - bool Changed = runImpl(F, AC, DT, TLI, AA, &MemDep);
> + auto &ORE = AM.getResult<OptimizationRemarkEmitterAnalysis>(F);
> + bool Changed = runImpl(F, AC, DT, TLI, AA, &MemDep, &ORE);
> if (!Changed)
> return PreservedAnalyses::all();
> PreservedAnalyses PA;
> @@ -1582,10 +1584,18 @@ bool GVN::PerformLoadPRE(LoadInst *LI, A
> if (V->getType()->getScalarType()->isPointerTy())
> MD->invalidateCachedPointerInfo(V);
> markInstructionForDeletion(LI);
> + ORE->emit(OptimizationRemark(DEBUG_TYPE, "LoadPRE", LI)
> + << "load eliminated by PRE");
> ++NumPRELoad;
> return true;
> }
>
> +static void reportLoadElim(LoadInst *LI, OptimizationRemarkEmitter *ORE) {
> + ORE->emit(OptimizationRemark(DEBUG_TYPE, "LoadElim", LI)
> + << "load of type " << ore::NV("Type", LI->getType())
> + << " eliminated");
> +}
> +
> /// Attempt to eliminate a load whose dependencies are
> /// non-local by performing PHI construction.
> bool GVN::processNonLocalLoad(LoadInst *LI) {
> @@ -1656,6 +1666,7 @@ bool GVN::processNonLocalLoad(LoadInst *
> MD->invalidateCachedPointerInfo(V);
> markInstructionForDeletion(LI);
> ++NumGVNLoad;
> + reportLoadElim(LI, ORE);
> return true;
> }
>
> @@ -1802,6 +1813,7 @@ bool GVN::processLoad(LoadInst *L) {
> patchAndReplaceAllUsesWith(L, AvailableValue);
> markInstructionForDeletion(L);
> ++NumGVNLoad;
> + reportLoadElim(L, ORE);
> // Tell MDA to rexamine the reused pointer since we might have more
> // information after forwarding it.
> if (MD && AvailableValue->getType()->getScalarType()->isPointerTy())
> @@ -2179,7 +2191,8 @@ bool GVN::processInstruction(Instruction
> /// runOnFunction - This is the main transformation entry point for a function.
> bool GVN::runImpl(Function &F, AssumptionCache &RunAC, DominatorTree &RunDT,
> const TargetLibraryInfo &RunTLI, AAResults &RunAA,
> - MemoryDependenceResults *RunMD) {
> + MemoryDependenceResults *RunMD,
> + OptimizationRemarkEmitter *RunORE) {
> AC = &RunAC;
> DT = &RunDT;
> VN.setDomTree(DT);
> @@ -2187,6 +2200,7 @@ bool GVN::runImpl(Function &F, Assumptio
> VN.setAliasAnalysis(&RunAA);
> MD = RunMD;
> VN.setMemDep(MD);
> + ORE = RunORE;
>
> bool Changed = false;
> bool ShouldContinue = true;
> @@ -2699,7 +2713,8 @@ public:
> getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(),
> getAnalysis<AAResultsWrapperPass>().getAAResults(),
> NoLoads ? nullptr
> - : &getAnalysis<MemoryDependenceWrapperPass>().getMemDep());
> + : &getAnalysis<MemoryDependenceWrapperPass>().getMemDep(),
> + &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE());
> }
>
> void getAnalysisUsage(AnalysisUsage &AU) const override {
> @@ -2712,6 +2727,7 @@ public:
>
> AU.addPreserved<DominatorTreeWrapperPass>();
> AU.addPreserved<GlobalsAAWrapperPass>();
> + AU.addRequired<OptimizationRemarkEmitterWrapperPass>();
> }
>
> private:
> @@ -2733,4 +2749,5 @@ INITIALIZE_PASS_DEPENDENCY(DominatorTree
> INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
> INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
> INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)
> +INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass)
> INITIALIZE_PASS_END(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
>
> Added: llvm/trunk/test/Transforms/GVN/opt-remarks.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/opt-remarks.ll?rev=288046&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/GVN/opt-remarks.ll (added)
> +++ llvm/trunk/test/Transforms/GVN/opt-remarks.ll Mon Nov 28 11:45:28 2016
> @@ -0,0 +1,59 @@
> +; RUN: opt < %s -gvn -o /dev/null -pass-remarks-output=%t -S -pass-remarks=gvn \
> +; RUN: 2>&1 | FileCheck %s
> +; RUN: cat %t | FileCheck -check-prefix=YAML %s
> +
> +; CHECK: remark: <unknown>:0:0: load of type i32 eliminated{{$}}
> +; CHECK-NEXT: remark: <unknown>:0:0: load of type i32 eliminated{{$}}
> +; CHECK-NEXT: remark: <unknown>:0:0: load of type i32 eliminated{{$}}
> +; CHECK-NOT: remark:
> +
> +; YAML: --- !Passed
> +; YAML-NEXT: Pass: gvn
> +; YAML-NEXT: Name: LoadElim
> +; YAML-NEXT: Function: arg
> +; YAML-NEXT: Args:
> +; YAML-NEXT: - String: 'load of type '
> +; YAML-NEXT: - Type: i32
> +; YAML-NEXT: - String: ' eliminated'
> +; YAML-NEXT: ...
> +; YAML-NEXT: --- !Passed
> +; YAML-NEXT: Pass: gvn
> +; YAML-NEXT: Name: LoadElim
> +; YAML-NEXT: Function: const
> +; YAML-NEXT: Args:
> +; YAML-NEXT: - String: 'load of type '
> +; YAML-NEXT: - Type: i32
> +; YAML-NEXT: - String: ' eliminated'
> +; YAML-NEXT: ...
> +; YAML-NEXT: --- !Passed
> +; YAML-NEXT: Pass: gvn
> +; YAML-NEXT: Name: LoadElim
> +; YAML-NEXT: Function: inst
> +; YAML-NEXT: Args:
> +; YAML-NEXT: - String: 'load of type '
> +; YAML-NEXT: - Type: i32
> +; YAML-NEXT: - String: ' eliminated'
> +; YAML-NEXT: ...
> +
> +
> +define i32 @arg(i32* %p, i32 %i) {
> +entry:
> + store i32 %i, i32* %p
> + %load = load i32, i32* %p
> + ret i32 %load
> +}
> +
> +define i32 @const(i32* %p) {
> +entry:
> + store i32 4, i32* %p
> + %load = load i32, i32* %p
> + ret i32 %load
> +}
> +
> +define i32 @inst(i32* %p) {
> +entry:
> + %load1 = load i32, i32* %p
> + %load = load i32, i32* %p
> + %add = add i32 %load1, %load
> + ret i32 %add
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list