<div dir="ltr">Hi again, Please ignore my previous email. <div>I realized that the stage 2 error happened because of your original commit, and this commit fixed it.</div><div>Thanks,</div><div>Alex</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 25 July 2018 at 15:28, Alex L <span dir="ltr"><<a href="mailto:arphaman@gmail.com" target="_blank">arphaman@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,<div><br></div><div>I believe this commit has started causing a Clang assertion failure when building stage2 with ThinLTO:</div><div><br></div><div><div>[3249/3397] : && /Users/buildslave/jenkins/<wbr>workspace/clang-stage2-<wbr>Rthinlto/host-compiler/bin/<wbr>clang++  -fno-stack-protector -fno-common -Wno-profile-instr-unprofiled -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-<wbr>availability-new -std=c++11 -fmodules -fmodules-cache-path=/Users/<wbr>buildslave/jenkins/workspace/<wbr>clang-stage2-Rthinlto/clang-<wbr>build/Build/module.cache -fcxx-modules -gmodules -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fdiagnostics-color -flto=thin -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O2 -g -DNDEBUG -Wl,-search_paths_first -Wl,-headerpad_max_install_<wbr>names -flto=thin -Wl,-cache_path_lto,/Users/<wbr>buildslave/jenkins/workspace/<wbr>clang-stage2-Rthinlto/clang-<wbr>build/Build/lto.cache    -Wl,-dead_strip -Wl,-object_path_lto,/Users/<wbr>buildslave/jenkins/workspace/<wbr>clang-stage2-Rthinlto/clang-<wbr>build/Build/tools/clang/tools/<wbr>clang-format/./clang-format-<wbr>lto.o tools/clang/tools/clang-<wbr>format/CMakeFiles/clang-<wbr>format.dir/ClangFormat.cpp.o  -o bin/clang-format  -Wl,-rpath,@loader_path/../<wbr>lib lib/libLLVMSupport.a lib/libclangBasic.a lib/libclangFormat.a lib/libclangRewrite.a lib/libclangToolingCore.a lib/libclangToolingInclusions.<wbr>a lib/libclangToolingCore.a lib/libclangRewrite.a lib/libclangAST.a lib/libclangLex.a lib/libclangBasic.a lib/libLLVMCore.a lib/libLLVMMC.a lib/libLLVMBinaryFormat.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMDebugInfoMSF.a lib/libLLVMSupport.a -lz -lcurses -lm lib/libLLVMDemangle.a && cd /Users/buildslave/jenkins/<wbr>workspace/clang-stage2-<wbr>Rthinlto/clang-build/Build/<wbr>tools/clang/tools/clang-format && xcrun dsymutil /Users/buildslave/jenkins/<wbr>workspace/clang-stage2-<wbr>Rthinlto/clang-build/Build/<wbr>bin/clang-format && /usr/bin/strip -Sxl /Users/buildslave/jenkins/<wbr>workspace/clang-stage2-<wbr>Rthinlto/clang-build/Build/<wbr>bin/clang-format</div><div> </div><div>FAILED: bin/clang-format </div><div>: && /Users/buildslave/jenkins/<wbr>workspace/clang-stage2-<wbr>Rthinlto/host-compiler/bin/<wbr>clang++  -fno-stack-protector -fno-common -Wno-profile-instr-unprofiled -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-<wbr>availability-new -std=c++11 -fmodules -fmodules-cache-path=/Users/<wbr>buildslave/jenkins/workspace/<wbr>clang-stage2-Rthinlto/clang-<wbr>build/Build/module.cache -fcxx-modules -gmodules -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fdiagnostics-color -flto=thin -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O2 -g -DNDEBUG -Wl,-search_paths_first -Wl,-headerpad_max_install_<wbr>names -flto=thin -Wl,-cache_path_lto,/Users/<wbr>buildslave/jenkins/workspace/<wbr>clang-stage2-Rthinlto/clang-<wbr>build/Build/lto.cache    -Wl,-dead_strip -Wl,-object_path_lto,/Users/<wbr>buildslave/jenkins/workspace/<wbr>clang-stage2-Rthinlto/clang-<wbr>build/Build/tools/clang/tools/<wbr>clang-format/./clang-format-<wbr>lto.o tools/clang/tools/clang-<wbr>format/CMakeFiles/clang-<wbr>format.dir/ClangFormat.cpp.o  -o bin/clang-format  -Wl,-rpath,@loader_path/../<wbr>lib lib/libLLVMSupport.a lib/libclangBasic.a lib/libclangFormat.a lib/libclangRewrite.a lib/libclangToolingCore.a lib/libclangToolingInclusions.<wbr>a lib/libclangToolingCore.a lib/libclangRewrite.a lib/libclangAST.a lib/libclangLex.a lib/libclangBasic.a lib/libLLVMCore.a lib/libLLVMMC.a lib/libLLVMBinaryFormat.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMDebugInfoMSF.a lib/libLLVMSupport.a -lz -lcurses -lm lib/libLLVMDemangle.a && cd /Users/buildslave/jenkins/<wbr>workspace/clang-stage2-<wbr>Rthinlto/clang-build/Build/<wbr>tools/clang/tools/clang-format && xcrun dsymutil /Users/buildslave/jenkins/<wbr>workspace/clang-stage2-<wbr>Rthinlto/clang-build/Build/<wbr>bin/clang-format && /usr/bin/strip -Sxl /Users/buildslave/jenkins/<wbr>workspace/clang-stage2-<wbr>Rthinlto/clang-build/Build/<wbr>bin/clang-format</div><div> </div><div>Assertion failed: (New->getType() == getType() && "replaceAllUses of value with new value of different type!"), function doRAUW, file /Users/buildslave/jenkins/<wbr>workspace/clang-stage1-<wbr>configure-RA/llvm/lib/IR/<wbr>Value.cpp, line 413.</div><div> </div><div>clang-7: error: unable to execute command: Abort trap: 6</div><div>clang-7: error: linker command failed due to signal (use -v to see invocation)</div></div><div><br></div><div>I'm currently verifying if this commit is indeed the offender. I will revert it if that's confirmed.</div><div>Let me know if you need assistance investigating/fixing the issue on Darwin.</div><div><br></div><div>Thanks,</div><div>Alex</div><div><br></div><div><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On 25 July 2018 at 04:13, Florian Hahn via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: fhahn<br>
Date: Wed Jul 25 04:13:40 2018<br>
New Revision: 337904<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=337904&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=337904&view=rev</a><br>
Log:<br>
Recommit r333268: [IPSCCP] Use PredicateInfo to propagate facts from cmp instructions.<br>
<br>
r337828 resolves a PredicateInfo issue with unnamed types.<br>
<br>
Original message:<br>
This patch updates IPSCCP to use PredicateInfo to propagate<br>
facts to true branches predicated by EQ and to false branches<br>
predicated by NE.<br>
<br>
As a follow up, we should be able to extend it to also propagate additional<br>
facts about nonnull.<br>
<br>
Reviewers: davide, mssimpso, dberlin, efriedma<br>
<br>
Reviewed By: davide, dberlin<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/SCCP.h<br>
    llvm/trunk/lib/Transforms/IPO/<wbr>SCCP.cpp<br>
    llvm/trunk/lib/Transforms/Scal<wbr>ar/SCCP.cpp<br>
    llvm/trunk/test/Other/new-pm-l<wbr>to-defaults.ll<br>
    llvm/trunk/test/Other/opt-O2-p<wbr>ipeline.ll<br>
    llvm/trunk/test/Other/opt-O3-p<wbr>ipeline.ll<br>
    llvm/trunk/test/Other/opt-Os-p<wbr>ipeline.ll<br>
    llvm/trunk/test/Transforms/IPC<wbr>onstantProp/musttail-call.ll<br>
