[llvm] r336664 - [DAGCombiner] visitREM - call visitSDIVLike/visitUDIVLike directly to avoid recursive combining.

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 11 00:51:46 PDT 2018


On 10/07/2018 19:47, Friedman, Eli wrote:

> On 7/10/2018 6:18 AM, Simon Pilgrim via llvm-commits wrote:
>> Author: rksimon
>> Date: Tue Jul 10 06:18:16 2018
>> New Revision: 336664
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=336664&view=rev
>> Log:
>> [DAGCombiner] visitREM - call visitSDIVLike/visitUDIVLike directly to 
>> avoid recursive combining.
>>
>> As suggested by @efriedma on D48975 use the 
>> visitSDIVLike/visitUDIVLike functions introduced at rL336656.
>>
>> Modified:
>>      llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=336664&r1=336663&r2=336664&view=diff
>> ============================================================================== 
>>
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Jul 10 
>> 06:18:16 2018
>> @@ -3277,22 +3277,19 @@ SDValue DAGCombiner::visitREM(SDNode *N)
>>       // If X/C can be simplified by the division-by-constant logic, 
>> lower
>>     // X%C to the equivalent of X-X/C*C.
>> -  // To avoid mangling nodes, this simplification requires that the 
>> combine()
>> -  // call for the speculative DIV must not cause a DIVREM 
>> conversion.  We guard
>> -  // against this by skipping the simplification if 
>> isIntDivCheap().  When
>> -  // div is not cheap, combine will not return a DIVREM. Regardless,
>> -  // checking cheapness here makes sense since the simplification 
>> results in
>> -  // fatter code.
>> +  // Reuse the SDIVLike/UDIVLike combines - to avoid mangling nodes, 
>> the
>> +  // speculative DIV must not cause a DIVREM conversion.  We guard 
>> against this
>> +  // by skipping the simplification if isIntDivCheap().  When div is 
>> not cheap,
>> +  // combine will not return a DIVREM.  Regardless, checking 
>> cheapness here
>> +  // makes sense since the simplification results in fatter code.
>>     if (N1C && !N1C->isNullValue() && !TLI.isIntDivCheap(VT, Attr)) {
>> -    unsigned DivOpcode = isSigned ? ISD::SDIV : ISD::UDIV;
>> -    SDValue Div = DAG.getNode(DivOpcode, DL, VT, N0, N1);
>> -    AddToWorklist(Div.getNode());
>> -    SDValue OptimizedDiv = combine(Div.getNode());
>> -    if (OptimizedDiv.getNode() && OptimizedDiv.getNode() != 
>> Div.getNode() &&
>> -        OptimizedDiv.getOpcode() != ISD::UDIVREM &&
>> +    SDValue OptimizedDiv =
>> +        isSigned ? visitSDIVLike(N0, N1, N) : visitUDIVLike(N0, N1, N);
>> +    if (OptimizedDiv.getNode() && OptimizedDiv.getOpcode() != 
>> ISD::UDIVREM &&
>>           OptimizedDiv.getOpcode() != ISD::SDIVREM) {
>
> I think the check for SDIVREM/UDIVREM is redundant here? visitUDIVLike 
> can't return UDIVREM.
>
> -Eli
IIRC I replaced that initially with an assert for the DIVREMs but I was 
seeing hits - I'll look again. Simon.



More information about the llvm-commits mailing list