[llvm] r288046 - [GVN] Basic optimization remark support

Adam Nemet via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 30 18:16:23 PST 2016


This got reverted in the meantime because it was causing a transient stage2 LTO clang build failure.  Since then I diagnosed the issue, see https://reviews.llvm.org/D27288 <https://reviews.llvm.org/D27288>

Adam

> On Nov 30, 2016, at 5:52 PM, Rafael EspĂ­ndola <rafael.espindola at gmail.com> wrote:
> 
> 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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161130/dfe8f807/attachment.html>


More information about the llvm-commits mailing list