<br>
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/SCCP.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/SCCP.h?rev=337904&r1=337903&r2=337904&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/SCCP.h?rev=<wbr>337904&r1=337903&r2=337904&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/SCCP.h (original)<br>
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/SCCP.h Wed Jul 25 04:13:40 2018<br>
@@ -21,11 +21,13 @@<br>
 #ifndef LLVM_TRANSFORMS_SCALAR_SCCP_H<br>
 #define LLVM_TRANSFORMS_SCALAR_SCCP_H<br>
<br>
+#include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/Analysis/TargetLibraryIn<wbr>fo.h"<br>
 #include "llvm/IR/DataLayout.h"<br>
 #include "llvm/IR/Function.h"<br>
 #include "llvm/IR/Module.h"<br>
 #include "llvm/IR/PassManager.h"<br>
+#include "llvm/Transforms/Utils/Predica<wbr>teInfo.h"<br>
<br>
 namespace llvm {<br>
<br>
@@ -37,7 +39,9 @@ public:<br>
   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);<br>
 };<br>
<br>
-bool runIPSCCP(Module &M, const DataLayout &DL, const TargetLibraryInfo *TLI);<br>
+bool runIPSCCP(<br>
+    Module &M, const DataLayout &DL, const TargetLibraryInfo *TLI,<br>
+    function_ref<std::unique_ptr<P<wbr>redicateInfo>(Function &)> getPredicateInfo);<br>
 } // end namespace llvm<br>
