<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">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.<div class="">What makes you feel we would better pass the function in this case?</div><div class=""><br class=""></div><div class="">— </div><div class="">Mehdi</div><div class=""><br class=""></div><div class=""><div><blockquote type="cite" class=""><div class="">On Aug 24, 2015, at 7:53 PM, Eric Christopher via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><p dir="ltr" class="">Bike shed: how about pass the function around instead. </p>
<br class=""><div class="gmail_quote"><div dir="ltr" class="">On Mon, Aug 24, 2015, 7:32 PM Steve King via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: srking<br class="">
Date: Mon Aug 24 21:31:21 2015<br class="">
New Revision: 245921<br class="">
<br class="">
URL: <a href="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=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=245921&view=rev</a><br class="">
Log:<br class="">
Pass function attributes instead of boolean in isIntDivCheap().<br class="">
<br class="">
Added:<br class="">
    llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll<br class="">
Modified:<br class="">
    llvm/trunk/include/llvm/Target/TargetLowering.h<br class="">
    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br class="">
    llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp<br class="">
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br class="">
    llvm/trunk/lib/Target/X86/X86ISelLowering.h<br class="">
<br class="">
Modified: llvm/trunk/include/llvm/Target/TargetLowering.h<br class="">
URL: <a href="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=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=245921&r1=245920&r2=245921&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/include/llvm/Target/TargetLowering.h (original)<br class="">
+++ llvm/trunk/include/llvm/Target/TargetLowering.h Mon Aug 24 21:31:21 2015<br class="">
@@ -228,7 +228,7 @@ public:<br class="">
   /// several shifts, adds, and multiplies for this target.<br class="">
   /// The definition of "cheaper" may depend on whether we're optimizing<br class="">
   /// for speed or for size.<br class="">
-  virtual bool isIntDivCheap(EVT VT, bool OptSize) const {<br class="">
+  virtual bool isIntDivCheap(EVT VT, AttributeSet Attr) const {<br class="">
     return false;<br class="">
   }<br class="">
<br class="">
@@ -2719,11 +2719,14 @@ public:<br class="">
   SDValue BuildUDIV(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,<br class="">
                     bool IsAfterLegalization,<br class="">
                     std::vector<SDNode *> *Created) const;<br class="">
+<br class="">
+  /// Targets may override this function to provide custom SDIV lowering for<br class="">
+  /// power-of-2 denominators.  If the target returns an empty SDValue, LLVM<br class="">
+  /// assumes SDIV is expensive and replaces it with a series of other integer<br class="">
+  /// operations.<br class="">
   virtual SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor,<br class="">
                                 SelectionDAG &DAG,<br class="">
-                                std::vector<SDNode *> *Created) const {<br class="">
-    return SDValue();<br class="">
-  }<br class="">
+                                std::vector<SDNode *> *Created) const;<br class="">
<br class="">
   /// Indicate whether this target prefers to combine FDIVs with the same<br class="">
   /// divisor. If the transform should never be done, return zero. If the<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br class="">
URL: <a href="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=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=245921&r1=245920&r2=245921&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)<br class="">
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Aug 24 21:31:21 2015<br class="">
@@ -2183,7 +2183,6 @@ SDValue DAGCombiner::visitSDIV(SDNode *N<br class="">
                          N0, N1);<br class="">
   }<br class="">
<br class="">
-  bool MinSize = DAG.getMachineFunction().getFunction()->optForMinSize();<br class="">
   // fold (sdiv X, pow2) -> simple ops after legalize<br class="">
   // FIXME: We check for the exact bit here because the generic lowering gives<br class="">
   // better results in that case. The target-specific lowering should learn how<br class="">
