making the new if-converter not mangle IR that is already vectorizer-friendly
Alan Lawrence
alan.lawrence@arm.com
Thu Jul 2 09:30:00 GMT 2015
Abe wrote:
> <personal introduction/>
Hi, pleased to meet you :)
> <topic introduction>
>
> As some of you already know, at SARC we are working on a new "if converter" to help convert
> simple "if"-based blocks of code that appear inside loops into an autovectorizer-friendly form
> that closely resembles the C ternary operator ["c ? x : y"]. GCC already has such a converter,
> but it is off by default, in part because it is unsafe: if enabled, it can cause certain code
> to be transformed in such a way that it malfunctions even though the non-converted code worked
> just fine with the same inputs. The new converter, originally by my teammate Sebastian Pop,
> is safer [almost-always safe *]; we are working on getting it into good-enough shape that the
> always-safe transformations can be turned on by default whenever the autovectorizer is on.
>
> * Always safe for stores, sometimes a little risky for loads:
> speculative loads might cause multithreaded programs with
> insufficient locking to fail due to writes by another thread
> being "lost"/"missed", even though the same program works OK
> "by luck" when compiled without if-conversion of loads.
> This risk comes mainly/only from what the relevant literature
> calls a "half hammock": an "if" with a "then" section but no
> "else" section [or effectively vice-versa, e.g. an empty "then"
> and a non-empty "else"]. In this case, e.g. "if (c) X[x] = Y[y];"
> with no attached "else" section is risky to fully if-convert
> in the event of the code being compiled running multithreaded
> and not having been written with all the locking it really needs.
> Respectively, e.g. "if (c) ; /* empty ''then'' */ else X[x] = Y[y];".
For the unenlightened, can you outline the problem with this code sequence?
(i.e. the expected transformation that makes it unsafe!?) I would hope your
scratchpad patch would turn this into something like
a1 = c ? &Y[y] : &scratch;
temp = *a1;
a2 = c ? &X[x] : &scratch;
*a2 = temp;
which seems OK to me - so is the scratchpad approach going away?
(The problem that things might be read in a different order *across* the
elements of a vector, I can see, but that belongs in the domain of the
vectorizer itself, not if-conversion, I would think?)
> One of the reasons the new if converter has not yet been submitted
> for incorporation into GCC`s trunk is that it still has some
> performance regressions WRT the old converter, and most of those
> are "true regressions", i.e. not just because the old converter
> was less safe and the additional safety is what is causing the loss,
> but rather because there is more work to do before the patch is ready.
>
> As of this writing, the new if converter sometimes tries
> to "convert" something that is already vectorizer-friendly,
> and in doing so it renders that code now-NOT-vectorizer-friendly.
Can you give an example? My understanding was that the existing vectorizer
bailed out pretty much straightaway if the number of basic blocks in the loop
was not exactly 2 (for inner loops) or 5 (for outermost loops, i.e. containing
exactly one inner loop)...that seems to rule out vectorization of *any* kind of
conditional execution, that the if-converter might convert?
Thanks, Alan
More information about the Gcc
mailing list