<br>
 #endif // LLVM_TRANSFORMS_SCALAR_SCCP_H<br>
<br>
Modified: llvm/trunk/lib/Transforms/IPO/<wbr>SCCP.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/SCCP.cpp?rev=337904&r1=337903&r2=337904&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/IPO/SCCP.cpp?rev=337904&r1=<wbr>337903&r2=337904&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/IPO/<wbr>SCCP.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/IPO/<wbr>SCCP.cpp Wed Jul 25 04:13:40 2018<br>
@@ -1,4 +1,5 @@<br>
 #include "llvm/Transforms/IPO/SCCP.h"<br>
+#include "llvm/Analysis/AssumptionCache<wbr>.h"<br>
 #include "llvm/Analysis/TargetLibraryIn<wbr>fo.h"<br>
 #include "llvm/Transforms/IPO.h"<br>
 #include "llvm/Transforms/Scalar/SCCP.h<wbr>"<br>
@@ -8,7 +9,15 @@ using namespace llvm;<br>
 PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) {<br>
   const DataLayout &DL = M.getDataLayout();<br>
   auto &TLI = AM.getResult<TargetLibraryAnal<wbr>ysis>(M);<br>
-  if (!runIPSCCP(M, DL, &TLI))<br>
+  auto &FAM = AM.getResult<FunctionAnalysisM<wbr>anagerModuleProxy>(M).<wbr>getManager();<br>
+  auto getPredicateInfo =<br>
+      [&FAM](Function &F) -> std::unique_ptr<PredicateInfo> {<br>
+    return make_unique<PredicateInfo>(F,<br>
+                                      FAM.getResult<DominatorTreeAna<wbr>lysis>(F),<br>
+                                      FAM.getResult<AssumptionAnalys<wbr>is>(F));<br>
+  };<br>
+<br>
+  if (!runIPSCCP(M, DL, &TLI, getPredicateInfo))<br>
     return PreservedAnalyses::all();<br>
   return PreservedAnalyses::none();<br>
 }<br>
@@ -34,10 +43,20 @@ public:<br>
     const DataLayout &DL = M.getDataLayout();<br>
     const TargetLibraryInfo *TLI =<br>
         &getAnalysis<TargetLibraryInf<wbr>oWrapperPass>().getTLI();<br>
-    return runIPSCCP(M, DL, TLI);<br>
+<br>
+    auto getPredicateInfo =<br>
+        [this](Function &F) -> std::unique_ptr<PredicateInfo> {<br>
+      return make_unique<PredicateInfo>(<br>
+          F, this->getAnalysis<DominatorTre<wbr>eWrapperPass>(F).getDomTree(),<br>
+          this->getAnalysis<AssumptionCa<wbr>cheTracker>().getAssumptionCac<wbr>he(F));<br>
+    };<br>
+<br>
+    return runIPSCCP(M, DL, TLI, getPredicateInfo);<br>
   }<br>
