mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-10 22:46:25 +00:00
Codegen: Tail Merge: Be less aggressive with special cases.
This change makes it possible for tail-duplication and tail-merging to be disjoint. By being less aggressive when merging during layout, there are no overlapping cases between tail-duplication and tail-merging, provided the thresholds are disjoint. There is a remaining TODO to benchmark the succ_size() test for non-layout tail merging. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278265 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4425f12c5d
commit
c04b985f53
@ -597,7 +597,8 @@ ProfitableToMerge(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2,
|
||||
MachineBasicBlock::iterator &I1,
|
||||
MachineBasicBlock::iterator &I2, MachineBasicBlock *SuccBB,
|
||||
MachineBasicBlock *PredBB,
|
||||
DenseMap<const MachineBasicBlock *, int> &FuncletMembership) {
|
||||
DenseMap<const MachineBasicBlock *, int> &FuncletMembership,
|
||||
bool AfterPlacement) {
|
||||
// It is never profitable to tail-merge blocks from two different funclets.
|
||||
if (!FuncletMembership.empty()) {
|
||||
auto Funclet1 = FuncletMembership.find(MBB1);
|
||||
@ -617,7 +618,11 @@ ProfitableToMerge(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2,
|
||||
|
||||
// It's almost always profitable to merge any number of non-terminator
|
||||
// instructions with the block that falls through into the common successor.
|
||||
if (MBB1 == PredBB || MBB2 == PredBB) {
|
||||
// This is true only for a single successor. For multiple successors, we are
|
||||
// trading a conditional branch for an unconditional one.
|
||||
// TODO: Re-visit successor size for non-layout tail merging.
|
||||
if ((MBB1 == PredBB || MBB2 == PredBB) &&
|
||||
(!AfterPlacement || MBB1->succ_size() == 1)) {
|
||||
MachineBasicBlock::iterator I;
|
||||
unsigned NumTerms = CountTerminators(MBB1 == PredBB ? MBB2 : MBB1, I);
|
||||
if (CommonTailLen > NumTerms)
|
||||
@ -635,9 +640,12 @@ ProfitableToMerge(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2,
|
||||
|
||||
// If both blocks have an unconditional branch temporarily stripped out,
|
||||
// count that as an additional common instruction for the following
|
||||
// heuristics.
|
||||
// heuristics. This heuristic is only accurate for single-succ blocks, so to
|
||||
// make sure that during layout merging and duplicating don't crash, we check
|
||||
// for that when merging during layout.
|
||||
unsigned EffectiveTailLen = CommonTailLen;
|
||||
if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
|
||||
(MBB1->succ_size() == 1 || !AfterPlacement) &&
|
||||
!MBB1->back().isBarrier() &&
|
||||
!MBB2->back().isBarrier())
|
||||
++EffectiveTailLen;
|
||||
@ -682,7 +690,8 @@ unsigned BranchFolder::ComputeSameTails(unsigned CurHash,
|
||||
minCommonTailLength,
|
||||
CommonTailLen, TrialBBI1, TrialBBI2,
|
||||
SuccBB, PredBB,
|
||||
FuncletMembership)) {
|
||||
FuncletMembership,
|
||||
AfterBlockPlacement)) {
|
||||
if (CommonTailLen > maxCommonTailLength) {
|
||||
SameTails.clear();
|
||||
maxCommonTailLength = CommonTailLen;
|
||||
|
@ -1,8 +1,8 @@
|
||||
; RUN: llc -mtriple=arm-eabi %s -o - | FileCheck %s
|
||||
|
||||
; CHECK-LABEL: t:
|
||||
; CHECK: subgt
|
||||
; CHECK: suble
|
||||
; CHECK-DAG: subgt
|
||||
; CHECK-DAG: suble
|
||||
define i32 @t(i32 %a, i32 %b) {
|
||||
entry:
|
||||
%tmp1434 = icmp eq i32 %a, %b ; <i1> [#uses=1]
|
||||
|
@ -17,7 +17,7 @@
|
||||
; CHECK: [[DST:r[0-9]+]] = [[SRC:r[0-9]+]]
|
||||
; CHECK-DAG: memw([[SRC]]
|
||||
; CHECK-NOT: memw([[DST]]
|
||||
; CHECK-LABEL: LBB0_2
|
||||
; CHECK: %if.end
|
||||
|
||||
target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32"
|
||||
target triple = "hexagon"
|
||||
|
Loading…
x
Reference in New Issue
Block a user