mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-29 14:20:29 +00:00
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. llvm-svn: 278866
This commit is contained in:
parent
96ff513197
commit
20ea50752e
@ -518,6 +518,16 @@ bool TailDuplicator::shouldTailDuplicate(const MachineFunction &MF,
|
||||
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
|
||||
|
34
test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll
Normal file
34
test/CodeGen/PowerPC/tail-dup-analyzable-fallthrough.ll
Normal file
@ -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 }
|
Loading…
Reference in New Issue
Block a user