[llvm-commits] [llvm] r111221 - in /llvm/trunk: lib/CodeGen/MachineBasicBlock.cpp lib/CodeGen/PHIElimination.cpp test/CodeGen/ARM/code-placement.ll test/CodeGen/X86/lsr-reuse.ll
Evan Cheng
evan.cheng at apple.com
Tue Aug 17 12:50:50 PDT 2010
On Aug 17, 2010, at 11:09 AM, Jakob Stoklund Olesen wrote:
>
> On Aug 17, 2010, at 10:49 AM, Evan Cheng wrote:
>
>>
>> On Aug 17, 2010, at 12:11 AM, Jakob Stoklund Olesen wrote:
>
>>> Careful you don't dereference a NULL pointer. You can't count on MLI being available here.
>>
>> Right.
>>
>>>
>>> Also, I think the decision to not split a back edge should go in PHIElimination as a policy decision. Other callers of SplitCriticalEdge may have really good reasons for splitting a back edge. That should be allowed.
>>
>> I have mixed feeling about this. In theory code placement optimization passes should be able to fix this. That's why the check in codegenprep's critical edge splitting is called a hack. I thought it a good idea to put the hack in one place only. Anyway, I'm moving the check to phi elimination (and fixed it) and I'll keep an eye on other clients.
>
> Thanks.
>
> I like the idea that SplitCriticalEdge only returns false when it would be impossible to split the edge. We could add a ShouldSplitCriticalEdge to indicate that it would be a really bad idea.
>
> If the new block is placed after its predecessor, you get a loop with a conditional branch in the middle and an unconditional branch at the bottom. That's not so bad, is it?
That adds a second branch inside a loop. That can be plenty bad for small tight loops.
>
>
> @@ -392,8 +393,14 @@
> // We break edges when registers are live out from the predecessor block
> // (not considering PHI nodes). If the register is live in to this block
> // anyway, we would gain nothing from splitting.
> - if (!LV.isLiveIn(Reg, MBB) && LV.isLiveOut(Reg, *PreMBB))
> - Changed |= PreMBB->SplitCriticalEdge(&MBB, this) != 0;
> + // Avoid splitting backedges of loops. It would introduce small
> + // out-of-line blocks into the loop which is very bad for code placement.
> + if (PreMBB != &MBB &&
> + !LV.isLiveIn(Reg, MBB) && LV.isLiveOut(Reg, *PreMBB)) {
> + if (!(MLI->getLoopFor(PreMBB) == MLI->getLoopFor(&MBB) &&
> + MLI->isLoopHeader(&MBB)))
> + Changed |= PreMBB->SplitCriticalEdge(&MBB, this) != 0;
> + }
> }
> }
> return true;
>
> You're doing it again ;-) You shouldn't expect MLI to be non-NULL here.
This is in PHI elimination which is explicitly asking for machineloopinfo. Can it ever be null?
Evan
>
> /jakob
>
More information about the llvm-commits
mailing list