[llvm] r245921 - Pass function attributes instead of boolean in isIntDivCheap().

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 24 22:48:28 PDT 2015


Nothing more than what I said in the followup email. TLI is a bit more like
what you describe, TTI is a bit more like what I describe, personal
preference is all. The only other thing I can see us using is the subtarget
and we've already got that as part of TLI.

-eric

On Mon, Aug 24, 2015 at 10:38 PM Mehdi Amini <mehdi.amini at apple.com> wrote:

> That was his original idea, but I suggested to pass the attribute if it is
> what you’re interested it. I tend to prefer being more specific when we can.
> What makes you feel we would better pass the function in this case?
>
>> Mehdi
>
> On Aug 24, 2015, at 7:53 PM, Eric Christopher via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
> Bike shed: how about pass the function around instead.
>
> On Mon, Aug 24, 2015, 7:32 PM Steve King via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: srking
>> Date: Mon Aug 24 21:31:21 2015
>> New Revision: 245921
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=245921&view=rev
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D245921-26view-3Drev&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=v-ruWq0KCv2O3thJZiK6naxuXK8mQHZUmGq5FBtAmZ4&m=qk06_-wcwq7eqO7LUFPzl1Aq74j2Wtt1OYSdzi_XD6w&s=MK1uk2OxcL4E_0oeST7aCNaBTxU_YUYiHWCDi5wZH8k&e=>
>> Log:
>> Pass function attributes instead of boolean in isIntDivCheap().
>>
>> Added:
>>     llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll
>> Modified:
>>     llvm/trunk/include/llvm/Target/TargetLowering.h
>>     llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>>     llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
>>     llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>>     llvm/trunk/lib/Target/X86/X86ISelLowering.h
>>
>> Modified: llvm/trunk/include/llvm/Target/TargetLowering.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=245921&r1=245920&r2=245921&view=diff
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Target_TargetLowering.h-3Frev-3D245921-26r1-3D245920-26r2-3D245921-26view-3Ddiff&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=v-ruWq0KCv2O3thJZiK6naxuXK8mQHZUmGq5FBtAmZ4&m=qk06_-wcwq7eqO7LUFPzl1Aq74j2Wtt1OYSdzi_XD6w&s=qWvlrkYX2cLwOMB7E9EjhDVi58YD9OSONOmy7M88428&e=>
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
>> +++ llvm/trunk/include/llvm/Target/TargetLowering.h Mon Aug 24 21:31:21
>> 2015
>> @@ -228,7 +228,7 @@ public:
>>    /// several shifts, adds, and multiplies for this target.
>>    /// The definition of "cheaper" may depend on whether we're optimizing
>>    /// for speed or for size.
>> -  virtual bool isIntDivCheap(EVT VT, bool OptSize) const {
>> +  virtual bool isIntDivCheap(EVT VT, AttributeSet Attr) const {
>>      return false;
>>    }
>>
>> @@ -2719,11 +2719,14 @@ public:
>>    SDValue BuildUDIV(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
>>                      bool IsAfterLegalization,
>>                      std::vector<SDNode *> *Created) const;
>> +
>> +  /// Targets may override this function to provide custom SDIV lowering
>> for
>> +  /// power-of-2 denominators.  If the target returns an empty SDValue,
>> LLVM
>> +  /// assumes SDIV is expensive and replaces it with a series of other
>> integer
>> +  /// operations.
>>    virtual SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor,
>>                                  SelectionDAG &DAG,
>> -                                std::vector<SDNode *> *Created) const {
>> -    return SDValue();
>> -  }
>> +                                std::vector<SDNode *> *Created) const;
>>
>>    /// Indicate whether this target prefers to combine FDIVs with the same
>>    /// divisor. If the transform should never be done, return zero. If the
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=245921&r1=245920&r2=245921&view=diff
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_SelectionDAG_DAGCombiner.cpp-3Frev-3D245921-26r1-3D245920-26r2-3D245921-26view-3Ddiff&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=v-ruWq0KCv2O3thJZiK6naxuXK8mQHZUmGq5FBtAmZ4&m=qk06_-wcwq7eqO7LUFPzl1Aq74j2Wtt1OYSdzi_XD6w&s=IWTRWAXNbgIwcgdUr8HMgcXpQnsbGZ9LVqQZmNQrrf4&e=>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Aug 24
>> 21:31:21 2015
>> @@ -2183,7 +2183,6 @@ SDValue DAGCombiner::visitSDIV(SDNode *N
>>                           N0, N1);
>>    }
>>
>> -  bool MinSize = DAG.getMachineFunction().getFunction()->optForMinSize();
>>    // fold (sdiv X, pow2) -> simple ops after legalize
>>    // FIXME: We check for the exact bit here because the generic lowering
>> gives
>>    // better results in that case. The target-specific lowering should
>> learn how
>> @@ -2192,10 +2191,6 @@ SDValue DAGCombiner::visitSDIV(SDNode *N
>>        !cast<BinaryWithFlagsSDNode>(N)->Flags.hasExact() &&
>>        (N1C->getAPIntValue().isPowerOf2() ||
>>         (-N1C->getAPIntValue()).isPowerOf2())) {
>> -    // If integer division is cheap, then don't perform the following
>> fold.
>> -    if (TLI.isIntDivCheap(N->getValueType(0), MinSize))
>> -      return SDValue();
>> -
>>      // Target-specific implementation of sdiv x, pow2.
>>      if (SDValue Res = BuildSDIVPow2(N))
>>        return Res;
>> @@ -2232,8 +2227,10 @@ SDValue DAGCombiner::visitSDIV(SDNode *N
>>    }
>>
>>    // If integer divide is expensive and we satisfy the requirements,
>> emit an
>> -  // alternate sequence.
>> -  if (N1C && !TLI.isIntDivCheap(N->getValueType(0), MinSize))
>> +  // alternate sequence.  Targets may check function attributes for
>> size/speed
>> +  // trade-offs.
>> +  AttributeSet Attr =
>> DAG.getMachineFunction().getFunction()->getAttributes();
>> +  if (N1C && !TLI.isIntDivCheap(N->getValueType(0), Attr))
>>      if (SDValue Op = BuildSDIV(N))
>>        return Op;
>>
>> @@ -2289,8 +2286,8 @@ SDValue DAGCombiner::visitUDIV(SDNode *N
>>    }
>>
>>    // fold (udiv x, c) -> alternate
>> -  bool MinSize = DAG.getMachineFunction().getFunction()->optForMinSize();
>> -  if (N1C && !TLI.isIntDivCheap(N->getValueType(0), MinSize))
>> +  AttributeSet Attr =
>> DAG.getMachineFunction().getFunction()->getAttributes();
>> +  if (N1C && !TLI.isIntDivCheap(N->getValueType(0), Attr))
>>      if (SDValue Op = BuildUDIV(N))
>>        return Op;
>>
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=245921&r1=245920&r2=245921&view=diff
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_SelectionDAG_TargetLowering.cpp-3Frev-3D245921-26r1-3D245920-26r2-3D245921-26view-3Ddiff&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=v-ruWq0KCv2O3thJZiK6naxuXK8mQHZUmGq5FBtAmZ4&m=qk06_-wcwq7eqO7LUFPzl1Aq74j2Wtt1OYSdzi_XD6w&s=nnvowLjLP805dYgRM9eY_Ha5WDaQOsYfaPl-vXdHl1I&e=>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon Aug 24
>> 21:31:21 2015
>> @@ -2725,6 +2725,16 @@ static SDValue BuildExactSDIV(const Targ
>>    return Mul;
>>  }
>>
>> +SDValue TargetLowering::BuildSDIVPow2(SDNode *N, const APInt &Divisor,
>> +                                      SelectionDAG &DAG,
>> +                                      std::vector<SDNode *> *Created)
>> const {
>> +  AttributeSet Attr =
>> DAG.getMachineFunction().getFunction()->getAttributes();
>> +  const TargetLowering &TLI = DAG.getTargetLoweringInfo();
>> +  if (TLI.isIntDivCheap(N->getValueType(0), Attr))
>> +    return SDValue(N,0); // Lower SDIV as SDIV
>> +  return SDValue();
>> +}
>> +
>>  /// \brief Given an ISD::SDIV node expressing a divide by constant,
>>  /// return a DAG expression to select that will generate the same value
>> by
>>  /// multiplying by a magic number.
>>
>> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=245921&r1=245920&r2=245921&view=diff
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_X86_X86ISelLowering.cpp-3Frev-3D245921-26r1-3D245920-26r2-3D245921-26view-3Ddiff&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=v-ruWq0KCv2O3thJZiK6naxuXK8mQHZUmGq5FBtAmZ4&m=qk06_-wcwq7eqO7LUFPzl1Aq74j2Wtt1OYSdzi_XD6w&s=nrhR14-a-Lm9_bQ4zUK34m2l73TImMiFsDD75mbyybM&e=>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Aug 24 21:31:21 2015
>> @@ -26511,7 +26511,7 @@ bool X86TargetLowering::isTargetFTOL() c
>>    return Subtarget->isTargetKnownWindowsMSVC() && !Subtarget->is64Bit();
>>  }
>>
>> -bool X86TargetLowering::isIntDivCheap(EVT VT, bool OptSize) const {
>> +bool X86TargetLowering::isIntDivCheap(EVT VT, AttributeSet Attr) const {
>>    // Integer division on x86 is expensive. However, when aggressively
>> optimizing
>>    // for code size, we prefer to use a div instruction, as it is usually
>> smaller
>>    // than the alternative sequence.
>> @@ -26519,5 +26519,7 @@ bool X86TargetLowering::isIntDivCheap(EV
>>    // integer division, leaving the division as-is is a loss even in
>> terms of
>>    // size, because it will have to be scalarized, while the alternative
>> code
>>    // sequence can be performed in vector form.
>> +  bool OptSize = Attr.hasAttribute(AttributeSet::FunctionIndex,
>> +                                   Attribute::MinSize);
>>    return OptSize && !VT.isVector();
>>  }
>>
>> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.h?rev=245921&r1=245920&r2=245921&view=diff
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_X86_X86ISelLowering.h-3Frev-3D245921-26r1-3D245920-26r2-3D245921-26view-3Ddiff&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=v-ruWq0KCv2O3thJZiK6naxuXK8mQHZUmGq5FBtAmZ4&m=qk06_-wcwq7eqO7LUFPzl1Aq74j2Wtt1OYSdzi_XD6w&s=ifspFjmLjzkRdQA76sIYpkMhi9bvAOXSfiPwZSBOd6M&e=>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/X86ISelLowering.h (original)
>> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.h Mon Aug 24 21:31:21 2015
>> @@ -902,7 +902,7 @@ namespace llvm {
>>      /// \brief Customize the preferred legalization strategy for certain
>> types.
>>      LegalizeTypeAction getPreferredVectorAction(EVT VT) const override;
>>
>> -    bool isIntDivCheap(EVT VT, bool OptSize) const override;
>> +    bool isIntDivCheap(EVT VT, AttributeSet Attr) const override;
>>
>>    protected:
>>      std::pair<const TargetRegisterClass *, uint8_t>
>>
>> Added: llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll?rev=245921&view=auto
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_X86_sdiv-2Dpow2.ll-3Frev-3D245921-26view-3Dauto&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=v-ruWq0KCv2O3thJZiK6naxuXK8mQHZUmGq5FBtAmZ4&m=qk06_-wcwq7eqO7LUFPzl1Aq74j2Wtt1OYSdzi_XD6w&s=ZLxX-rykG7N8rahm-kJAjuq0aBYsrlkuU0LsAHmBHy8&e=>
>>
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll (added)
>> +++ llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll Mon Aug 24 21:31:21 2015
>> @@ -0,0 +1,33 @@
>> +; RUN: llc -march=x86 < %s | FileCheck %s
>> +
>> +; No attributes, should not use idiv
>> +define i32 @test1(i32 inreg %x) {
>> +entry:
>> +  %div = sdiv i32 %x, 16
>> +  ret i32 %div
>> +; CHECK-LABEL: test1:
>> +; CHECK-NOT: idivl
>> +; CHECK: ret
>> +}
>> +
>> +; Has minsize (-Oz) attribute, should generate idiv
>> +define i32 @test2(i32 inreg %x) minsize {
>> +entry:
>> +  %div = sdiv i32 %x, 16
>> +  ret i32 %div
>> +; CHECK-LABEL: test2:
>> +; CHECK: idivl
>> +; CHECK: ret
>> +}
>> +
>> +; Has optsize (-Os) attribute, should not generate idiv
>> +define i32 @test3(i32 inreg %x) optsize {
>> +entry:
>> +  %div = sdiv i32 %x, 16
>> +  ret i32 %div
>> +; CHECK-LABEL: test3:
>> +; CHECK-NOT: idivl
>> +; CHECK: ret
>> +}
>> +
>> +
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_llvm-2Dcommits&d=BQMFaQ&c=eEvniauFctOgLOKGJOplqw&r=v-ruWq0KCv2O3thJZiK6naxuXK8mQHZUmGq5FBtAmZ4&m=qk06_-wcwq7eqO7LUFPzl1Aq74j2Wtt1OYSdzi_XD6w&s=Q_5oVCn-VvdRWgQLJjTgWjcAvDJWkjupaaJSz7MciCA&e=>
>>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
>
>
> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_llvm-2Dcommits&d=BQIGaQ&c=eEvniauFctOgLOKGJOplqw&r=v-ruWq0KCv2O3thJZiK6naxuXK8mQHZUmGq5FBtAmZ4&m=qk06_-wcwq7eqO7LUFPzl1Aq74j2Wtt1OYSdzi_XD6w&s=Q_5oVCn-VvdRWgQLJjTgWjcAvDJWkjupaaJSz7MciCA&e=
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150825/ba22020b/attachment.html>


More information about the llvm-commits mailing list