[PATCH] D20604: Codegen: Don't tail-duplicate blocks with un-analyzable fallthrough.
Kyle Butt via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 27 18:22:05 PDT 2016
iteratee updated this revision to Diff 65852.
iteratee added a comment.
Expanded comment.
https://reviews.llvm.org/D20604
Files:
lib/CodeGen/TailDuplicator.cpp
test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll
Index: test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll
===================================================================
--- /dev/null
+++ test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll
@@ -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 }
Index: lib/CodeGen/TailDuplicator.cpp
===================================================================
--- lib/CodeGen/TailDuplicator.cpp
+++ lib/CodeGen/TailDuplicator.cpp
@@ -591,6 +591,16 @@
}
}
+ // 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 (HasIndirectbr && PreRegAlloc)
return true;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20604.65852.patch
Type: text/x-patch
Size: 2103 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160728/889e4a1a/attachment.bin>
More information about the llvm-commits
mailing list