@@ -2192,10 +2191,6 @@ SDValue DAGCombiner::visitSDIV(SDNode *N<br class="">
       !cast<BinaryWithFlagsSDNode>(N)->Flags.hasExact() &&<br class="">
       (N1C->getAPIntValue().isPowerOf2() ||<br class="">
        (-N1C->getAPIntValue()).isPowerOf2())) {<br class="">
-    // If integer division is cheap, then don't perform the following fold.<br class="">
-    if (TLI.isIntDivCheap(N->getValueType(0), MinSize))<br class="">
-      return SDValue();<br class="">
-<br class="">
     // Target-specific implementation of sdiv x, pow2.<br class="">
     if (SDValue Res = BuildSDIVPow2(N))<br class="">
       return Res;<br class="">
@@ -2232,8 +2227,10 @@ SDValue DAGCombiner::visitSDIV(SDNode *N<br class="">
   }<br class="">
<br class="">
   // If integer divide is expensive and we satisfy the requirements, emit an<br class="">
-  // alternate sequence.<br class="">
-  if (N1C && !TLI.isIntDivCheap(N->getValueType(0), MinSize))<br class="">
+  // alternate sequence.  Targets may check function attributes for size/speed<br class="">
+  // trade-offs.<br class="">
+  AttributeSet Attr = DAG.getMachineFunction().getFunction()->getAttributes();<br class="">
+  if (N1C && !TLI.isIntDivCheap(N->getValueType(0), Attr))<br class="">
     if (SDValue Op = BuildSDIV(N))<br class="">
       return Op;<br class="">
<br class="">
@@ -2289,8 +2286,8 @@ SDValue DAGCombiner::visitUDIV(SDNode *N<br class="">
   }<br class="">
<br class="">
   // fold (udiv x, c) -> alternate<br class="">
-  bool MinSize = DAG.getMachineFunction().getFunction()->optForMinSize();<br class="">
-  if (N1C && !TLI.isIntDivCheap(N->getValueType(0), MinSize))<br class="">
+  AttributeSet Attr = DAG.getMachineFunction().getFunction()->getAttributes();<br class="">
+  if (N1C && !TLI.isIntDivCheap(N->getValueType(0), Attr))<br class="">
     if (SDValue Op = BuildUDIV(N))<br class="">
       return Op;<br class="">
<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp<br class="">
URL: <a href="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=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=245921&r1=245920&r2=245921&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)<br class="">
+++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon Aug 24 21:31:21 2015<br class="">
@@ -2725,6 +2725,16 @@ static SDValue BuildExactSDIV(const Targ<br class="">
   return Mul;<br class="">
 }<br class="">
<br class="">
+SDValue TargetLowering::BuildSDIVPow2(SDNode *N, const APInt &Divisor,<br class="">
+                                      SelectionDAG &DAG,<br class="">
+                                      std::vector<SDNode *> *Created) const {<br class="">
+  AttributeSet Attr = DAG.getMachineFunction().getFunction()->getAttributes();<br class="">
+  const TargetLowering &TLI = DAG.getTargetLoweringInfo();<br class="">
+  if (TLI.isIntDivCheap(N->getValueType(0), Attr))<br class="">
+    return SDValue(N,0); // Lower SDIV as SDIV<br class="">
+  return SDValue();<br class="">
+}<br class="">
+<br class="">
 /// \brief Given an ISD::SDIV node expressing a divide by constant,<br class="">
 /// return a DAG expression to select that will generate the same value by<br class="">
 /// multiplying by a magic number.<br class="">
<br class="">
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br class="">
URL: <a href="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=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=245921&r1=245920&r2=245921&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br class="">
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Aug 24 21:31:21 2015<br class="">
@@ -26511,7 +26511,7 @@ bool X86TargetLowering::isTargetFTOL() c<br class="">
   return Subtarget->isTargetKnownWindowsMSVC() && !Subtarget->is64Bit();<br class="">
 }<br class="">
<br class="">
-bool X86TargetLowering::isIntDivCheap(EVT VT, bool OptSize) const {<br class="">
+bool X86TargetLowering::isIntDivCheap(EVT VT, AttributeSet Attr) const {<br class="">
   // Integer division on x86 is expensive. However, when aggressively optimizing<br class="">
   // for code size, we prefer to use a div instruction, as it is usually smaller<br class="">
   // than the alternative sequence.<br class="">
@@ -26519,5 +26519,7 @@ bool X86TargetLowering::isIntDivCheap(EV<br class="">
   // integer division, leaving the division as-is is a loss even in terms of<br class="">
   // size, because it will have to be scalarized, while the alternative code<br class="">
   // sequence can be performed in vector form.<br class="">
+  bool OptSize = Attr.hasAttribute(AttributeSet::FunctionIndex,<br class="">
+                                   Attribute::MinSize);<br class="">
   return OptSize && !VT.isVector();<br class="">
 }<br class="">
<br class="">
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.h<br class="">
URL: <a href="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=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.h?rev=245921&r1=245920&r2=245921&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Target/X86/X86ISelLowering.h (original)<br class="">
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.h Mon Aug 24 21:31:21 2015<br class="">
@@ -902,7 +902,7 @@ namespace llvm {<br class="">
     /// \brief Customize the preferred legalization strategy for certain types.<br class="">
     LegalizeTypeAction getPreferredVectorAction(EVT VT) const override;<br class="">
<br class="">
-    bool isIntDivCheap(EVT VT, bool OptSize) const override;<br class="">
+    bool isIntDivCheap(EVT VT, AttributeSet Attr) const override;<br class="">
<br class="">
   protected:<br class="">
     std::pair<const TargetRegisterClass *, uint8_t><br class="">
<br class="">
Added: llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll<br class="">
URL: <a href="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=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll?rev=245921&view=auto</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll (added)<br class="">
+++ llvm/trunk/test/CodeGen/X86/sdiv-pow2.ll Mon Aug 24 21:31:21 2015<br class="">
@@ -0,0 +1,33 @@<br class="">
+; RUN: llc -march=x86 < %s | FileCheck %s<br class="">
+<br class="">
+; No attributes, should not use idiv<br class="">
+define i32 @test1(i32 inreg %x) {<br class="">
+entry:<br class="">
+  %div = sdiv i32 %x, 16<br class="">
+  ret i32 %div<br class="">
+; CHECK-LABEL: test1:<br class="">
+; CHECK-NOT: idivl<br class="">
+; CHECK: ret<br class="">
+}<br class="">
+<br class="">
+; Has minsize (-Oz) attribute, should generate idiv<br class="">
+define i32 @test2(i32 inreg %x) minsize {<br class="">
+entry:<br class="">
+  %div = sdiv i32 %x, 16<br class="">
+  ret i32 %div<br class="">
+; CHECK-LABEL: test2:<br class="">
+; CHECK: idivl<br class="">
+; CHECK: ret<br class="">
+}<br class="">
+<br class="">
+; Has optsize (-Os) attribute, should not generate idiv<br class="">
+define i32 @test3(i32 inreg %x) optsize {<br class="">
+entry:<br class="">
+  %div = sdiv i32 %x, 16<br class="">
+  ret i32 %div<br class="">
+; CHECK-LABEL: test3:<br class="">
+; CHECK-NOT: idivl<br class="">
+; CHECK: ret<br class="">
+}<br class="">
+<br class="">
+<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a><br class="">
<a href="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=" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="">
</blockquote></div>
_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">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= <br class=""></div></blockquote></div><br class=""></div></body></html>