<br>
   void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
+    AU.addRequired<AssumptionCache<wbr>Tracker>();<br>
+    AU.addRequired<DominatorTreeWr<wbr>apperPass>();<br>
     AU.addRequired<TargetLibraryI<wbr>nfoWrapperPass>();<br>
   }<br>
 };<br>
@@ -49,6 +68,7 @@ char IPSCCPLegacyPass::ID = 0;<br>
 INITIALIZE_PASS_BEGIN(IPSCCPL<wbr>egacyPass, "ipsccp",<br>
                       "Interprocedural Sparse Conditional Constant Propagation",<br>
                       false, false)<br>
+INITIALIZE_PASS_DEPENDENCY(Do<wbr>minatorTreeWrapperPass)<br>
 INITIALIZE_PASS_DEPENDENCY(Ta<wbr>rgetLibraryInfoWrapperPass)<br>
 INITIALIZE_PASS_END(IPSCCPLeg<wbr>acyPass, "ipsccp",<br>
                     "Interprocedural Sparse Conditional Constant Propagation",<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scal<wbr>ar/SCCP.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SCCP.cpp?rev=337904&r1=337903&r2=337904&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/Scalar/SCCP.cpp?rev=337904&<wbr>r1=337903&r2=337904&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/Scal<wbr>ar/SCCP.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scal<wbr>ar/SCCP.cpp Wed Jul 25 04:13:40 2018<br>
@@ -55,6 +55,7 @@<br>
 #include "llvm/Support/ErrorHandling.h"<br>
 #include "llvm/Support/raw_ostream.h"<br>
 #include "llvm/Transforms/Scalar.h"<br>
+#include "llvm/Transforms/Utils/Predica<wbr>teInfo.h"<br>
 #include <cassert><br>
 #include <utility><br>
 #include <vector><br>
@@ -246,7 +247,21 @@ class SCCPSolver : public InstVisitor<SC<br>
   using Edge = std::pair<BasicBlock *, BasicBlock *>;<br>
   DenseSet<Edge> KnownFeasibleEdges;<br>
<br>
+  DenseMap<Function *, std::unique_ptr<PredicateInfo><wbr>> PredInfos;<br>
+  DenseMap<Value *, SmallPtrSet<User *, 2>> AdditionalUsers;<br>
+<br>
 public:<br>
+  void addPredInfo(Function &F, std::unique_ptr<PredicateInfo> PI) {<br>
+    PredInfos[&F] = std::move(PI);<br>
+  }<br>
+<br>
+  const PredicateBase *getPredicateInfoFor(Instructi<wbr>on *I) {<br>
+    auto PI = PredInfos.find(I->getFunction(<wbr>));<br>
+    if (PI == PredInfos.end())<br>
+      return nullptr;<br>
+    return PI->second->getPredicateInfoFo<wbr>r(I);<br>
+  }<br>
+<br>
   SCCPSolver(const DataLayout &DL, const TargetLibraryInfo *tli)<br>
       : DL(DL), TLI(tli) {}<br>
<br>
@@ -558,6 +573,26 @@ private:<br>
       visit(*I);<br>
   }<br>
<br>
+  // Add U as additional user of V.<br>
+  void addAdditionalUser(Value *V, User *U) {<br>
+    auto Iter = AdditionalUsers.insert({V, {}});<br>
+    Iter.first->second.insert(U);<br>
+  }<br>
+<br>
+  // Mark I's users as changed, including AdditionalUsers.<br>
+  void markUsersAsChanged(Value *I) {<br>
+    for (User *U : I->users())<br>
+      if (auto *UI = dyn_cast<Instruction>(U))<br>
+        OperandChangedState(UI);<br>
+<br>
+    auto Iter = AdditionalUsers.find(I);<br>
+    if (Iter != AdditionalUsers.end()) {<br>
+      for (User *U : Iter->second)<br>
+        if (auto *UI = dyn_cast<Instruction>(U))<br>
+          OperandChangedState(UI);<br>
+    }<br>
+  }<br>
+<br>
 private:<br>
   friend class InstVisitor<SCCPSolver>;<br>
