[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