[llvm] r269236 - SDAG: Add a helper to replace and remove a node during ISel
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Fri May 13 16:33:28 PDT 2016
"H.J. Lu" <hjl.tools at gmail.com> writes:
> On Wed, May 11, 2016 at 2:13 PM, Justin Bogner via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>> Author: bogner
>> Date: Wed May 11 16:13:17 2016
>> New Revision: 269236
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=269236&view=rev
>> Log:
>> SDAG: Add a helper to replace and remove a node during ISel
>>
>> It's very common to want to replace a node and then remove it since
>> it's dead, especially as we port backends from the SDNode *Select API
>> to the void Select one. This helper makes this sequence a bit less
>> verbose.
>>
>> Modified:
>> llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h
>> llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp
>>
>> Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h?rev=269236&r1=269235&r2=269236&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h (original)
>> +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h Wed May 11 16:13:17 2016
>> @@ -234,6 +234,11 @@ protected:
>> CurDAG->ReplaceAllUsesWith(F, T);
>> }
>>
>> + /// Replace all uses of \c F with \c T, then remove \c F from the DAG.
>> + void ReplaceNode(SDNode *F, SDNode *T) {
>> + CurDAG->ReplaceAllUsesWith(F, T);
>> + CurDAG->RemoveDeadNode(F);
>> + }
>>
>> /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
>> /// by tblgen. Others should not call it.
>>
>
> Did you miss
>
> case ISD::BRIND: {
> if (Subtarget->isTargetNaCl())
> // NaCl has its own pass where jmp %r32 are converted to jmp %r64. We
> // leave the instruction alone.
> break;
> if (Subtarget->isTarget64BitILP32()) {
> // Converts a 32-bit register to a 64-bit, zero-extended version of
> // it. This is needed because x86-64 can do many things, but jmp %r32
> // ain't one of them.
> const SDValue &Target = Node->getOperand(1);
> assert(Target.getSimpleValueType() == llvm::MVT::i32);
> SDValue ZextTarget = CurDAG->getZExtOrTrunc(Target, dl, EVT(MVT::i64));
> SDValue Brind = CurDAG->getNode(ISD::BRIND, dl, MVT::Other,
> Node->getOperand(0), ZextTarget);
> ReplaceUses(SDValue(Node, 0), Brind);
> SelectCode(ZextTarget.getNode());
> SelectCode(Brind.getNode());
> return nullptr;
> }
> break;
> }
>
> It leaves dead and invalid nodes behind.
Good catch! I've converted this to use ReplaceNode on `Node` instead of
ReplaceUses in r269516.
More information about the llvm-commits
mailing list