<br>
@@ -1119,6 +1154,65 @@ void SCCPSolver::visitCallSite(Call<wbr>Site<br>
   Function *F = CS.getCalledFunction();<br>
   Instruction *I = CS.getInstruction();<br>
<br>
+  if (auto *II = dyn_cast<IntrinsicInst>(I)) {<br>
+    if (II->getIntrinsicID() == Intrinsic::ssa_copy) {<br>
+      if (ValueState[I].isOverdefined()<wbr>)<br>
+        return;<br>
+<br>
+      auto *PI = getPredicateInfoFor(I);<br>
+      if (!PI)<br>
+        return;<br>
+<br>
+      auto *PBranch = dyn_cast<PredicateBranch>(getP<wbr>redicateInfoFor(I));<br>
+      if (!PBranch) {<br>
+        mergeInValue(ValueState[I], I, getValueState(PI->OriginalOp))<wbr>;<br>
+        return;<br>
+      }<br>
+<br>
+      Value *CopyOf = I->getOperand(0);<br>
+      Value *Cond = PBranch->Condition;<br>
+<br>
+      // Everything below relies on the condition being a comparison.<br>
+      auto *Cmp = dyn_cast<CmpInst>(Cond);<br>
+      if (!Cmp) {<br>
+        mergeInValue(ValueState[I], I, getValueState(PI->OriginalOp))<wbr>;<br>
+        return;<br>
+      }<br>
+<br>
+      Value *CmpOp0 = Cmp->getOperand(0);<br>
+      Value *CmpOp1 = Cmp->getOperand(1);<br>
+      if (CopyOf != CmpOp0 && CopyOf != CmpOp1) {<br>
+        mergeInValue(ValueState[I], I, getValueState(PI->OriginalOp))<wbr>;<br>
+        return;<br>
+      }<br>
+<br>
+      if (CmpOp0 != CopyOf)<br>
+        std::swap(CmpOp0, CmpOp1);<br>
+<br>
+      LatticeVal OriginalVal = getValueState(CopyOf);<br>
+      LatticeVal EqVal = getValueState(CmpOp1);<br>
+      LatticeVal &IV = ValueState[I];<br>
+      if (PBranch->TrueEdge && Cmp->getPredicate() == CmpInst::ICMP_EQ) {<br>
+        addAdditionalUser(CmpOp1, I);<br>
+        if (OriginalVal.isConstant())<br>
+          mergeInValue(IV, I, OriginalVal);<br>
+        else<br>
+          mergeInValue(IV, I, EqVal);<br>
+        return;<br>
+      }<br>
+      if (!PBranch->TrueEdge && Cmp->getPredicate() == CmpInst::ICMP_NE) {<br>
+        addAdditionalUser(CmpOp1, I);<br>
+        if (OriginalVal.isConstant())<br>
+          mergeInValue(IV, I, OriginalVal);<br>
+        else<br>
+          mergeInValue(IV, I, EqVal);<br>
+        return;<br>
+      }<br>
+<br>
+      return (void)mergeInValue(IV, I, getValueState(PBranch->Origina<wbr>lOp));<br>
+    }<br>
+  }<br>
+<br>
   // The common case is that we aren't tracking the callee, either because we<br>
   // are not doing interprocedural analysis or the callee is indirect, or is<br>
   // external.  Handle these cases first.<br>
@@ -1238,9 +1332,7 @@ void SCCPSolver::Solve() {<br>
       // since all of its users will have already been marked as overdefined<br>
       // Update all of the users of this instruction's value.<br>
       //<br>
-      for (User *U : I->users())<br>
-        if (auto *UI = dyn_cast<Instruction>(U))<br>
-          OperandChangedState(UI);<br>
+      markUsersAsChanged(I);<br>
     }<br>
<br>
     // Process the instruction work list.<br>
@@ -1257,9 +1349,7 @@ void SCCPSolver::Solve() {<br>
       // Update all of the users of this instruction's value.<br>
       //<br>
       if (I->getType()->isStructTy() || !getValueState(I).isOverdefine<wbr>d())<br>
-        for (User *U : I->users())<br>
-          if (auto *UI = dyn_cast<Instruction>(U))<br>
-            OperandChangedState(UI);<br>
+        markUsersAsChanged(I);<br>
     }<br>
<br>
     // Process the basic block work list.<br>
@@ -1798,8 +1888,9 @@ static void findReturnsToZap(Function &F<br>
   }<br>
 }<br>
