<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">Hi Florian,</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">I mostly agree with this summary:</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">> More specific transformation pragmas (e.g. vector_width) imply the transformation is enabled,
 as if it was enabled via the corresponding explicit pragma (e.g. vectorize(enable)). If the transformation is explicitly disabled  (e.g. vectorize(disable)), that takes precedence over pragmas implicitly enabling it.</span>
<div><br>
</div>
<div><span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);"> Just a few minor corrections. In the the last sentence,</span><span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">
 "implicitly enabling it" should be "implying it". </span><br>
</div>
<div><br>
</div>
<div><span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">I think we can simplify things by simply not mentioning "explicit" or "more specific" etc.
 if we define:</span></div>
<div>
<ul>
<li><span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">transformations, e.g.: vectorize, unroll, etc.,</span><br>
</li><li><span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">transformations options, e.g.: vectorize_width, vectorize_predicate, unroll_count, etc.
</span><br>
</li></ul>
<div><br>
</div>
</div>
<div><span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">So the summary becomes something like:</span></div>
<div><br>
</div>
<div><span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">Pragmas setting transformation options (e.g. vector_width) imply the transformation is enabled,
 as if it was enabled via the corresponding transformation pragma (e.g. vectorize(enable)). If the transformation is disabled  (e.g. vectorize(disable)), that takes precedence over transformations option pragmas implying that transformation.</span><br>
</div>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">With this definition,</span></div>
<div style="font-size: 12pt; font-family: Calibri, Arial, Helvetica, sans-serif; text-indent: 0px;">
<br>
</div>
<div style="font-size: 12pt; font-family: Calibri, Arial, Helvetica, sans-serif; text-indent: 0px;">
<span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">>> vectorize(enable) vectorize_width(1)</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<div><span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">></span><br>
</div>
<span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">> IMO we should enable the transformation and set vector_width=1 in the metadata.</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-size: 12pt; font-family: Calibri, Arial, Helvetica, sans-serif; text-indent: 0px;">
<span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">I agree that this is could then be the expected behaviour (you could also argue that setting a value
 is not the same as disabling it).</span><span> And this example is also straightforward indeed:<br>
</span></div>
<div style="font-size: 12pt; font-family: Calibri, Arial, Helvetica, sans-serif; text-indent: 0px;">
<span><br>
</span></div>
<div style="font-size: 12pt; font-family: Calibri, Arial, Helvetica, sans-serif; text-indent: 0px;">
<span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">>> vectorize(disable) vectorize_predicate(enable)</span><br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<div><span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">>></span><br>
</div>
<span style="font-family: calibri, arial, helvetica, sans-serif; font-size: 12pt; line-height: normal; color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0);">> IMO it makes sense for the more explicit pragma (vectorize(disable)) to take precedence over the
 one that implicitly enables vectorization.</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
It just follows from the definition.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Cheers,</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Sjoerd.<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> florian_hahn@apple.com <florian_hahn@apple.com> on behalf of Florian Hahn <florian_hahn@apple.com><br>
<b>Sent:</b> 13 August 2019 10:24<br>
<b>To:</b> Sjoerd Meijer <Sjoerd.Meijer@arm.com><br>
<b>Cc:</b> Michael Kruse <llvm@meinersbur.de>; nd <nd@arm.com>; cfe-dev@lists.llvm.org <cfe-dev@lists.llvm.org><br>
<b>Subject:</b> Re: [cfe-dev] Behaviour of loop pragmas and transformation options</font>
<div> </div>
</div>
<div class="" style="word-wrap:break-word; line-break:after-white-space">Hi,<br class="">
<div><br class="">
<blockquote type="cite" class="">
<div class="">On Aug 13, 2019, at 09:56, Sjoerd Meijer via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" class="">cfe-dev@lists.llvm.org</a>> wrote:</div>
<br class="x_Apple-interchange-newline">
<div class="">
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
Hi,</div>
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
<br class="">
</div>
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
Sure, I won't mind fixing these other cases too while I am at it.<br class="">
</div>
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
I think my only preference would be to make one functional change at a time (fix one pragma (option) at a time), because this has turned into a little project  on itself and dealing with issues would be easier, unless a big-bang change would be preferred in
 this case for some reason and then I will address them all in D65776.<span class="x_Apple-converted-space"> </span><br class="">
</div>
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
<br class="">
</div>
</div>
</blockquote>
<div><br class="">
</div>
Addressing it on a patch-per-pragma sounds good, thanks for picking this up!</div>
<div><br class="">
</div>
<div>
<div class=""><br class="">
</div>
<blockquote type="cite" class="">
<div class="">
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
I think one thing we haven't discussed yet is conflicting combinations like:</div>
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
<br class="">
</div>
</div>
</blockquote>
<div><br class="">
</div>
<div>I think we should agree on something like the following as a general rule to deal with such cases: </div>
<div><br class="">
</div>
<div>More specific transformation pragmas (e.g. vector_width) imply the transformation is enabled, as if it was enabled via the corresponding explicit pragma (e.g. vectorize(enable)). If the transformation is explicitly disabled  (e.g. vectorize(disable)),
 that takes precedence over pragmas implicitly enabling it.</div>
<div><br class="">
</div>
<div>We should warn for obvious conflicts (like your second example), but we probably should not not put too much knowledge about the specific parameters into clang. </div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<blockquote type="cite" class="">
<div class="">
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
    vectorize(enable) vectorize_width(1)</div>
</div>
</blockquote>
<div><br class="">
</div>
IMO we should enable the transformation and set vector_width=1 in the metadata. This might not make too much sense (it instructs LoopVectorize to only do interleaving), but I do not think it would be a good idea to add too much logic to validate parameter combinations
 to clang. We can always provide information via optimization remarks from the transforms.</div>
<div><br class="">
<blockquote type="cite" class="">
<div class="">
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
<br class="">
</div>
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
Should this enable of disable vectorisation? This is now important when an option implies setting the transformation.  I think it probably makes most sense that enabling/disabling the transformation should take precedence over setting the transformation options,
 and so in this example vectorisation should be enabled. With this logic, the predicate hint is ignored because vectorisation is disabled in this case:<br class="">
</div>
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
<br class="">
</div>
<div class="" style="font-style:normal; font-variant-caps:normal; font-weight:normal; letter-spacing:normal; text-align:start; text-indent:0px; text-transform:none; white-space:normal; word-spacing:0px; text-decoration:none; font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt">
<span class="">    vectorize(disable) vectorize_predicate(enable)</span><br class="">
</div>
</div>
</blockquote>
<div><br class="">
</div>
IMO it makes sense for the more explicit pragma (vectorize(disable)) to take precedence over the one that implicitly enables vectorization. We should disable vectorization via metadata.</div>
<div><br class="">
</div>
<div><br class="">
</div>
<div>Cheers,</div>
<div>Florian</div>
</div>
</body>
</html>