<div dir="ltr"><br><br><div class="gmail_quote">On Sat, May 23, 2015 at 5:25 AM Hal Finkel <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: hfinkel<br>
Date: Sat May 23 07:18:10 2015<br>
New Revision: 238097<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D238097-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=yu6w6lCRC4y8NKi0OlNTnSgQRV1T2dVpRYz7T2RHF9Y&s=HEEpf1LJC6vBq6e6ZoU7g5lJa_UCwOfJV42Ee2AzPDk&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=238097&view=rev</a><br>
Log:<br>
[PowerPC] Fix fast-isel when compare is split from branch<br>
<br>
When the compare feeding a branch was in a different BB from the branch, we'd<br>
try to "regenerate" the compare in the block with the branch, possibly trying<br>
to make use of values not available there. Copy a page from AArch64's play book<br>
here to fix the problem (at least in terms of correctness).<br>
<br>
Fixes PR23640.<br>
<br></blockquote><div><br></div><div>Thanks! Glad someone had a small testcase :)</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
   // For now, just try the simplest case where it's fed by a compare.<br>
   if (const CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition())) {<br>
-    Optional<PPC::Predicate> OptPPCPred = getComparePred(CI->getPredicate());<br>
-    if (!OptPPCPred)<br>
-      return false;<br>
+    if (isValueAvailable(CI)) {<br></blockquote><div><br></div><div>Early exit to reduce indenting?</div><div><br></div><div>-eric</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      Optional<PPC::Predicate> OptPPCPred = getComparePred(CI->getPredicate());<br>
+      if (!OptPPCPred)<br>
+        return false;<br>
+<br>
+      PPC::Predicate PPCPred = OptPPCPred.getValue();<br>
+<br>
+      // Take advantage of fall-through opportunities.<br>
+      if (FuncInfo.MBB->isLayoutSuccessor(TBB)) {<br>
+        std::swap(TBB, FBB);<br>
+        PPCPred = PPC::InvertPredicate(PPCPred);<br>
+      }<br>
<br>
-    PPC::Predicate PPCPred = OptPPCPred.getValue();<br>
+      unsigned CondReg = createResultReg(&PPC::CRRCRegClass);<br>
<br>
-    // Take advantage of fall-through opportunities.<br>
-    if (FuncInfo.MBB->isLayoutSuccessor(TBB)) {<br>
-      std::swap(TBB, FBB);<br>
-      PPCPred = PPC::InvertPredicate(PPCPred);<br>
+      if (!PPCEmitCmp(CI->getOperand(0), CI->getOperand(1), CI->isUnsigned(),<br>
+                      CondReg))<br>
+        return false;<br>
+<br>
+      BuildMI(*BrBB, FuncInfo.InsertPt, DbgLoc, TII.get(PPC::BCC))<br>
+        .addImm(PPCPred).addReg(CondReg).addMBB(TBB);<br>
+      fastEmitBranch(FBB, DbgLoc);<br>
+      FuncInfo.MBB->addSuccessor(TBB);<br>
+      return true;<br>
     }<br>
-<br>
-    unsigned CondReg = createResultReg(&PPC::CRRCRegClass);<br>
-<br>
-    if (!PPCEmitCmp(CI->getOperand(0), CI->getOperand(1), CI->isUnsigned(),<br>
-                    CondReg))<br>
-      return false;<br>
-<br>
-    BuildMI(*BrBB, FuncInfo.InsertPt, DbgLoc, TII.get(PPC::BCC))<br>
-      .addImm(PPCPred).addReg(CondReg).addMBB(TBB);<br>
-    fastEmitBranch(FBB, DbgLoc);<br>
-    FuncInfo.MBB->addSuccessor(TBB);<br>
-    return true;<br>
-<br>
   } else if (const ConstantInt *CI =<br>
              dyn_cast<ConstantInt>(BI->getCondition())) {<br>
     uint64_t Imm = CI->getZExtValue();<br>
<br>
Added: llvm/trunk/test/CodeGen/PowerPC/fast-isel-icmp-split.ll<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_PowerPC_fast-2Disel-2Dicmp-2Dsplit.ll-3Frev-3D238097-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=yu6w6lCRC4y8NKi0OlNTnSgQRV1T2dVpRYz7T2RHF9Y&s=MErByfVSiWRUurEGePKY-inKm2CDPOM7xsuE54F7r-U&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/fast-isel-icmp-split.ll?rev=238097&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/PowerPC/fast-isel-icmp-split.ll (added)<br>
+++ llvm/trunk/test/CodeGen/PowerPC/fast-isel-icmp-split.ll Sat May 23 07:18:10 2015<br>
@@ -0,0 +1,72 @@<br>
+; RUN: llc -O0 -relocation-model=pic < %s | FileCheck %s<br>
+target datalayout = "E-m:e-i64:64-n32:64"<br>
+target triple = "powerpc64-bgq-linux"<br>
+<br>
+%"class.std::__1::__tree_node.130.151" = type { %"class.std::__1::__tree_node_base.base.128.149", %"class.boost::serialization::extended_type_info.129.150"* }<br>
+%"class.std::__1::__tree_node_base.base.128.149" = type <{ %"class.std::__1::__tree_end_node.127.148", %"class.std::__1::__tree_node_base.126.147"*, %"class.std::__1::__tree_node_base.126.147"*, i8 }><br>
+%"class.std::__1::__tree_end_node.127.148" = type { %"class.std::__1::__tree_node_base.126.147"* }<br>
+%"class.std::__1::__tree_node_base.126.147" = type <{ %"class.std::__1::__tree_end_node.127.148", %"class.std::__1::__tree_node_base.126.147"*, %"class.std::__1::__tree_node_base.126.147"*, i8, [7 x i8] }><br>
+%"class.boost::serialization::extended_type_info.129.150" = type { i32 (...)**, i32, i8* }<br>
+<br>
+; Function Attrs: noinline<br>
+define void @_ZN5boost13serialization18extended_type_info4findEPKc() #0 align 2 {<br>
+entry:<br>
+  br i1 undef, label %cond.true, label %cond.false<br>
+<br>
+; CHECK: @_ZN5boost13serialization18extended_type_info4findEPKc<br>
+<br>
+cond.true:                                        ; preds = %entry<br>
+  br label %cond.end<br>
+<br>
+cond.false:                                       ; preds = %entry<br>
+  unreachable<br>
+                                                  ; No predecessors!<br>
+  br label %cond.end<br>
+<br>
+cond.end:                                         ; preds = %0, %cond.true<br>
+  invoke void @_ZNKSt3__16__treeIPKN5boost13serialization18extended_type_infoENS2_6detail11key_compareENS_9allocatorIS5_EEE4findIS5_EENS_21__tree_const_iteratorIS5_PNS_11__tree_nodeIS5_PvEElEERKT_()<br>
+          to label %_ZNKSt3__18multisetIPKN5boost13serialization18extended_type_infoENS2_6detail11key_compareENS_9allocatorIS5_EEE4findERKS5_.exit unwind label %lpad<br>
+<br>
+_ZNKSt3__18multisetIPKN5boost13serialization18extended_type_infoENS2_6detail11key_compareENS_9allocatorIS5_EEE4findERKS5_.exit: ; preds = %cond.end<br>
+  br label %invoke.cont<br>
+<br>
+invoke.cont:                                      ; preds = %_ZNKSt3__18multisetIPKN5boost13serialization18extended_type_infoENS2_6detail11key_compareENS_9allocatorIS5_EEE4findERKS5_.exit<br>
+  %1 = load %"class.std::__1::__tree_node.130.151"*, %"class.std::__1::__tree_node.130.151"** undef, align 8<br>
+  %cmp.i = icmp eq %"class.std::__1::__tree_node.130.151"* undef, %1<br>
+  br label %invoke.cont.2<br>
+<br>
+invoke.cont.2:                                    ; preds = %invoke.cont<br>
+  br i1 %cmp.i, label %if.then, label %if.end<br>
+<br>
+if.then:                                          ; preds = %invoke.cont.2<br>
+  br label %cleanup<br>
+<br>
+lpad:                                             ; preds = %cond.end<br>
+  %2 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)<br>
+          cleanup<br>
+  br label %eh.resume<br>
+<br>
+if.end:                                           ; preds = %invoke.cont.2<br>
+  br label %invoke.cont.4<br>
+<br>
+invoke.cont.4:                                    ; preds = %if.end<br>
+  br label %cleanup<br>
+<br>
+cleanup:                                          ; preds = %invoke.cont.4, %if.then<br>
+  ret void<br>
+<br>
+eh.resume:                                        ; preds = %lpad<br>
+  resume { i8*, i32 } undef<br>
+}<br>
+<br>
+declare i32 @__gxx_personality_v0(...)<br>
+<br>
+; Function Attrs: noinline<br>
+declare void @_ZNKSt3__16__treeIPKN5boost13serialization18extended_type_infoENS2_6detail11key_compareENS_9allocatorIS5_EEE4findIS5_EENS_21__tree_const_iteratorIS5_PNS_11__tree_nodeIS5_PvEElEERKT_() #0 align 2<br>
+<br>
+attributes #0 = { noinline "target-cpu"="a2q" }<br>
+<br>
+!llvm.module.flags = !{!0}<br>
+<br>
+!0 = !{i32 1, !"PIC Level", i32 2}<br>
+<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>