<br>
-bool llvm::runIPSCCP(Module &M, const DataLayout &DL,<br>
-                     const TargetLibraryInfo *TLI) {<br>
+bool llvm::runIPSCCP(<br>
+    Module &M, const DataLayout &DL, const TargetLibraryInfo *TLI,<br>
+    function_ref<std::unique_ptr<P<wbr>redicateInfo>(Function &)> getPredicateInfo) {<br>
   SCCPSolver Solver(DL, TLI);<br>
<br>
   // Loop over all functions, marking arguments to those with their addresses<br>
@@ -1808,6 +1899,7 @@ bool llvm::runIPSCCP(Module &M, const Da<br>
     if (F.isDeclaration())<br>
       continue;<br>
<br>
+    Solver.addPredInfo(F, getPredicateInfo(F));<br>
     // Determine if we can track the function's return values. If so, add the<br>
     // function to the solver's set of return-tracked functions.<br>
     if (canTrackReturnsInterprocedura<wbr>lly(&F))<br>
@@ -1960,6 +2052,24 @@ bool llvm::runIPSCCP(Module &M, const Da<br>
       F.getBasicBlockList().erase(D<wbr>eadBB);<br>
     }<br>
     BlocksToErase.clear();<br>
+<br>
+    for (BasicBlock &BB : F) {<br>
+      for (BasicBlock::iterator BI = BB.begin(), E = BB.end(); BI != E;) {<br>
+        Instruction *Inst = &*BI++;<br>
+        if (const PredicateBase *PI = Solver.getPredicateInfoFor(Ins<wbr>t)) {<br>
+          if (auto *II = dyn_cast<IntrinsicInst>(Inst)) {<br>
+            if (II->getIntrinsicID() == Intrinsic::ssa_copy) {<br>
+              Value *Op = II->getOperand(0);<br>
+              Inst->replaceAllUsesWith(Op);<br>
+              Inst->eraseFromParent();<br>
+              continue;<br>
+            }<br>
+          }<br>
+          Inst->replaceAllUsesWith(PI->O<wbr>riginalOp);<br>
+          Inst->eraseFromParent();<br>
+        }<br>
+      }<br>
+    }<br>
   }<br>
<br>
   // If we inferred constant or undef return values for a function, we replaced<br>
<br>
Modified: llvm/trunk/test/Other/new-pm-l<wbr>to-defaults.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pm-lto-defaults.ll?rev=337904&r1=337903&r2=337904&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/Other/ne<wbr>w-pm-lto-defaults.ll?rev=33790<wbr>4&r1=337903&r2=337904&view=<wbr>diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Other/new-pm-l<wbr>to-defaults.ll (original)<br>
+++ llvm/trunk/test/Other/new-pm-l<wbr>to-defaults.ll Wed Jul 25 04:13:40 2018<br>
@@ -41,6 +41,8 @@<br>
 ; CHECK-O2-NEXT: Running analysis: ProfileSummaryAnalysis<br>
 ; CHECK-O2-NEXT: Running analysis: OptimizationRemarkEmitterAnaly<wbr>sis<br>
 ; CHECK-O2-NEXT: Running pass: IPSCCPPass<br>
+; CHECK-O2-DAG: Running analysis: AssumptionAnalysis on foo<br>
+; CHECK-O2-DAG: Running analysis: DominatorTreeAnalysis on foo<br>
 ; CHECK-O2-NEXT: Running pass: CalledValuePropagationPass<br>
 ; CHECK-O-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdap<wbr>tor<{{.*}}PostOrderFunctionAtt<wbr>rsPass><br>
 ; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*<wbr>}}SCC<br>
