<div dir="ltr">This is fixed in Committed revision 318353.<div><br></div><div>Thanks,</div><div><br></div><div>-Rong</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 15, 2017 at 3:05 PM, Rong Xu <span dir="ltr"><<a href="mailto:xur@google.com" target="_blank">xur@google.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">Thanks for the test case. I can reproduce the assertion. <div>It seems like a precision issue for the branch probably. I will send a  patch to fix this.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>-Rong</div></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 15, 2017 at 2:35 PM, Akira Hatanaka <span dir="ltr"><<a href="mailto:ahatanak@gmail.com" target="_blank">ahatanak@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">Please try compiling the attached reduced test case with llc.<div><div class="m_-6603882699777641088h5"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 15, 2017 at 10:00 AM, Rong Xu <span dir="ltr"><<a href="mailto:xur@google.com" target="_blank">xur@google.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">I did see this when I worked on the patch. This happens when we replaces the unreachable default with the most popular case. If we scale the peeled switch statement, we might see this kind of insane branch probability. <div>But the patch already has a check to avoid this.</div><div><br></div><div>Can you send me the test case so that I can look into?</div><div><br></div><div>Thanks,</div><div><br></div><div>-Rong</div></div><div class="m_-6603882699777641088m_-130265937175591984HOEnZb"><div class="m_-6603882699777641088m_-130265937175591984h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 15, 2017 at 7:22 AM, Akira Hatanaka <span dir="ltr"><<a href="mailto:ahatanak@gmail.com" target="_blank">ahatanak@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"><div class="gmail_extra"><div class="gmail_quote"><div><div class="m_-6603882699777641088m_-130265937175591984m_-6316849875079803067h5">On Tue, Nov 14, 2017 at 1:44 PM, Rong Xu 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: xur<br>
Date: Tue Nov 14 13:44:09 2017<br>
New Revision: 318202<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=318202&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=318202&view=rev</a><br>
Log:<br>
[CodeGen] Peel off the dominant case in switch statement in lowering<br>
<br>
This patch peels off the top case in switch statement into a branch if the<br>
probability exceeds a threshold. This will help the branch prediction and<br>
avoids the extra compares when lowering into chain of branches.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D39262" rel="noreferrer" target="_blank">http://reviews.llvm.org/D39262</a><br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/X86/sw<wbr>itch-lower-peel-top-case.ll<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/Selecti<wbr>onDAG/SelectionDAGBuilder.cpp<br>
    llvm/trunk/lib/CodeGen/Selecti<wbr>onDAG/SelectionDAGBuilder.h<br>
    llvm/trunk/test/CodeGen/Generi<wbr>c/MachineBranchProb.ll<br>
    llvm/trunk/test/CodeGen/System<wbr>Z/loop-03.ll<br>
    llvm/trunk/test/CodeGen/X86/sw<wbr>itch-bt.ll<br>
    llvm/trunk/test/CodeGen/X86/sw<wbr>itch.ll<br>
<br>
Modified: llvm/trunk/lib/CodeGen/Selecti<wbr>onDAG/SelectionDAGBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=318202&r1=318201&r2=318202&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/CodeGen/S<wbr>electionDAG/SelectionDAGBuilde<wbr>r.cpp?rev=318202&r1=318201&r2=<wbr>318202&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/Selecti<wbr>onDAG/SelectionDAGBuilder.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/Selecti<wbr>onDAG/SelectionDAGBuilder.cpp Tue Nov 14 13:44:09 2017<br>
@@ -134,6 +134,12 @@ LimitFPPrecision("limit-float-<wbr>precision"<br>
                  cl::location(LimitFloatPrecisi<wbr>on),<br>
                  cl::init(0));<br>
<br>
+static cl::opt<unsigned> SwitchPeelThreshold(<br>
+    "switch-peel-threshold", cl::Hidden, cl::init(66),<br>
+    cl::desc("Set the case probability threshold for peeling the case from a "<br>
+             "switch statement. A value greater than 100 will void this "<br>
+             "optimization"));<br>
+<br>
 // Limit the width of DAG chains. This is important in general to prevent<br>
 // DAG-based analysis from blowing up. For example, alias analysis and<br>
 // load clustering may not complete in reasonable time. It is difficult to<br>
