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