@@ -57,8 +59,6 @@<br>
 ; CHECK-O1-NEXT: Running pass: LowerTypeTestsPass<br>
 ; CHECK-O2-NEXT: Running pass: GlobalOptPass<br>
 ; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{<wbr>.*}}PromotePass><br>
-; CHECK-O2-NEXT: Running analysis: DominatorTreeAnalysis<br>
-; CHECK-O2-NEXT: Running analysis: AssumptionAnalysis<br>
 ; CHECK-O2-NEXT: Running pass: ConstantMergePass<br>
 ; CHECK-O2-NEXT: Running pass: DeadArgumentEliminationPass<br>
 ; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{<wbr>.*}}PassManager{{.*}}><br>
<br>
Modified: llvm/trunk/test/Other/opt-O2-p<wbr>ipeline.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/opt-O2-pipeline.ll?rev=337904&r1=337903&r2=337904&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/Other/op<wbr>t-O2-pipeline.ll?rev=337904&r1<wbr>=337903&r2=337904&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Other/opt-O2-p<wbr>ipeline.ll (original)<br>
+++ llvm/trunk/test/Other/opt-O2-p<wbr>ipeline.ll Wed Jul 25 04:13:40 2018<br>
@@ -28,6 +28,7 @@<br>
 ; CHECK-NEXT:     Force set function attributes<br>
 ; CHECK-NEXT:     Infer set function attributes<br>
 ; CHECK-NEXT:     Interprocedural Sparse Conditional Constant Propagation<br>
+; CHECK-NEXT:       Unnamed pass: implement Pass::getPassName()<br>
 ; CHECK-NEXT:     Called Value Propagation<br>
 ; CHECK-NEXT:     Global Variable Optimizer<br>
 ; CHECK-NEXT:       Unnamed pass: implement Pass::getPassName()<br>
@@ -270,6 +271,9 @@<br>
 ; CHECK-NEXT:       Module Verifier<br>
 ; CHECK-NEXT:     Bitcode Writer<br>
 ; CHECK-NEXT: Pass Arguments:<br>
+; CHECK-NEXT:  FunctionPass Manager<br>
+; CHECK-NEXT:     Dominator Tree Construction<br>
+; CHECK-NEXT: Pass Arguments:<br>
 ; CHECK-NEXT: Target Library Information<br>
 ; CHECK-NEXT:   FunctionPass Manager<br>
 ; CHECK-NEXT:     Dominator Tree Construction<br>
<br>
Modified: llvm/trunk/test/Other/opt-O3-p<wbr>ipeline.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/opt-O3-pipeline.ll?rev=337904&r1=337903&r2=337904&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/Other/op<wbr>t-O3-pipeline.ll?rev=337904&r1<wbr>=337903&r2=337904&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Other/opt-O3-p<wbr>ipeline.ll (original)<br>
+++ llvm/trunk/test/Other/opt-O3-p<wbr>ipeline.ll Wed Jul 25 04:13:40 2018<br>
@@ -30,6 +30,7 @@<br>
 ; CHECK-NEXT:     FunctionPass Manager<br>
 ; CHECK-NEXT:       Call-site splitting<br>
 ; CHECK-NEXT:     Interprocedural Sparse Conditional Constant Propagation<br>
+; CHECK-NEXT:       Unnamed pass: implement Pass::getPassName()<br>
 ; CHECK-NEXT:     Called Value Propagation<br>
 ; CHECK-NEXT:     Global Variable Optimizer<br>
 ; CHECK-NEXT:       Unnamed pass: implement Pass::getPassName()<br>
