<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""></div><div class=""><br class=""><div class=""><div><blockquote type="cite" class=""><div class="">On Aug 31, 2015, at 1:38 PM, Piotr Padlewski <<a href="mailto:prazek@google.com" class="">prazek@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
<div dir="ltr" class="">You mean this one?<table style="font-size:12.8000001907349px" class=""><tbody class=""><tr class=""><td class=""><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lab.llvm.org-3A8080_green_job_llvm-2Dstage2-2Dcmake-2DRgLTO-5Fbuild_2592_&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=7ro_hqgFGe_Gz78eqv4J5K3CsWLMjAZCYho6UgAFf1U&s=sDrtlBwLjEKIzlwG8czqLc2ZAwmNfAYBnM5t3Aa6Wo0&e=" target="_blank" class="">http://lab.llvm.org:8080/green/job/llvm-stage2-cmake-RgLTO_build/2592/</a></td></tr></tbody></table> ?<div class="">Ok, I see, there was one build that had timelimit, but it is completely separate problem that GVN fixes then.</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Mon, Aug 31, 2015 at 1:26 PM, Steven Wu <span dir="ltr" class=""><<a href="mailto:stevenwu@apple.com" target="_blank" class="">stevenwu@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="">I sent a separate email on that commit. They hang the LTO bootstrap of llvm-cov (<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lab.llvm.org-3A8080_green_job_llvm-2Dstage2-2Dcmake-2DRgLTO_2607_&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=7ro_hqgFGe_Gz78eqv4J5K3CsWLMjAZCYho6UgAFf1U&s=a1xw5E_cYVPCOWpHC1-hhe8_99cx7_ISW9IufuaIs8c&e=" target="_blank" class="">http://lab.llvm.org:8080/green/job/llvm-stage2-cmake-RgLTO/2607/</a>). Reverting them fixed the issue. You should be able to reproduce by building llvm with LTO using the newly built clang.<span class="HOEnZb"><font color="#888888" class=""><div class=""><br class=""></div></font></span><div class=""><span class="HOEnZb"><font color="#888888" class="">Steven </font></span><div class=""><div class="h5"><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Aug 31, 2015, at 1:14 PM, Piotr Padlewski <<a href="mailto:prazek@google.com" target="_blank" class="">prazek@google.com</a>> wrote:</div><br class=""><div class=""><div dir="ltr" class="">Hi,<div class="">Why You have reveted "Generating assumption loads of vptr after ctor call (fixed)" and "Assume loads fix #2"? </div><div class="">Those patches was pushed 5h before this patch, and they were totally legit.</div><div class=""><br class=""></div><div class="">Piotr</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Thu, Aug 27, 2015 at 11:56 PM, Steven Wu <span dir="ltr" class=""><<a href="mailto:stevenwu@apple.com" target="_blank" class="">stevenwu@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="">I revert them in r246279. You should be able to reproduce the hang by bootstrapping clang. Looking at our bots, I see following file is hanging:<div class=""><br class=""></div><div class="">lib/ExecutionEngine/MCJIT/MCJIT.cpp</div><div class="">lib/Analysis/AliasAnalysisCounter.cpp</div><div class="">lib/Analysis/CFLAliasAnalysis.cpp</div><div class="">lib/Analysis/ScalarEvolutionAliasAnalysis.cpp</div><div class=""><br class=""></div><div class="">Let me know if you need more information.</div><span class=""><font color="#888888" class=""><div class=""><br class=""></div><div class="">Steven</div></font></span><div class=""><div class=""><div class=""><br class=""></div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Aug 27, 2015, at 11:36 PM, Piotr Padlewski <<a href="mailto:prazek@google.com" target="_blank" class="">prazek@google.com</a>> wrote:</div><br class=""><div class=""><div dir="ltr" class="">Hi Steven,<div class="">I can't revert it by myself right now, so please revert this 2 commits for me. I will be very helpful if You will send me some some source, on which it hangs out.</div><div class=""><br class=""></div><div class="">Best</div><div class="">Piotr</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Thu, Aug 27, 2015 at 10:41 PM, Steven Wu <span dir="ltr" class=""><<a href="mailto:stevenwu@apple.com" target="_blank" class="">stevenwu@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Piotr<br class="">
<br class="">
I suspect this commit or the previous one actually hangs the clang bootstrap/self host. Here is one of the bot:<br class="">
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lab.llvm.org-3A8011_builders_clang-2Dcmake-2Darmv7-2Da15-2Dselfhost-2Dneon_builds_3200&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=w5JbUuJOaM8r3yrLe_E-498cDG5XBV16_6zQaNc-r-k&s=o_WlfUnzQ0Rumm6taj_siWVyfWSmAybi-79eAToWYjM&e=" rel="noreferrer" target="_blank" class="">http://lab.llvm.org:8011/builders/clang-cmake-armv7-a15-selfhost-neon/builds/3200</a><br class="">
The previous one is failing but the stage 2 build was finished. This build causes timeout. As far as I see, it is looping somewhere in GVN.<br class="">
<br class="">
Moreover, your previous commit in clang (r246213 or r246214) seems to hang the LTO bootstrap. Here is the bot:<br class="">
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lab.llvm.org-3A8080_green_job_llvm-2Dstage2-2Dcmake-2DRgLTO_2607_&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=w5JbUuJOaM8r3yrLe_E-498cDG5XBV16_6zQaNc-r-k&s=gr4h6R3Z74EwQk-3p1TypA-Vv7q6NOaEDzl3qmc9bao&e=" rel="noreferrer" target="_blank" class="">http://lab.llvm.org:8080/green/job/llvm-stage2-cmake-RgLTO/2607/</a><br class="">
LTO linking llvm-cov is hanging in ScalarEvolution. Might be triggered by something in your code?<br class="">
<br class="">
Would you please revert these changes? Let me know if you need any assistant to reproduce the hang.<br class="">
<br class="">
Thanks<br class="">
<br class="">
Steven<br class="">
<span class=""><br class="">
<br class="">
> On Aug 27, 2015, at 6:02 PM, Piotr Padlewski via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class="">
><br class="">
> Author: prazek<br class="">
> Date: Thu Aug 27 20:02:00 2015<br class="">
> New Revision: 246244<br class="">
><br class="">
</span>> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D246244-26view-3Drev&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=8G3E4p0QiSQGRFFW3utOydBELevWunZREK4rHoMS5CA&e=" rel="noreferrer" target="_blank" class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D246244-26view-3Drev&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=8G3E4p0QiSQGRFFW3utOydBELevWunZREK4rHoMS5CA&e=</a><br class="">
<span class="">> Log:<br class="">
> Constant propagation after hitting assume(cmp) bugfix<br class="">
><br class="">
> Last time code run into assertion `BBE.isSingleEdge()` in<br class="">
> lib/IR/Dominators.cpp:200.<br class="">
><br class="">
</span>> <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D12170&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=JAhAKhMDX_dxaFIWIHg1u7VUQ9mr4Zq20vHOtPnifUw&e=" rel="noreferrer" target="_blank" class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D12170&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=JAhAKhMDX_dxaFIWIHg1u7VUQ9mr4Zq20vHOtPnifUw&e=</a><br class="">
<span class="">><br class="">
> Modified:<br class="">
>    llvm/trunk/include/llvm/Transforms/Utils/Local.h<br class="">
>    llvm/trunk/lib/IR/Dominators.cpp<br class="">
>    llvm/trunk/lib/Transforms/Scalar/GVN.cpp<br class="">
>    llvm/trunk/lib/Transforms/Utils/Local.cpp<br class="">
>    llvm/trunk/test/Transforms/GVN/assume-equal.ll<br class="">
><br class="">
> Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h<br class="">
</span>> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Transforms_Utils_Local.h-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=4Z8rBUwlgMkkSgwH7hQuXwsWc7NpY-mhwqV5D69O3a0&e=" rel="noreferrer" target="_blank" class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Transforms_Utils_Local.h-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=4Z8rBUwlgMkkSgwH7hQuXwsWc7NpY-mhwqV5D69O3a0&e=</a><br class="">
<span class="">> ==============================================================================<br class="">
> --- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)<br class="">
> +++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Thu Aug 27 20:02:00 2015<br class="">
> @@ -291,6 +291,10 @@ void combineMetadata(Instruction *K, con<br class="">
> /// the given edge.  Returns the number of replacements made.<br class="">
> unsigned replaceDominatedUsesWith(Value *From, Value *To, DominatorTree &DT,<br class="">
>                                   const BasicBlockEdge &Edge);<br class="">
> +/// \brief Replace each use of 'From' with 'To' if that use is dominated by<br class="">
> +/// the given BasicBlock. Returns the number of replacements made.<br class="">
> +unsigned replaceDominatedUsesWith(Value *From, Value *To, DominatorTree &DT,<br class="">
> +                                  const BasicBlock *BB);<br class="">
> } // End llvm namespace<br class="">
><br class="">
> #endif<br class="">
><br class="">
> Modified: llvm/trunk/lib/IR/Dominators.cpp<br class="">
</span>> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_IR_Dominators.cpp-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=bcx_fsnn91sHHcxhLIuXCVoHzRkQIrCVPCT5rbP3NGY&e=" rel="noreferrer" target="_blank" class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_IR_Dominators.cpp-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=bcx_fsnn91sHHcxhLIuXCVoHzRkQIrCVPCT5rbP3NGY&e=</a><br class="">
<span class="">> ==============================================================================<br class="">
> --- llvm/trunk/lib/IR/Dominators.cpp (original)<br class="">
> +++ llvm/trunk/lib/IR/Dominators.cpp Thu Aug 27 20:02:00 2015<br class="">
> @@ -147,7 +147,8 @@ bool DominatorTree::dominates(const Basi<br class="">
>   // Assert that we have a single edge. We could handle them by simply<br class="">
>   // returning false, but since isSingleEdge is linear on the number of<br class="">
>   // edges, the callers can normally handle them more efficiently.<br class="">
> -  assert(BBE.isSingleEdge());<br class="">
> +  assert(BBE.isSingleEdge() &&<br class="">
> +         "This function is not efficient in handling multiple edges");<br class="">
><br class="">
>   // If the BB the edge ends in doesn't dominate the use BB, then the<br class="">
>   // edge also doesn't.<br class="">
> @@ -197,7 +198,8 @@ bool DominatorTree::dominates(const Basi<br class="">
>   // Assert that we have a single edge. We could handle them by simply<br class="">
>   // returning false, but since isSingleEdge is linear on the number of<br class="">
>   // edges, the callers can normally handle them more efficiently.<br class="">
> -  assert(BBE.isSingleEdge());<br class="">
> +  assert(BBE.isSingleEdge() &&<br class="">
> +         "This function is not efficient in handling multiple edges");<br class="">
><br class="">
>   Instruction *UserInst = cast<Instruction>(U.getUser());<br class="">
>   // A PHI in the end of the edge is dominated by it.<br class="">
><br class="">
> Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp<br class="">
</span>> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_Scalar_GVN.cpp-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=h6iUmj_kydFoOFu30aeWCv14ebRFbhknvH1hSYsWTpw&e=" rel="noreferrer" target="_blank" class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_Scalar_GVN.cpp-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=h6iUmj_kydFoOFu30aeWCv14ebRFbhknvH1hSYsWTpw&e=</a><br class="">
<div class=""><div class="">> ==============================================================================<br class="">
> --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)<br class="">
> +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Thu Aug 27 20:02:00 2015<br class="">
> @@ -725,7 +725,8 @@ namespace {<br class="">
>     bool splitCriticalEdges();<br class="">
>     BasicBlock *splitCriticalEdges(BasicBlock *Pred, BasicBlock *Succ);<br class="">
>     bool replaceOperandsWithConsts(Instruction *I) const;<br class="">
> -    bool propagateEquality(Value *LHS, Value *RHS, const BasicBlockEdge &Root);<br class="">
> +    bool propagateEquality(Value *LHS, Value *RHS, const BasicBlockEdge &Root,<br class="">
> +                           bool DominatesByEdge);<br class="">
>     bool processFoldableCondBr(BranchInst *BI);<br class="">
>     void addDeadBlock(BasicBlock *BB);<br class="">
>     void assignValNumForDeadCode();<br class="">
> @@ -1777,9 +1778,17 @@ bool GVN::processAssumeIntrinsic(Intrins<br class="">
><br class="">
>     // This property is only true in dominated successors, propagateEquality<br class="">
>     // will check dominance for us.<br class="">
> -    Changed |= propagateEquality(V, True, Edge);<br class="">
> +    Changed |= propagateEquality(V, True, Edge, false);<br class="">
>   }<br class="">
> -<br class="">
> +  // We can replace assume value with true, which covers cases like this:<br class="">
> +  // call void @llvm.assume(i1 %cmp)<br class="">
> +  // br i1 %cmp, label %bb1, label %bb2 ; will change %cmp to true<br class="">
> +  ReplaceWithConstMap[V] = True;<br class="">
> +<br class="">
> +  // If one of *cmp *eq operand is const, adding it to map will cover this:<br class="">
> +  // %cmp = fcmp oeq float 3.000000e+00, %0 ; const on lhs could happen<br class="">
> +  // call void @llvm.assume(i1 %cmp)<br class="">
> +  // ret float %0 ; will change it to ret float 3.000000e+00<br class="">
>   if (auto *CmpI = dyn_cast<CmpInst>(V)) {<br class="">
>     if (CmpI->getPredicate() == CmpInst::Predicate::ICMP_EQ ||<br class="">
>         CmpI->getPredicate() == CmpInst::Predicate::FCMP_OEQ ||<br class="">
> @@ -2088,8 +2097,9 @@ bool GVN::replaceOperandsWithConsts(Inst<br class="">
> /// The given values are known to be equal in every block<br class="">
> /// dominated by 'Root'.  Exploit this, for example by replacing 'LHS' with<br class="">
> /// 'RHS' everywhere in the scope.  Returns whether a change was made.<br class="">
> -bool GVN::propagateEquality(Value *LHS, Value *RHS,<br class="">
> -                            const BasicBlockEdge &Root) {<br class="">
> +/// If DominatesByEdge is false, then it means that it is dominated by Root.End.<br class="">
> +bool GVN::propagateEquality(Value *LHS, Value *RHS, const BasicBlockEdge &Root,<br class="">
> +                            bool DominatesByEdge) {<br class="">
>   SmallVector<std::pair<Value*, Value*>, 4> Worklist;<br class="">
>   Worklist.push_back(std::make_pair(LHS, RHS));<br class="">
>   bool Changed = false;<br class="">
> @@ -2146,7 +2156,11 @@ bool GVN::propagateEquality(Value *LHS,<br class="">
>     // LHS always has at least one use that is not dominated by Root, this will<br class="">
>     // never do anything if LHS has only one use.<br class="">
>     if (!LHS->hasOneUse()) {<br class="">
> -      unsigned NumReplacements = replaceDominatedUsesWith(LHS, RHS, *DT, Root);<br class="">
> +      unsigned NumReplacements =<br class="">
> +          DominatesByEdge<br class="">
> +              ? replaceDominatedUsesWith(LHS, RHS, *DT, Root)<br class="">
> +              : replaceDominatedUsesWith(LHS, RHS, *DT, Root.getEnd());<br class="">
> +<br class="">
>       Changed |= NumReplacements > 0;<br class="">
>       NumGVNEqProp += NumReplacements;<br class="">
>     }<br class="">
> @@ -2218,7 +2232,10 @@ bool GVN::propagateEquality(Value *LHS,<br class="">
>         Value *NotCmp = findLeader(Root.getEnd(), Num);<br class="">
>         if (NotCmp && isa<Instruction>(NotCmp)) {<br class="">
>           unsigned NumReplacements =<br class="">
> -            replaceDominatedUsesWith(NotCmp, NotVal, *DT, Root);<br class="">
> +              DominatesByEdge<br class="">
> +                  ? replaceDominatedUsesWith(NotCmp, NotVal, *DT, Root)<br class="">
> +                  : replaceDominatedUsesWith(NotCmp, NotVal, *DT,<br class="">
> +                                             Root.getEnd());<br class="">
>           Changed |= NumReplacements > 0;<br class="">
>           NumGVNEqProp += NumReplacements;<br class="">
>         }<br class="">
> @@ -2292,11 +2309,11 @@ bool GVN::processInstruction(Instruction<br class="">
><br class="">
>     Value *TrueVal = ConstantInt::getTrue(TrueSucc->getContext());<br class="">
>     BasicBlockEdge TrueE(Parent, TrueSucc);<br class="">
> -    Changed |= propagateEquality(BranchCond, TrueVal, TrueE);<br class="">
> +    Changed |= propagateEquality(BranchCond, TrueVal, TrueE, true);<br class="">
><br class="">
>     Value *FalseVal = ConstantInt::getFalse(FalseSucc->getContext());<br class="">
>     BasicBlockEdge FalseE(Parent, FalseSucc);<br class="">
> -    Changed |= propagateEquality(BranchCond, FalseVal, FalseE);<br class="">
> +    Changed |= propagateEquality(BranchCond, FalseVal, FalseE, true);<br class="">
><br class="">
>     return Changed;<br class="">
>   }<br class="">
> @@ -2318,7 +2335,7 @@ bool GVN::processInstruction(Instruction<br class="">
>       // If there is only a single edge, propagate the case value into it.<br class="">
>       if (SwitchEdges.lookup(Dst) == 1) {<br class="">
>         BasicBlockEdge E(Parent, Dst);<br class="">
> -        Changed |= propagateEquality(SwitchCond, i.getCaseValue(), E);<br class="">
> +        Changed |= propagateEquality(SwitchCond, i.getCaseValue(), E, true);<br class="">
>       }<br class="">
>     }<br class="">
>     return Changed;<br class="">
><br class="">
> Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp<br class="">
</div></div>> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_Utils_Local.cpp-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=VaY7U2u44R2tDHWpKSFynev5sAO2KXWdXowhG2UxQzc&e=" rel="noreferrer" target="_blank" class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_Utils_Local.cpp-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=VaY7U2u44R2tDHWpKSFynev5sAO2KXWdXowhG2UxQzc&e=</a><br class="">
<div class=""><div class="">> ==============================================================================<br class="">
> --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)<br class="">
> +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Thu Aug 27 20:02:00 2015<br class="">
> @@ -1349,3 +1349,23 @@ unsigned llvm::replaceDominatedUsesWith(<br class="">
>   }<br class="">
>   return Count;<br class="">
> }<br class="">
> +<br class="">
> +unsigned llvm::replaceDominatedUsesWith(Value *From, Value *To,<br class="">
> +                                        DominatorTree &DT,<br class="">
> +                                        const BasicBlock *BB) {<br class="">
> +  assert(From->getType() == To->getType());<br class="">
> +<br class="">
> +  unsigned Count = 0;<br class="">
> +  for (Value::use_iterator UI = From->use_begin(), UE = From->use_end();<br class="">
> +       UI != UE;) {<br class="">
> +    Use &U = *UI++;<br class="">
> +    auto *I = cast<Instruction>(U.getUser());<br class="">
> +    if (DT.dominates(BB, I->getParent())) {<br class="">
> +      U.set(To);<br class="">
> +      DEBUG(dbgs() << "Replace dominated use of '" << From->getName() << "' as "<br class="">
> +                   << *To << " in " << *U << "\n");<br class="">
> +      ++Count;<br class="">
> +    }<br class="">
> +  }<br class="">
> +  return Count;<br class="">
> +}<br class="">
><br class="">
> Modified: llvm/trunk/test/Transforms/GVN/assume-equal.ll<br class="">
</div></div>> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Transforms_GVN_assume-2Dequal.ll-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=u5vPTRrvDy5AhQWOCPbbsiKzGay_3w0RWL4KceWmosY&e=" rel="noreferrer" target="_blank" class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Transforms_GVN_assume-2Dequal.ll-3Frev-3D246244-26r1-3D246243-26r2-3D246244-26view-3Ddiff&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=u5vPTRrvDy5AhQWOCPbbsiKzGay_3w0RWL4KceWmosY&e=</a><br class="">
<div class=""><div class="">> ==============================================================================<br class="">
> --- llvm/trunk/test/Transforms/GVN/assume-equal.ll (original)<br class="">
> +++ llvm/trunk/test/Transforms/GVN/assume-equal.ll Thu Aug 27 20:02:00 2015<br class="">
> @@ -99,8 +99,6 @@ entry:<br class="">
> }<br class="">
><br class="">
> ; CHECK-LABEL: define float @_Z1if(float %p)<br class="">
> -<br class="">
> -<br class="">
> define float @_Z1if(float %p) {<br class="">
> entry:<br class="">
>   %p.addr = alloca float, align 4<br class="">
> @@ -114,6 +112,23 @@ entry:<br class="">
>   ret float %0<br class="">
> }<br class="">
><br class="">
> +; This test checks if constant propagation works for multiple node edges<br class="">
> +; CHECK-LABEL: define i32 @_Z1ii(i32 %p)<br class="">
> +define i32 @_Z1ii(i32 %p) {<br class="">
> +entry:<br class="">
> +  %cmp = icmp eq i32 %p, 42<br class="">
> +  call void @llvm.assume(i1 %cmp)<br class="">
> +<br class="">
> +  ; CHECK: br i1 true, label %bb2, label %bb2<br class="">
> +  br i1 %cmp, label %bb2, label %bb2<br class="">
> +bb2:<br class="">
> +  ; CHECK: br i1 true, label %bb2, label %bb2<br class="">
> +  br i1 %cmp, label %bb2, label %bb2<br class="">
> +<br class="">
> +  ; CHECK: ret i32 42<br class="">
> +  ret i32 %p<br class="">
> +}<br class="">
> +<br class="">
> declare noalias i8* @_Znwm(i64)<br class="">
> declare void @_ZN1AC1Ev(%struct.A*)<br class="">
> declare void @llvm.assume(i1)<br class="">
><br class="">
><br class="">
> _______________________________________________<br class="">
> llvm-commits mailing list<br class="">
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a><br class="">
</div></div>> <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_llvm-2Dcommits&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=P5r-R6T3ZBFQxiuD77x-_EEgsnbkRkhpIJSvqcH9_zc&e=" rel="noreferrer" target="_blank" class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_llvm-2Dcommits&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=AyppgLQmqA6F6mGKjHYJQMsYFVSyBzNb052X2-XqxQo&m=OEVOCQ_n7QuyS9xAvppvBAc08nxqpaB-CBau66yj_oA&s=P5r-R6T3ZBFQxiuD77x-_EEgsnbkRkhpIJSvqcH9_zc&e=</a><br class="">
<br class="">
</blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></div></div></div></blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></div></div></div></div></blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></div></body></html>