<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=utf-8">
<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;}
/* 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.MsoPlainText, li.MsoPlainText, div.MsoPlainText
{mso-style-priority:99;
mso-style-link:"Plain Text Char";
margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
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: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="MsoPlainText">After writing a simple FPRange, I've hit a stumbling block. I don't know what LLVM code should be extended to use it. I was initially thinking of extending LazyValueInfo, but it appears to be used for passes that don’t address the
case that I need for Julia. I’m now wondering if I’m better off extending SimplifyFCmpInst to handle the few cases in question instead of trying to be more general. Here’s an example case for Julia where a trivially true domain check should be removed:<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText" style="margin-left:.5in">%jl_value_t = type {}<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in">@jl_domain_exception = external global %jl_value_t*<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in">declare void @jl_throw_with_superfluous_argument(%jl_value_t*, i32)<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in">declare float @llvm.sqrt.f32(float %Val)<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"><o:p> </o:p></p>
<p class="MsoPlainText" style="margin-left:.5in">define float @julia_f_64805(float) {<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in">top:<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"> %1 = fmul float %0, %0<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"> %2 = fcmp uge float %1, 0.000000e+00<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"> br i1 %2, label %pass, label %fail<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"><o:p> </o:p></p>
<p class="MsoPlainText" style="margin-left:.5in">fail: ; preds = %top<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"> %3 = load %jl_value_t** @jl_domain_exception, align 8<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"> call void @jl_throw_with_superfluous_argument(%jl_value_t* %3, i32 2)<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"> unreachable<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"><o:p> </o:p></p>
<p class="MsoPlainText" style="margin-left:.5in">pass: ; preds = %top<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"> %4 = call float @llvm.sqrt.f32(float %1)<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in"> ret float %4<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in">}<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I just want to fold the branch. Following Philip’s earlier suggestion, adding a routine CannotBeOrderedLessThanZero (that’s analogous to CannotBeNegativeZero) and making SimplifyFCmpInst use it would be enough to cover the cases of
primary interest. Comments?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">- Arch<o:p></o:p></p>
</div>
</body>
</html>