<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from text --><style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<div>
<div dir="auto" style="direction:ltr; margin:0; padding:0; font-family:sans-serif; font-size:11pt; color:black">
I mean, the FE will create only one of the 3 vector versions matching the one we want for a given vector length, wouldn't it? The question now is: can we with the scalar and one vector version correctly vectorize the call. If the answer is no, what is the minimal
 amount of information, in addition to the two version, we would need?<br>
<br>
</div>
<div dir="auto" style="direction:ltr; margin:0; padding:0; font-family:sans-serif; font-size:11pt; color:black">
<span id="x_OutlookSignature">
<div dir="auto" style="direction:ltr; margin:0; padding:0; font-family:sans-serif; font-size:11pt; color:black">
Get <a href="https://aka.ms/ghei36">Outlook for Android</a></div>
</span><br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Francesco Petrogalli <Francesco.Petrogalli@arm.com><br>
<b>Sent:</b> Monday, June 24, 2019 6:06:12 PM<br>
<b>To:</b> Tian, Xinmin<br>
<b>Cc:</b> Doerfert, Johannes; Saito, Hideki; Simon Moll; LLVM Development List; Clang Dev; Renato Golin; Finkel, Hal J.; Andrea Bocci; Elovikov, Andrei; Alexey Bataev; nd; Roman Lebedev; Philip Reames; Shawn Landden<br>
<b>Subject:</b> Re: RFC: Interface user provided vector functions with the vectorizer.</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:11pt;">
<div class="PlainText"><br>
<br>
> On Jun 24, 2019, at 10:53 AM, Tian, Xinmin <xinmin.tian@intel.com> wrote:<br>
> <br>
> To me, it is also an issue related to SIMD signature matching when the vectorizer kicks in. Losing info from FE to BE is not good in general.<br>
>  <br>
<br>
Yes, we cannot loose such information. In particular, the three examples I reported are all generating i64 in the scalar function signature:<br>
<br>
// Type 1<br>
typedef _Complex int S;<br>
<br>
// Type 2 <br>
typedef struct x{<br>
int a;<br>
int b;<br>
} S;<br>
<br>
// Type 3<br>
typedef uint64_t S;<br>
<br>
S foo(S a, S b) {<br>
return ...;<br>
}<br>
<br>
<br>
On AArch64, the correspondent vector function signature in the three cases would be (for 2-lane unmasked vectorization):<br>
<br>
// Type 1:<br>
<br>
<4 x int> vectorized_foo(<4 x int>, <4 x int>)<br>
<br>
// Type 2:<br>
<br>
%a = type struct {I 32, i32}<br>
<br>
<2 x %a* > vectorized_foo(<2 x %a*> , <2 x %a*>)<br>
<br>
// Type 3:<br>
<br>
<2 x i64> vectorized_foo(<2 x i64>, <2 x i64)<br>
<br>
To make sure that the vectorizer knows how to map the scalar function parameters to the vector ones, we have to make sure that the original signature  information is stored somewhere.<br>
<br>
I will work on this, and provide examples.<br>
<br>
Suggestions are welcome.<br>
<br>
Thank you<br>
<br>
Francesco</div>
</span></font>
</body>
</html>