[llvm] r278288 - Codegen: Don't tail-duplicate blocks with un-analyzable fallthrough.

Kyle Butt via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 10 14:03:27 PDT 2016


Author: iteratee
Date: Wed Aug 10 16:03:27 2016
New Revision: 278288

URL: http://llvm.org/viewvc/llvm-project?rev=278288&view=rev
Log:
Codegen: Don't tail-duplicate blocks with un-analyzable fallthrough.

If AnalyzeBranch can't analyze a block and it is possible to
fallthrough, then duplicating the block doesn't make sense, as only one
block can be the layout predecessor for the un-analyzable fallthrough.

Submitted wit a test case, but NOTE: the test case doesn't currently
fail. However, the test case fails with D20505 and would have saved me
some time debugging.

Added:
    llvm/trunk/test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll
Modified:
    llvm/trunk/lib/CodeGen/TailDuplicator.cpp

Modified: llvm/trunk/lib/CodeGen/TailDuplicator.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TailDuplicator.cpp?rev=278288&r1=278287&r2=278288&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/TailDuplicator.cpp (original)
+++ llvm/trunk/lib/CodeGen/TailDuplicator.cpp Wed Aug 10 16:03:27 2016
@@ -525,6 +525,16 @@ bool TailDuplicator::shouldTailDuplicate
   else
     MaxDuplicateCount = TailDuplicateSize;
 
+  // If the block to be duplicated ends in an unanalyzable fallthrough, don't
+  // duplicate it.
+  // A similar check is necessary in MachineBlockPlacement to make sure pairs of
+  // blocks with unanalyzable fallthrough get layed out contiguously.
+  MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
+  SmallVector<MachineOperand, 4> PredCond;
+  if (TII->analyzeBranch(TailBB, PredTBB, PredFBB, PredCond, true)
+      && TailBB.canFallThrough())
+    return false;
+
   // If the target has hardware branch prediction that can handle indirect
   // branches, duplicating them can often make them predictable when there
   // are common paths through the code.  The limit needs to be high enough

Added: llvm/trunk/test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll?rev=278288&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll (added)
+++ llvm/trunk/test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll Wed Aug 10 16:03:27 2016
@@ -0,0 +1,34 @@
+; RUN: llc -O2 < %s | FileCheck %s
+target datalayout = "e-m:e-i64:64-n32:64"
+target triple = "powerpc64le-unknown-linux-gnu"
+
+; Check that the conditional return block of fmax_double3.exit was not
+; duplicated into the if.then.i block
+; CHECK: # %if.then.i
+; CHECK: lxvd2x
+; CHECK: stxvd2x
+; CHECK-NOT: bclr
+; CHECK: {{^}}.LBB{{[0-9_]+}}:
+; CHECK-SAME: # %fmax_double3.exit
+; CHECK: bclr
+; CHECK: # %if.then
+; Function Attrs: nounwind
+define void @__fmax_double3_3D_exec(<2 x double>* %input6, i1 %bool1, i1 %bool2) #0 {
+entry:
+  br i1 %bool1, label %if.then.i, label %fmax_double3.exit
+
+if.then.i:                                        ; preds = %entry
+  store <2 x double> zeroinitializer, <2 x double>* %input6, align 32
+  br label %fmax_double3.exit
+
+fmax_double3.exit:                                ; preds = %if.then.i, %entry
+  br i1 %bool2, label %if.then, label %do.end
+
+if.then:                                          ; preds = %fmax_double3.exit
+  unreachable
+
+do.end:                                           ; preds = %fmax_double3.exit
+  ret void
+}
+
+attributes #0 = { nounwind }




More information about the llvm-commits mailing list