@@ -9834,6 +9840,74 @@ void SelectionDAGBuilder::splitWork<wbr>Item(<br>
     SwitchCases.push_back(CB);<br>
 }<br>
<br>
+// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb<br>
+// from the swith statement.<br>
+static BranchProbability scaleCaseProbality(BranchProba<wbr>bility CaseProb,<br>
+                                            BranchProbability PeeledCaseProb) {<br>
+  if (PeeledCaseProb == BranchProbability::getOne())<br>
+    return BranchProbability::getZero();<br>
+  BranchProbability SwitchProb = PeeledCaseProb.getCompl();<br></blockquote><div><br></div><div><br></div></div></div><div>One of our internal bots is failing because the following line is causing an assertion in BranchProbability's constructor to fail:</div><div>







<p class="m_-6603882699777641088m_-130265937175591984m_-6316849875079803067m_-5947729045850750083gmail-p1">assert(Numerator <= Denominator && "Probability cannot be bigger than 1!")<br></p></div><div>Do you know why the Numerator is larger than the Denominator here?</div><div><div class="m_-6603882699777641088m_-130265937175591984m_-6316849875079803067h5"><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+  return BranchProbability(CaseProb.get<wbr>Numerator(),<br>
+                           SwitchProb.scale(CaseProb.get<wbr>Denominator()));<br>
+}<br>
+ </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+// Try to peel the top probability case if it exceeds the threshold.<br>
+// Return current MachineBasicBlock for the switch statement if the peeling<br>
+// does not occur.<br>
+// If the peeling is performed, return the newly created MachineBasicBlock<br>
+// for the peeled switch statement. Also update Clusters to remove the peeled<br>
+// case. PeeledCaseProb is the BranchProbability for the peeled case.<br>
+MachineBasicBlock *SelectionDAGBuilder::peelDomi<wbr>nantCaseCluster(<br>
+    const SwitchInst &SI, CaseClusterVector &Clusters,<br>
+    BranchProbability &PeeledCaseProb) {<br>
+  MachineBasicBlock *SwitchMBB = FuncInfo.MBB;<br>
+  // Don't perform if there is only one cluster or optimizing for size.<br>
+  if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||<br>
+      TM.getOptLevel() == CodeGenOpt::None ||<br>
+      SwitchMBB->getParent()->getFun<wbr>ction()->optForMinSize())<br>
+    return SwitchMBB;<br>
+<br>
+  BranchProbability TopCaseProb = BranchProbability(SwitchPeelTh<wbr>reshold, 100);<br>
+  unsigned PeeledCaseIndex = 0;<br>
+  bool SwitchPeeled = false;<br>
+  for (unsigned Index = 0; Index < Clusters.size(); ++Index) {<br>
+    CaseCluster &CC = Clusters[Index];<br>
+    if (CC.Prob < TopCaseProb)<br>
+      continue;<br>
+    TopCaseProb = CC.Prob;<br>
+    PeeledCaseIndex = Index;<br>
+    SwitchPeeled = true;<br>
+  }<br>
+  if (!SwitchPeeled)<br>
+    return SwitchMBB;<br>
+<br>
+  DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: " << TopCaseProb<br>
+               << "\n");<br>
+<br>
+  // Record the MBB for the peeled switch statement.<br>
+  MachineFunction::iterator BBI(SwitchMBB);<br>
+  ++BBI;<br>
+  MachineBasicBlock *PeeledSwitchMBB =<br>
+      FuncInfo.MF->CreateMachineBasi<wbr>cBlock(SwitchMBB->getBasicBloc<wbr>k());<br>
+  FuncInfo.MF->insert(BBI, PeeledSwitchMBB);<br>
+<br>
+  ExportFromCurrentBlock(SI.getC<wbr>ondition());<br>
+  auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;<br>
+  SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,<br>
+                          nullptr,   nullptr,      TopCaseProb.getCompl()};<br>
+  lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);<br>
+<br>
+  Clusters.erase(PeeledCaseIt);<br>
+  for (CaseCluster &CC : Clusters) {<br>
+    DEBUG(dbgs() << "Scale the probablity for one cluster, before scaling: "<br>
+                 << CC.Prob << "\n");<br>
+    CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);<br>
+    DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");<br>
+  }<br>
+  PeeledCaseProb = TopCaseProb;<br>
+  return PeeledSwitchMBB;<br>
+}<br>
+<br>
 void SelectionDAGBuilder::visitSwit<wbr>ch(const SwitchInst &SI) {<br>
   // Extract cases from the switch.<br>
   BranchProbabilityInfo *BPI = FuncInfo.BPI;<br>
@@ -9887,9 +9961,15 @@ void SelectionDAGBuilder::visitSwit<wbr>ch(co<br>
     }<br>
   }<br>
