[PATCH] D28583: CodeGen: Allow small copyable blocks to "break" the CFG.
David Li via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 20 16:19:35 PST 2017
davidxl added inline comments.
================
Comment at: lib/CodeGen/MachineBlockPlacement.cpp:268
/// \brief A typedef for a block filter set.
- typedef SmallSetVector<MachineBasicBlock *, 16> BlockFilterSet;
+ typedef SmallDenseSet<MachineBasicBlock *, 16> BlockFilterSet;
+
----------------
iteratee wrote:
> davidxl wrote:
> > There is a reason SmallSetVector is used here -- to make sure the iteration order is deterministic.
> BlockFilterSet is never iterated. I checked.
See
for (MachineBasicBlock *LoopBB : LoopBlockSet)
fillWorkLists(LoopBB, UpdatedPreds, &LoopBlockSet);
================
Comment at: lib/CodeGen/MachineBlockPlacement.cpp:675
+ BlockFrequency Qout = BBFreq * (AdjustedSumProb - PProb);
+ BlockFrequency Qin = BestSuccPred;
+ // If it doesn't have a post-dominating successor, here is the calculation:
----------------
iteratee wrote:
> davidxl wrote:
> > Qin is not necessarily BestSuccPred.
> >
> > Profitability check is called only after hasBetterLayoutPredecessor is returned and it returns true. There are two scenarios it returns true
> > 1) Qin or Qout is larger than P, or
> > 2) P is larger than Qout, but not the branch is not biased enough such that the layout algorithm still decides to keep the top-order.
> >
> > Either way, the baseline layout to compare (with taildup) is that BB->Succ is the branch taken edge, and BB->C is the fall through edge. Qin should just be Prob(BB->C)
> When we place Succ, we remove 2 fallthrough edges BB->C and C'->Succ.
>
> Freq(C'->Succ) may be larger than Freq(BB->C).
> I am using Qin to represent Freq(C'->Succ) and Qout for Freq(BB->C). I could just use different letters if that were more clear.
>
> Qout is Freq(BB->C). I don't think Qin should be as well.
differentiate Qin and Qout is fine, but in the code Qin = BestSuccPred which could be Freq(BB->Succ). What I meant is you should directly compute Qin as its definition Freq(C'->Succ)
================
Comment at: lib/CodeGen/MachineBlockPlacement.cpp:697
+ BlockFrequency BaseCost = P + V;
+ BlockFrequency DupCost = Qout + QinV + P * AdjustedSuccSumProb;
+ return (BaseCost > DupCost);
----------------
iteratee wrote:
> davidxl wrote:
> > The base cost is as wrote, the DupCost however depends on whether P > Q or not.
> >
> > If P > Q, the fallthrough path is BB->Succ->D
> > so the cost (normalized with freq(bb) ==1) is
> > 2*Q+ P*V
> >
> > If P < Q, the fall through path is BB->C'->D
> > the cost is
> > 2*P + Q*V
> This function is called in a loop looking for the highest probability successor. If Q > P, this function will be ignored and we will lay out Q anyway, so we can ignore the second case.
>
> As to the first case:
> Until the 2nd patch lands, the duplication will prevent the BB->Succ->D layout.
>
> Instead you will get BB->Succ ; C'->D
> So the cost is as calculated.
> D28522 will include an update to this calculation along with an update to the behavior.
You are right about Q > P case that that scenario will be dropped. It is very subtle, so please add some comment to clarify.
Ok -- for the first case, also add a comment
================
Comment at: lib/CodeGen/MachineBlockPlacement.cpp:840
+/// considered
+/// \p Lookahead: if non-null, a set of blocks to ignore.
bool MachineBlockPlacement::hasBetterLayoutPredecessor(
----------------
iteratee wrote:
> davidxl wrote:
> > Add more description about what blocks to ignore.
> Well, that's really up to the caller. Do you want me to list why you might want to ignore a block?
something like : e.g, when called under xxx, we want to ignore yyy. See caller zzz for details. However, see my comment in the function, this parameter seems unnecessary.
================
Comment at: lib/CodeGen/MachineBlockPlacement.cpp:974
+ BlockToChain[Pred] == &Chain ||
+ (LookAhead && LookAhead->count(Pred)))
continue;
----------------
I think it is equivalent to check Pred == BB. In normal calling context, this is covered by BlockToChain[Pred] == &Chain, but for lookahead case, it is needed to filter BB which is not laid out yet.
https://reviews.llvm.org/D28583
More information about the llvm-commits
mailing list