[llvm-dev] [llvm] r281947 - Merge branch 'ADCE5'
Mehdi Amini via llvm-dev
llvm-dev at lists.llvm.org
Tue Sep 20 09:35:35 PDT 2016
Hi,
Right, this is the commit that should have been pushed.
I.e. do not merge when it is not fast-forward (rebase first).
—
Mehdi
> On Sep 19, 2016, at 4:30 PM, David Callahan via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> Here is the commit message before the merge:
>
> commit 31ef23572a34b5a72fb7fafb366f33145a65040f
> Author: David Callahan <dcallahan at fb.com>
> Date: Mon Sep 19 10:35:53 2016 -0700
>
> [ADCE] Add handling of PHI nodes when removing control flow
>
> Summary:
> This is part of a series of patches to evolve ADCE.cpp to support
> removing of unnecessary control flow.
>
> This patch updates the propagation of liveness information to handle
> special properties of PHI nodes.
>
> We still force all terminators live for now until we add code to
> handle removing control flow in a later patch.
>
> No changes to effective behavior with this patch
>
> Previous patches:
>
> D23559 [ADCE] Add control dependence computation
> D23225 [ADCE] Modify data structures to support removing control flow
> D23065 [ADCE] Refactor anticipating new functionality (NFC)
> D23102 [ADCE] Refactoring for new functionality (NFC)
>
> Reviewers: nadav, mehdi_amini, majnemer
>
> Subscribers: dberlin, david2050, twoh, freik, llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D23824
>
>
>
> On 9/19/16, 4:27 PM, "davide.italiano at gmail.com on behalf of Davide
> Italiano" <davide.italiano at gmail.com on behalf of davide at freebsd.org>
> wrote:
>
>> On Mon, Sep 19, 2016 at 4:17 PM, David Callahan via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>>> Author: david2050
>>> Date: Mon Sep 19 18:17:58 2016
>>> New Revision: 281947
>>>
>>> URL:
>>> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-
>>> 2Dproject-3Frev-3D281947-26view-3Drev&d=DQIBaQ&c=5VD0RTtNlTh3ycd41b3MUw&r
>>> =lFyiPUrFdOHdaobP7i4hoA&m=aF4YjS_zffE7xmWFF3NHixWmJDryeTmgfitEV2eM6uM&s=5
>>> S3QnxofIoK-gW1X9ECn8uoglysRzrFnV0jSKwZZtN0&e=
>>> Log:
>>> Merge branch 'ADCE5'
>>>
>>
>> Uh, could you provide a saner commit message next time? :)
>>
>>> Modified:
>>> llvm/trunk/lib/Transforms/Scalar/ADCE.cpp
>>>
>>> Modified: llvm/trunk/lib/Transforms/Scalar/ADCE.cpp
>>> URL:
>>> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-
>>> 2Dproject_llvm_trunk_lib_Transforms_Scalar_ADCE.cpp-3Frev-3D281947-26r1-3
>>> D281946-26r2-3D281947-26view-3Ddiff&d=DQIBaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=l
>>> FyiPUrFdOHdaobP7i4hoA&m=aF4YjS_zffE7xmWFF3NHixWmJDryeTmgfitEV2eM6uM&s=dL0
>>> ax0P5ToacB94_q2QZBWFwmnsJsBpUDI6lb9WVxZI&e=
>>>
>>> =========================================================================
>>> =====
>>> --- llvm/trunk/lib/Transforms/Scalar/ADCE.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/Scalar/ADCE.cpp Mon Sep 19 18:17:58 2016
>>> @@ -58,6 +58,10 @@ struct BlockInfoType {
>>> bool Live = false;
>>> /// True when this block ends in an unconditional branch.
>>> bool UnconditionalBranch = false;
>>> + /// True when this block is known to have live PHI nodes.
>>> + bool HasLivePhiNodes = false;
>>> + /// Control dependence sources need to be live for this block.
>>> + bool CFLive = false;
>>>
>>> /// Quick access to the LiveInfo for the terminator,
>>> /// holds the value &InstInfo[Terminator]
>>> @@ -109,6 +113,9 @@ class AggressiveDeadCodeElimination {
>>> void markLiveInstructions();
>>> /// Mark an instruction as live.
>>> void markLive(Instruction *I);
>>> +
>>> + /// Mark terminators of control predecessors of a PHI node live.
>>> + void markPhiLive(PHINode *PN);
>>>
>>> /// Record the Debug Scopes which surround live debug information.
>>> void collectLiveScopes(const DILocalScope &LS);
>>> @@ -269,15 +276,18 @@ void AggressiveDeadCodeElimination::mark
>>> // where we need to mark the inputs as live.
>>> while (!Worklist.empty()) {
>>> Instruction *LiveInst = Worklist.pop_back_val();
>>> + DEBUG(dbgs() << "work live: "; LiveInst->dump(););
>>>
>>> // Collect the live debug info scopes attached to this
>>> instruction.
>>> if (const DILocation *DL = LiveInst->getDebugLoc())
>>> collectLiveScopes(*DL);
>>>
>>> - DEBUG(dbgs() << "work live: "; LiveInst->dump(););
>>> for (Use &OI : LiveInst->operands())
>>> if (Instruction *Inst = dyn_cast<Instruction>(OI))
>>> markLive(Inst);
>>> +
>>> + if (auto *PN = dyn_cast<PHINode>(LiveInst))
>>> + markPhiLive(PN);
>>> }
>>> markLiveBranchesFromControlDependences();
>>>
>>> @@ -315,7 +325,10 @@ void AggressiveDeadCodeElimination::mark
>>>
>>> DEBUG(dbgs() << "mark block live: " << BBInfo.BB->getName() << '\n');
>>> BBInfo.Live = true;
>>> - NewLiveBlocks.insert(BBInfo.BB);
>>> + if (!BBInfo.CFLive) {
>>> + BBInfo.CFLive = true;
>>> + NewLiveBlocks.insert(BBInfo.BB);
>>> + }
>>>
>>> // Mark unconditional branches at the end of live
>>> // blocks as live since there is no work to do for them later
>>> @@ -348,6 +361,25 @@ void AggressiveDeadCodeElimination::coll
>>> collectLiveScopes(*IA);
>>> }
>>>
>>> +void AggressiveDeadCodeElimination::markPhiLive(PHINode *PN) {
>>> + auto &Info = BlockInfo[PN->getParent()];
>>> + // Only need to check this once per block.
>>> + if (Info.HasLivePhiNodes)
>>> + return;
>>> + Info.HasLivePhiNodes = true;
>>> +
>>> + // If a predecessor block is not live, mark it as control-flow live
>>> + // which will trigger marking live branches upon which
>>> + // that block is control dependent.
>>> + for (auto *PredBB : predecessors(Info.BB)) {
>>> + auto &Info = BlockInfo[PredBB];
>>> + if (!Info.CFLive) {
>>> + Info.CFLive = true;
>>> + NewLiveBlocks.insert(PredBB);
>>> + }
>>> + }
>>> +}
>>> +
>>> void
>>> AggressiveDeadCodeElimination::markLiveBranchesFromControlDependences() {
>>>
>>> if (BlocksWithDeadTerminators.empty())
>>> @@ -382,6 +414,11 @@ void AggressiveDeadCodeElimination::mark
>>> }
>>> }
>>>
>>>
>>> +//===-------------------------------------------------------------------
>>> ---===//
>>> +//
>>> +// Routines to update the CFG and SSA information before removing
>>> dead code.
>>> +//
>>>
>>> +//===-------------------------------------------------------------------
>>> ---===//
>>> bool AggressiveDeadCodeElimination::removeDeadInstructions() {
>>>
>>> // The inverse of the live set is the dead set. These are those
>>> instructions
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>>
>>> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2D
>>> bin_mailman_listinfo_llvm-2Dcommits&d=DQIBaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=l
>>> FyiPUrFdOHdaobP7i4hoA&m=aF4YjS_zffE7xmWFF3NHixWmJDryeTmgfitEV2eM6uM&s=mGB
>>> ELsqyo--1-TSIzg5j3k_ow1LyEia8CFhTdi2h0a8&e=
>>
>> --
>> Davide
>>
>> "There are no solved problems; there are only problems that are more
>> or less solved" -- Henri Poincare
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list