@@ -274,6 +275,9 @@<br>
 ; CHECK-NEXT:       Module Verifier<br>
 ; CHECK-NEXT:     Bitcode Writer<br>
 ; CHECK-NEXT: Pass Arguments:<br>
+; CHECK-NEXT:  FunctionPass Manager<br>
+; CHECK-NEXT:     Dominator Tree Construction<br>
+; CHECK-NEXT: Pass Arguments:<br>
 ; CHECK-NEXT: Target Library Information<br>
 ; CHECK-NEXT:   FunctionPass Manager<br>
 ; CHECK-NEXT:     Dominator Tree Construction<br>
<br>
Modified: llvm/trunk/test/Other/opt-Os-p<wbr>ipeline.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/opt-Os-pipeline.ll?rev=337904&r1=337903&r2=337904&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/Other/op<wbr>t-Os-pipeline.ll?rev=337904&r1<wbr>=337903&r2=337904&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Other/opt-Os-p<wbr>ipeline.ll (original)<br>
+++ llvm/trunk/test/Other/opt-Os-p<wbr>ipeline.ll Wed Jul 25 04:13:40 2018<br>
@@ -28,6 +28,7 @@<br>
 ; CHECK-NEXT:     Force set function attributes<br>
 ; CHECK-NEXT:     Infer set function attributes<br>
 ; CHECK-NEXT:     Interprocedural Sparse Conditional Constant Propagation<br>
+; CHECK-NEXT:       Unnamed pass: implement Pass::getPassName()<br>
 ; CHECK-NEXT:     Called Value Propagation<br>
 ; CHECK-NEXT:     Global Variable Optimizer<br>
 ; CHECK-NEXT:       Unnamed pass: implement Pass::getPassName()<br>
@@ -257,6 +258,9 @@<br>
 ; CHECK-NEXT:       Module Verifier<br>
 ; CHECK-NEXT:     Bitcode Writer<br>
 ; CHECK-NEXT: Pass Arguments:<br>
+; CHECK-NEXT:  FunctionPass Manager<br>
+; CHECK-NEXT:     Dominator Tree Construction<br>
+; CHECK-NEXT: Pass Arguments:<br>
 ; CHECK-NEXT: Target Library Information<br>
 ; CHECK-NEXT:   FunctionPass Manager<br>
 ; CHECK-NEXT:     Dominator Tree Construction<br>
<br>
Modified: llvm/trunk/test/Transforms/IPC<wbr>onstantProp/musttail-call.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IPConstantProp/musttail-call.ll?rev=337904&r1=337903&r2=337904&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/Transfor<wbr>ms/IPConstantProp/musttail-<wbr>call.ll?rev=337904&r1=337903&<wbr>r2=337904&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Transforms/IPC<wbr>onstantProp/musttail-call.ll (original)<br>
+++ llvm/trunk/test/Transforms/IPC<wbr>onstantProp/musttail-call.ll Wed Jul 25 04:13:40 2018<br>
@@ -9,7 +9,7 @@ define i8* @start(i8 %v) {<br>
   %c1 = icmp eq i8 %v, 0<br>
   br i1 %c1, label %true, label %false<br>
 true:<br>
-  ; CHECK: %ca = musttail call i8* @side_effects(i8 %v)<br>
+  ; CHECK: %ca = musttail call i8* @side_effects(i8 0)<br>
   ; CHECK: ret i8* %ca<br>
   %ca = musttail call i8* @side_effects(i8 %v)<br>
   ret i8* %ca<br>
@@ -34,7 +34,7 @@ define internal i8* @side_effects(i8 %v)<br>
   ; is always `null`.<br>
   ; The call can't be removed due to `external` call above, though.<br>
<br>
-  ; CHECK: %ca = musttail call i8* @start(i8 %v)<br>
+  ; CHECK: %ca = musttail call i8* @start(i8 0)<br>
   %ca = musttail call i8* @start(i8 %v)<br>
<br>
   ; Thus the result must be returned anyway<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>