<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:Verdana;
        panose-1:2 11 6 4 3 5 4 4 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
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
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 style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">Introduction:<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"><o:p> </o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">We would like to add new keyword to 'sdiv'\'udiv' instructions i.e. 'no-overflow'.<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">This is the updated solution devised in the discussion:
<a href="http://lists.llvm.org/pipermail/llvm-dev/2017-October/118257.html">http://lists.llvm.org/pipermail/llvm-dev/2017-October/118257.html</a><o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">The proposed keywords:<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">    "nof" stands for 'no-overflow'<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">Syntax:<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">    <result> = sdiv nof <ty> <op1>, <op2> ; yields ty:result<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">    <result> = udiv nof <ty> <op1>, <op2> ; yields ty:result<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">Overview:<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">If the keyword is present, the compiler can assume no zero values in the denominator. Moreover, for sdiv the division MIN_INT / -1 is prohibited.
 Otherwise, undefined behavior.<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">Poison value is returned, in case of division by zero or MIN_INT/-1 if the keyword not present.<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">Motivation:<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">In the current state if the loop-vectorizer decides that it should vectorize a loop which contains a predicated integer division -  it will
 vectorize the loop body and scalarize the predicated division instruction into a sequence of branches that guard scalar division operations. In some cases the generated code for this will not be very efficient. Speculating the divides using current vector
 sdiv instruction is not an option due to the danger of integer divide-by-zero.<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">There are two ways for ensuring the safety of "vector div under condition", One way is to use the same condition as the scalar execution.
 Current serialization approach and previous masked integer div intrinsic proposal (<a href="http://lists.llvm.org/pipermail/llvm-dev/2017-October/118257.html">http://lists.llvm.org/pipermail/llvm-dev/2017-October/118257.html</a>) follows this idea. Second
 way is to check the actual divisor, regardless of the original condition. The 'no-overflow' keyword follows this idea. If the original code has possible div-by-zero behavior, for example, the latter approach will end up hiding it -- by taking advantage of
 the undefined behavior.<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">With the addition of 'nof' keyword Clang will lower C\C++ division to 'nof' div IR since it will keep the same semantics.<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">In case the vectorizer decided to vectorize one of the predicated div it can be done by widening the datatype of the div and the 'nof' keyword
 will not hold anymore (because of the risk that one of the predicated lanes may have zero).
<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">Keeping that with the widened datatype will allow codegen to lower that instruction as a vector instruction while ensuring lanes that may
 have zero values do not trigger a trap.<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">Implementation considerations:<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">Initially all the targets can scalarize vector sdiv\udiv instructions to one with 'nof' by using guards for each lane:<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">%r = sdiv <4 x i32> %a, %b can be lowered to:<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">(assuimg %a = <i32 %a.0, i32 %a.1, i32 %a.2, i32 %a.3>, %b = <i32 %b.0, i32 %b.1, i32 %b.2, i32 %b.3> and %r = <i32 %r.0, i32 %r.1, i32 %r.2,
 i32 %r.3>)<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">If CheckSafety(%a.0,%b.0):<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">  %r.0 = sdiv nof i32 %a.0, %b.0<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">If CheckSafety(%a.1,%b.1):<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">  %r.1 = sdiv nof i32 %a.1, %b.1<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">If CheckSafety(%a.2,%b.2):<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">  %r.2 = sdiv nof i32 %a.2, %b.2<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">If CheckSafety(%a.3,%b.3):<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">  %r.3 = sdiv nof i32 %a.3, %b.3<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">CheckSafety(a,b): (of sdiv)<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">  b != 0 || (b != -1 && a != MIN_INT)<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> <o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">CheckSafety(a,b): (of udiv)<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">  b != 0<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"><o:p> </o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"><o:p> </o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">Changes in LangRef.rst of udiv/sdiv Instructions:<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">-----------------------------------------------------------<o:p></o:p></span></p>
<p style="margin:0in;margin-bottom:.0001pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">'``udiv``' Instruction<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">^^^^^^^^^^^^^^^<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Syntax:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">"""""""<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">::<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">       <result> = udiv <ty> <op1>, <op2>         ; yields ty:result<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">       <result> = udiv exact <ty> <op1>, <op2>   ; yields ty:result<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">+       <result> = udiv nof <ty> <op1>, <op2>   ; yields ty:result<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana",sans-serif;color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Overview:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">"""""""""<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The '``udiv``' instruction returns the quotient of its two operands.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Arguments:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">""""""""""<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The two arguments to the '``udiv``' instruction must be<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">:ref:`integer <t_integer>` or :ref:`vector <t_vector>` of integer values. Both<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">arguments must have identical types.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Semantics:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">""""""""""<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The value produced is the unsigned integer quotient of the two operands.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Note that unsigned integer division and signed integer division are<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">distinct operations; for signed integer division, use '``sdiv``'.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><s><span style="color:#1F497D">Division by zero is undefined behavior. For vectors, if any element</span></s><span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><s><span style="color:#1F497D">of the divisor is zero, the operation has undefined behavior.</span></s><span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">See the description of the ``nof`` keyword below for division by zero.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">If the ``exact`` keyword is present, the result value of the ``udiv`` is<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">a :ref:`poison value <poisonvalues>` if %op1 is not a multiple of %op2 (as<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">such, "((a udiv exact b) mul b) == a").<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">``nof``stands for “No Overflow”. If the ``nof`` keyword is present, the result is undefined behavior for division by zero.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">If the ``nof`` keyword is not present, division by zero results in poison value.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">For vectors, if any element of the divisor is zero, the behavior is same as for scalar division by zero.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">'``sdiv``' Instruction<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">^^^^^^^^^^^^^^^<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Syntax:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">"""""""<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">::<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">       <result> = sdiv <ty> <op1>, <op2>         ; yields ty:result<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">       <result> = sdiv exact <ty> <op1>, <op2>   ; yields ty:result<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">+       <result> = sdiv nof <ty> <op1>, <op2>   ; yields ty:result<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Overview<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">"""""""""<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The '``sdiv``' instruction returns the quotient of its two operands.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Arguments:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">""""""""""<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The two arguments to the '``sdiv``' instruction must be<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">:ref:`integer <t_integer>` or :ref:`vector <t_vector>` of integer values. Both<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">arguments must have identical types.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Semantics:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">""""""""""<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The value produced is the signed integer quotient of the two operands<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">rounded towards zero.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Note that signed integer division and unsigned integer division are<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">distinct operations; for unsigned integer division, use '``udiv``'.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><s><span style="color:#1F497D">Division by zero is undefined behavior. For vectors, if any element</span></s><span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><s><span style="color:#1F497D">of the divisor is zero, the operation has undefined behavior.</span></s><span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><s><span style="color:#1F497D">Overflow also leads to undefined behavior; this is a rare case, but can</span></s><span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><s><span style="color:#1F497D">occur, for example, by doing a 32-bit division of -2147483648 by -1.</span></s><span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">See the description of the ``nof`` keyword below for division by zero and overflow.<o:p></o:p></span></p>
<p class="MsoNormal"><s><span style="color:#1F497D"> </span></s><span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">If the ``exact`` keyword is present, the result value of the ``sdiv`` is<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">a :ref:`poison value <poisonvalues>` if the result would be rounded.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">``nof``stands for “No Overflow”. If the ``nof`` keyword is present, the result is undefined behavior if overflow occurs. This may be result of division by zero or dividing the smallest representable integer of
 the type by -1.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">If the ``nof`` keyword is not present, the overflow cases described above result in poison value.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">For vectors, if any element of the division causes overflow, the behavior is same as for scalar division with overflow.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Example:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">""""""""<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">.. code-block:: text<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">       <result> = sdiv i32 4, %var          ; yields i32:result = 4 / %var<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited</p>

<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></body>
</html>