<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-GB">Hi,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">I’d like to discuss a possibility of a change of TargetTransformInfo::getGEPCost to have GetElementPtrInst as a parameter.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">Its current signature is:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  /// \brief Estimate the cost of a GEP operation when lowered.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  ///<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  /// The contract for this function is the same as \c getOperationCost except<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  /// that it supports an interface that provides extra information specific to<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  /// the GEP operation.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  int getGEPCost(Type *PointeeType, const Value *Ptr,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">                 ArrayRef<const Value *> Operands) const;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">I’d like to change it to:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  int getGEPCost(const GetElementPtrInst *GEP,  ArrayRef<const Value *> Operands) const;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">All uses of the current getGEPCost look like: TTI.getGEPCost(GEP.getSourceElementType(), GEP.getPointerOperand(), …):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">lib/Analysis/InlineCost.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  TTI.getGEPCost(GEP.getSourceElementType(), GEP.getPointerOperand(),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">lib/Transforms/Scalar/NaryReassociate.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  return TTI->getGEPCost(GEP->getSourceElementType(), GEP->getPointerOperand(),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">lib/Transforms/Scalar/StraightLineStrengthReduce.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  return TTI->getGEPCost(GEP->getSourceElementType(), GEP->getPointerOperand(),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">If PointeeType and Ptr are always from GEP why do we need the possibility to specify them independently without their owner?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-GB">Rationale:<o:p></o:p></span></b></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">In the following IR produced from the code of a simple memcopy function GEPs are not free:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">while.cond:                                       ; preds = %while.body, %entry<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  %dest.addr.0 = phi i8* [ %dest, %entry ], [ %incdec.ptr1, %while.body ]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  %src.addr.0 = phi i8* [ %src, %entry ], [ %incdec.ptr, %while.body ]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  %tobool = icmp eq i32 %size.addr.0, 0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  br i1 %tobool, label %while.end, label %while.body<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">while.body:                                       ; preds = %while.cond<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  %dec = add nsw i32 %size.addr.0, -1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  %incdec.ptr = getelementptr inbounds i8, i8* %src.addr.0, i32 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  %0 = load i8, i8* %src.addr.0, align 1, !tbaa !12<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  %incdec.ptr1 = getelementptr inbounds i8, i8* %dest.addr.0, i32 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  store i8 %0, i8* %dest.addr.0, align 1, !tbaa !12<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">  br label %while.cond<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">while.end:                                        ; preds = %while.cond<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">For  x86 and ARM they are lowered into ADD instructions. So they are not free but the current getGEPCost returns they are free. E.g., this affects the cost of inlining. The calculated cost is lower than it should be and
 functions are inlined. <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">We can do the analysis before the call of getGEPCost but this will require to do it at all places where getGEPCost is called. So it’s better to do this in one place, in the getGEPCost function or its implementations for
 targets.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">To detect this case and other Def-Use based cases GEPs need to be accessed in getGEPCost which is not possible with the current signature.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">Any thoughts?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">Evgeny Astigeevich<o:p></o:p></span></p>
<p class="MsoPlainText">Senior Compiler Engineer<o:p></o:p></p>
<p class="MsoPlainText">Compilation Tools<o:p></o:p></p>
<p class="MsoPlainText">ARM<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
</div>
</body>
</html>