<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 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
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="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi all,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I tried to poke my head into opt-report a while ago and didn’t get very far. Now I’m looking at it again. I’m not sure I understand everything that’s in place so my question here may be misguided.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I’m trying to understand the way strings are handled. When a remark is emitted, it seems that the string is constructed on the fly based on streaming inputs. For example,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  ORE->emit([&]() {<o:p></o:p></p>
<p class="MsoNormal">    return OptimizationRemark(DEBUG_TYPE, "LoadElim", LI)<o:p></o:p></p>
<p class="MsoNormal">           << "load of type " << NV("Type", LI->getType()) << " eliminated"<o:p></o:p></p>
<p class="MsoNormal">           << setExtraArgs() << " in favor of "<o:p></o:p></p>
<p class="MsoNormal">           << NV("InfavorOfValue", AvailableValue);<o:p></o:p></p>
<p class="MsoNormal">  });<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">There is some C++ magic going on behind the scenes here, and it makes for a nice interface, but I’m not clear about what ends up being stored where. I think within DiagnosticInfoOptimizationBase all the string parts of this get stored in
 a vector of name-value pairs with the unnamed strings just having an empty name. At some point, I guess this gets assembled into a single string? I’ve also found references to string tables for the bitstream serializer and a YAML format that uses a string
 table, but I’m not clear how and when these are constructed.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">What I’m wondering is whether it would make sense to introduce a sort of message catalog, similar to the way diagnostics are handled in clang (which I must admit I also have only a partial understanding of). It seems like the RemarkName
 for optimization remarks somewhat serves as a unique identifier (?) but I would think an integer value of some sort would be better, so maybe I’m misunderstanding what RemarkName is being used for. I’m imagining something that would end up looking like this:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  ORE->emit([&]() {<o:p></o:p></p>
<p class="MsoNormal">    return OptimizationRemark(DEBUG_TYPE, diag::remark_gvn_load_elim, LI)<o:p></o:p></p>
<p class="MsoNormal">           << NV("Type", LI->getType())<o:p></o:p></p>
<p class="MsoNormal">           << setExtraArgs() << NV("InfavorOfValue", AvailableValue);<o:p></o:p></p>
<p class="MsoNormal">  });<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">with a tablegen file somewhere containing this:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">def
</span>remark_gvn_load_elim<span style="font-size:9.5pt;font-family:Consolas;color:black">: OptRemark<<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">  “LoadElim”,                    // RemarkName (if this is needed for YAML output or whatever)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">  "load of type %0 eliminated",  // Base format string for the remark (%Type instead of %0 maybe?)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">  "in favor of %1">;             // Extra args format string for verbose output<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Has this been discussed before?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal">Andy<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>