<br>
+  // The branch probablity of the peeled case.<br>
+  BranchProbability PeeledCaseProb = BranchProbability::getZero();<br>
+  MachineBasicBlock *PeeledSwitchMBB =<br>
+      peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);<br>
+<br>
   // If there is only the default destination, jump there directly.<br>
   MachineBasicBlock *SwitchMBB = FuncInfo.MBB;<br>
   if (Clusters.empty()) {<br>
+    assert(PeeledSwitchMBB == SwitchMBB);<br>
     SwitchMBB->addSuccessor(Defau<wbr>ltMBB);<br>
     if (DefaultMBB != NextBlock(SwitchMBB)) {<br>
       DAG.setRoot(DAG.getNode(ISD::<wbr>BR, getCurSDLoc(), MVT::Other,<br>
@@ -9921,8 +10001,14 @@ void SelectionDAGBuilder::visitSwit<wbr>ch(co<br>
   SwitchWorkList WorkList;<br>
   CaseClusterIt First = Clusters.begin();<br>
   CaseClusterIt Last = Clusters.end() - 1;<br>
-  auto DefaultProb = getEdgeProbability(SwitchMBB, DefaultMBB);<br>
-  WorkList.push_back({SwitchMBB, First, Last, nullptr, nullptr, DefaultProb});<br>
+  auto DefaultProb = getEdgeProbability(PeeledSwitc<wbr>hMBB, DefaultMBB);<br>
+  // Scale the branchprobability for DefaultMBB if the peel occurs and<br>
+  // DefaultMBB is not replaced.<br>
+  if (PeeledCaseProb != BranchProbability::getZero() &&<br>
+      DefaultMBB == FuncInfo.MBBMap[SI.getDefaultD<wbr>est()])<br>
+    DefaultProb = scaleCaseProbality(DefaultProb<wbr>, PeeledCaseProb);<br>
+  WorkList.push_back(<br>
+      {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});<br>
<br>
   while (!WorkList.empty()) {<br>
     SwitchWorkListItem W = WorkList.back();<br>
<br>
Modified: llvm/trunk/lib/CodeGen/Selecti<wbr>onDAG/SelectionDAGBuilder.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h?rev=318202&r1=318201&r2=318202&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/CodeGen/S<wbr>electionDAG/SelectionDAGBuilde<wbr>r.h?rev=318202&r1=318201&r2=31<wbr>8202&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/Selecti<wbr>onDAG/SelectionDAGBuilder.h (original)<br>
+++ llvm/trunk/lib/CodeGen/Selecti<wbr>onDAG/SelectionDAGBuilder.h Tue Nov 14 13:44:09 2017<br>
@@ -369,6 +369,10 @@ private:<br>
                      MachineBasicBlock *SwitchMBB,<br>
                      MachineBasicBlock *DefaultMBB);<br>
<br>
+  /// Peel the top probability case if it exceeds the threshold<br>
+  MachineBasicBlock *peelDominantCaseCluster(const SwitchInst &SI,<br>
+                                             CaseClusterVector &Clusters,<br>
+                                             BranchProbability &PeeledCaseProb);<br>
<br>
   /// A class which encapsulates all of the information needed to generate a<br>
   /// stack protector check and signals to isel via its state being initialized<br>
<br>
Modified: llvm/trunk/test/CodeGen/Generi<wbr>c/MachineBranchProb.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/MachineBranchProb.ll?rev=318202&r1=318201&r2=318202&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/CodeGen/<wbr>Generic/MachineBranchProb.ll?r<wbr>ev=318202&r1=318201&r2=318202&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/Generi<wbr>c/MachineBranchProb.ll (original)<br>
+++ llvm/trunk/test/CodeGen/Generi<wbr>c/MachineBranchProb.ll Tue Nov 14 13:44:09 2017<br>
@@ -19,12 +19,15 @@ entry:<br>
     i64 1, label %<a href="http://sw.bb" rel="noreferrer" target="_blank">sw.bb</a><br>
     i64 4, label %<a href="http://sw.bb" rel="noreferrer" target="_blank">sw.bb</a><br>
     i64 5, label %sw.bb1<br>
+    i64 15, label %<a href="http://sw.bb" rel="noreferrer" target="_blank">sw.bb</a><br>
   ], !prof !0<br>
 ; CHECK: BB#0: derived from LLVM BB %entry<br>
-; CHECK: Successors according to CFG: BB#2({{[0-9a-fx/= ]+}}75.29%) BB#4({{[0-9a-fx/= ]+}}24.71%)<br>
+; CHECK: Successors according to CFG: BB#1({{[0-9a-fx/= ]+}}92.17%) BB#4({{[0-9a-fx/= ]+}}7.83%)<br>
 ; CHECK: BB#4: derived from LLVM BB %entry<br>
-; CHECK: Successors according to CFG: BB#1({{[0-9a-fx/= ]+}}47.62%) BB#5({{[0-9a-fx/= ]+}}52.38%)<br>
+; CHECK: Successors according to CFG: BB#2({{[0-9a-fx/= ]+}}75.29%) BB#5({{[0-9a-fx/= ]+}}24.71%)<br>
 ; CHECK: BB#5: derived from LLVM BB %entry<br>
+; CHECK: Successors according to CFG: BB#1({{[0-9a-fx/= ]+}}47.62%) BB#6({{[0-9a-fx/= ]+}}52.38%)<br>
+; CHECK: BB#6: derived from LLVM BB %entry<br>
 ; CHECK: Successors according to CFG: BB#1({{[0-9a-fx/= ]+}}36.36%) BB#3({{[0-9a-fx/= ]+}}63.64%)<br>
<br>
 <a href="http://sw.bb" rel="noreferrer" target="_blank">sw.bb</a>:<br>
@@ -40,7 +43,7 @@ return:<br>
   ret i32 %retval.0<br>
 }<br>
<br>
-!0 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 4, i32 64}<br>
+!0 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 4, i32 64, i21 1000}<br>
<br>
<br>
 declare void @g(i32)<br>
<br>
Modified: llvm/trunk/test/CodeGen/System<wbr>Z/loop-03.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/SystemZ/loop-03.ll?rev=318202&r1=318201&r2=318202&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/CodeGen/<wbr>SystemZ/loop-03.ll?rev=318202&<wbr>r1=318201&r2=318202&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/System<wbr>Z/loop-03.ll (original)<br>
+++ llvm/trunk/test/CodeGen/System<wbr>Z/loop-03.ll Tue Nov 14 13:44:09 2017<br>
@@ -3,7 +3,7 @@<br>
 ; FP128 registers part of the callee saved registers list in order to avoid<br>
 ; spilling / reloading.<br>
 ;<br>
-; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s<br>
+; RUN: llc -switch-peel-threshold=101 < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s<br>
<br>
 %0 = type { %0*, %0*, %0*, i32, %1*, i64, i64, i64, i64, i64, i64, %2, %5, %7 }<br>
 %1 = type { i32, i32, i32 (%1*, i64, i32)*, i32 (%1*, i64, i64, i32, i8**)*, i32 (%1*, i64, i64, i64, i32)*, i32 (%1*)*, void (i8*)*, i8*, i8* }<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/sw<wbr>itch-bt.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/switch-bt.ll?rev=318202&r1=318201&r2=318202&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/CodeGen/<wbr>X86/switch-bt.ll?rev=318202&r1<wbr>=318201&r2=318202&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/sw<wbr>itch-bt.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/sw<wbr>itch-bt.ll Tue Nov 14 13:44:09 2017<br>
@@ -1,4 +1,4 @@<br>
-; RUN: llc -mtriple=x86_64-- -asm-verbose=false < %s -jump-table-density=40 | FileCheck %s<br>
+; RUN: llc -mtriple=x86_64-- -asm-verbose=false < %s -jump-table-density=40 -switch-peel-threshold=101 | FileCheck %s<br>
<br>
 ; This switch should use bit tests, and the third bit test case is just<br>
 ; testing for one possible value, so it doesn't need a bt.<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/sw<wbr>itch-lower-peel-top-case.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/switch-lower-peel-top-case.ll?rev=318202&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/CodeGen/<wbr>X86/switch-lower-peel-top-case<wbr>.ll?rev=318202&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/sw<wbr>itch-lower-peel-top-case.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/sw<wbr>itch-lower-peel-top-case.ll Tue Nov 14 13:44:09 2017<br>
@@ -0,0 +1,135 @@<br>
+; RUN: llc -stop-after=isel < %s  | FileCheck %s<br>
+<br>
+define i32 @foo(i32 %n) !prof !1 {<br>
+entry:<br>
+  switch i32 %n, label %bb_default [<br>
+    i32 8, label %bb1<br>
+    i32 -8826, label %bb2<br>
+    i32 18312, label %bb3<br>
+    i32 18568, label %bb4<br>
+    i32 129, label %bb5<br>
+  ], !prof !2<br>
+<br>
+; CHECK: successors: %[[PEELED_CASE_LABEL:.*]](0x59<wbr>99999a), %[[PEELED_SWITCH_LABEL:.*]](0x<wbr>26666666)<br>
+; CHECK:    %[[VAL:[0-9]+]]:gr32 = COPY %edi<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], 18568, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[PEELED_CASE_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[PEELED_SWITCH_LABEL]]<br>
+; CHECK:  [[PEELED_SWITCH_LABEL]]:<br>
+; CHECK:    successors: %[[BB1_LABEL:.*]](0x0206d3a0), %[[BB2_LABEL:.*]](0x7df92c60)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], 18311, implicit-def %eflags<br>
+; CHECK:    JG_1 %[[BB2_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[BB1_LABEL]]<br>
+; CHECK:  [[BB1_LABEL]]:<br>
+; CHECK:    successors: %[[CASE2_LABEL:.*]](0x35e50d5b<wbr>), %[[BB3_LABEL:.*]](0x4a1af2a5)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], -8826, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[CASE2_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[BB3_LABEL]]<br>
+; CHECK:  [[BB3_LABEL]]<br>
+; CHECK:    successors: %[[CASE5_LABEL:.*]](0x45d173c8<wbr>), %[[BB4_LABEL:.*]](0x3a2e8c38)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], 129, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[CASE5_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[BB4_LABEL]]<br>
+; CHECK:  [[BB4_LABEL:.*]]:<br>
+; CHECK:    successors: %[[CASE1_LABEL:.*]](0x66666666<wbr>), %[[DEFAULT_BB_LABEL:.*]](0x199<wbr>9999a)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 8, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[CASE1_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[DEFAULT_BB_LABEL]]<br>
+; CHECK:  [[BB2_LABEL]]:<br>
+; CHECK:    successors: %[[CASE3_LABEL:.*]](0x7fe44107<wbr>), %[[DEFAULT_BB_LABEL]](0x001bbe<wbr>f9)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], 18312, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[CASE3_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[DEFAULT_BB_LABEL]]<br>
+<br>
+bb1:<br>
+  br label %return<br>
+bb2:<br>
+  br label %return<br>
+bb3:<br>
+  br label %return<br>
+bb4:<br>
+  br label %return<br>
+bb5:<br>
+  br label %return<br>
+bb_default:<br>
+  br label %return<br>
+<br>
+return:<br>
+  %retval = phi i32 [ 0, %bb_default ], [ 5, %bb5 ], [ 4, %bb4 ], [ 3, %bb3 ], [ 2, %bb2 ], [ 1, %bb1 ]<br>
+  ret i32 %retval<br>
+}<br>
+<br>
+; Test the peeling of the merged cases value 85 and 86.<br>
+define i32 @foo1(i32 %n) !prof !1 {<br>
+entry:<br>
+  switch i32 %n, label %bb_default [<br>
+    i32 -40, label %bb1<br>
+    i32 86, label %bb2<br>
+    i32 85, label %bb2<br>
+    i32 1, label %bb3<br>
+    i32 5, label %bb4<br>
+    i32 7, label %bb5<br>
+    i32 49, label %bb6<br>
+  ], !prof !3<br>
+<br>
+; CHECK:   successors: %[[PEELED_CASE_LABEL:.*]](0x59<wbr>999999), %[[PEELED_SWITCH_LABEL:.*]](0x<wbr>26666667)<br>
+; CHECK:   %[[VAL:[0-9]+]]:gr32 = COPY %edi<br>
+; CHECK:   %{{[0-9]+}}:gr32 = ADD32ri8 %{{[0-9]+}}, -85, implicit-def dead %eflags<br>
+; CHECK:   %{{[0-9]+}}:gr32 = SUB32ri8 %{{[0-9]+}}, 2, implicit-def %eflags<br>
+; CHECK:   JB_1 %[[PEELED_CASE_LABEL]], implicit %eflags<br>
+; CHECK:   JMP_1 %[[PEELED_SWITCH_LABEL]]<br>
+; CHECK: [[PEELED_SWITCH_LABEL]]:<br>
+; CHECK:    successors: %[[BB1_LABEL:.*]](0x0088888a), %[[BB2_LABEL:.*]](0x7f777776)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 4, implicit-def %eflags<br>
+; CHECK:    JG_1 %[[BB2_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[BB1_LABEL]]<br>
+; CHECK:  [[BB1_LABEL]]:<br>
+; CHECK:    successors: %[[CASE4_LABEL:.*]](0x7f775a4f<wbr>), %[[BB3_LABEL:.*]](0x0088a5b1)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 1, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[CASE4_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[BB3_LABEL]]<br>
+; CHECK:  [[BB3_LABEL]]:<br>
+; CHECK:    successors: %[[CASE1_LABEL:.*]](0x66666666<wbr>), %[[DEFAULT_BB_LABEL:.*]](0x199<wbr>9999a)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], -40, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[CASE1_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[DEFAULT_BB_LABEL]]<br>
+; CHECK:  [[BB2_LABEL]]:<br>
+; CHECK:    successors: %[[CASE5_LABEL:.*]](0x00000000<wbr>), %[[BB4_LABEL:.*]](0x80000000)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 5, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[CASE5_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[BB4_LABEL]]<br>
+; CHECK:  [[BB4_LABEL]]:<br>
+; CHECK:    successors: %[[CASE6_LABEL:.*]](0x00000000<wbr>), %[[BB5_LABEL:.*]](0x80000000)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 7, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[CASE6_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[BB5_LABEL]]<br>
+; CHECK:  [[BB5_LABEL]]:<br>
+; CHECK:    successors: %[[CASE7_LABEL:.*]](0x00000000<wbr>), %[[DEFAULT_BB_LABEL]](0x800000<wbr>00)<br>
+; CHECK:    %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 49, implicit-def %eflags<br>
+; CHECK:    JE_1 %[[CASE7_LABEL]], implicit %eflags<br>
+; CHECK:    JMP_1 %[[DEFAULT_BB_LABEL]]<br>
+<br>
+<br>
+bb1:<br>
+  br label %return<br>
+bb2:<br>
+  br label %return<br>
+bb3:<br>
+  br label %return<br>
+bb4:<br>
+  br label %return<br>
+bb5:<br>
+  br label %return<br>
+bb6:<br>
+  br label %return<br>
+bb_default:<br>
+  br label %return<br>
+<br>
+return:<br>
+  %retval = phi i32 [ 0, %bb_default ], [ 6, %bb6 ], [ 5, %bb5 ], [ 4, %bb4 ], [ 3, %bb3 ], [ 2, %bb2 ], [ 1, %bb1 ]<br>
+  ret i32 %retval<br>
+}<br>
+!1 = !{!"function_entry_count", i64 100000}<br>
+!2 = !{!"branch_weights", i32 50, i32 100, i32 200, i32 29500, i32 70000, i32 150}<br>
+!3 = !{!"branch_weights", i32 50, i32 100, i32 500, i32 69500, i32 29850, i32 0, i32 0, i32 0}<br>
+<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/sw<wbr>itch.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/switch.ll?rev=318202&r1=318201&r2=318202&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/CodeGen/<wbr>X86/switch.ll?rev=318202&r1=31<wbr>8201&r2=318202&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/sw<wbr>itch.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/sw<wbr>itch.ll Tue Nov 14 13:44:09 2017<br>
@@ -1,4 +1,4 @@<br>
-; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -jump-table-density=40 -verify-machineinstrs | FileCheck %s<br>
+; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -jump-table-density=40 -switch-peel-threshold=101 -verify-machineinstrs | FileCheck %s<br>
 ; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -O0 -jump-table-density=40 -verify-machineinstrs | FileCheck --check-prefix=NOOPT %s<br>
<br>
 declare void @g(i32)<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></div></div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>