<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;}
p.Code, li.Code, div.Code
        {mso-style-name:Code;
        mso-style-link:"Code Char";
        margin:0in;
        margin-bottom:.0001pt;
        mso-add-space:auto;
        font-size:9.0pt;
        font-family:"Courier New";}
p.CodeCxSpFirst, li.CodeCxSpFirst, div.CodeCxSpFirst
        {mso-style-name:CodeCxSpFirst;
        mso-style-link:"Code Char";
        mso-style-type:export-only;
        margin:0in;
        margin-bottom:.0001pt;
        mso-add-space:auto;
        font-size:9.0pt;
        font-family:"Courier New";}
p.CodeCxSpMiddle, li.CodeCxSpMiddle, div.CodeCxSpMiddle
        {mso-style-name:CodeCxSpMiddle;
        mso-style-link:"Code Char";
        mso-style-type:export-only;
        margin:0in;
        margin-bottom:.0001pt;
        mso-add-space:auto;
        font-size:9.0pt;
        font-family:"Courier New";}
p.CodeCxSpLast, li.CodeCxSpLast, div.CodeCxSpLast
        {mso-style-name:CodeCxSpLast;
        mso-style-link:"Code Char";
        mso-style-type:export-only;
        margin:0in;
        margin-bottom:.0001pt;
        mso-add-space:auto;
        font-size:9.0pt;
        font-family:"Courier New";}
span.CodeChar
        {mso-style-name:"Code Char";
        mso-style-link:Code;
        font-family:"Courier New";}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle22
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@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">I do not mind using dedicated libraries for wide integers (in fact, I mentioned that in my email below).
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">But the question is whether I should do that when lowering from the front-end representation to LLVM IR or at first use the LLVM IR integer representation, run machine independent transformation passes and then prior to running the code
 gen passes, convert the wide integers to an alternative representation and convert all operations on them to library calls?
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If latter, how would I go about doing that? Create ‘alloca’ for the wide integers, bit cast and store them to stack and call the library functions? I don’t know if there is a way to get rid of unnecessary alloca’s. For example, if these
 wide integers are already in memory; it is a waste to load them from memory and copy them to stack; the address of the original location could be passed to the library.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Or lowering to library calls from the front-end representation, the better alternative?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/Riyaz<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Eli Friedman <efriedma@quicinc.com> <br>
<b>Sent:</b> Monday, August 17, 2020 12:08 PM<br>
<b>To:</b> Riyaz Puthiyapurayil <riyaz@synopsys.com>; llvm-dev@lists.llvm.org<br>
<b>Subject:</b> RE: [llvm-dev] Code generation option for wide integers on x86_64?<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If you’re dealing with integers that wide, I’d recommend avoiding the builtin IR integers.  There are dedicated libraries for wide integers; the most well-known is probably GMP.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Eli<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> llvm-dev <<a href="mailto:llvm-dev-bounces@lists.llvm.org">llvm-dev-bounces@lists.llvm.org</a>>
<b>On Behalf Of </b>Riyaz Puthiyapurayil via llvm-dev<br>
<b>Sent:</b> Monday, August 17, 2020 11:54 AM<br>
<b>To:</b> llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>><br>
<b>Subject:</b> [EXT] [llvm-dev] Code generation option for wide integers on x86_64?<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:14.0pt">Is there an existing option in X86_64 target code generator to emit a loop for the following code:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">define i4096 @add(i4096 %a, i4096 %b)
<b>alwaysinline</b> {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">    %c = add i4096 %a, %b<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">    ret i4096 %c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">instead of:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     movq %rdi, %rax<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     addq 96(%rsp), %rsi<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     adcq 104(%rsp), %rdx<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     movq %rdx, 8(%rdi)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     movq %rsi, (%rdi)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     adcq 112(%rsp), %rcx<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     movq %rcx, 16(%rdi)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     adcq 120(%rsp), %r8<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     movq %r8, 24(%rdi)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     adcq 128(%rsp), %r9<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     movq %r9, 32(%rdi)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     movq 8(%rsp), %rcx<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     adcq 136(%rsp), %rcx<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     movq %rcx, 40(%rdi)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     movq 16(%rsp), %rcx<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">           :<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     :<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     :<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">What is the best strategy for lowering wide integer types/operations on x86_64 without causing code blow up? Should we the code run through a custom pass that replaces wide operations with a library function
 call (or alternatively a loop) before code generation? Is there any existing code that can be reused?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">Is there any documentation that describe strategies for lowering from languages that support arbitrarily wide integers?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
</div>
</body>
</html>