[llvm-dev] if-conversion

Michael Zolotukhin via llvm-dev llvm-dev at lists.llvm.org
Sat Apr 23 12:25:23 PDT 2016


Hi,
> On Apr 22, 2016, at 8:27 PM, Hal Finkel via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> Hi Rob,
> 
> The problem here is that the d[i] array is only conditionally accessed, and so we can't if-convert the loop body. The compiler does not know that d[i] is actually dereferenceable for all i from 0 to 15 (the array might be shorter and p[i] is 0 for i past the end of d's extent).
> 
> You can inform LLVM that it is safe to vectorize anyway by adding a pragma, like this:
> 
>  #pragma clang loop vectorize(assume_safety)
I don’t think it would be enough (due to current limitations of vectorizer). The following expression will be vectorizable:
                res[i] = (p[i] == 0) ? (res[i] + c[i]) : (res[i] + d[i]);    // Note “+ c[i]”
This way, vectorizer deals with similar expressions in both true and false branches, and just needs a vector select to vectorize them. In the original code it needs to figure out, that it needs some kind of “+ 0” in the true branch, and it currently fails to do so.

Another way to help vectorizer in this case is to manually hoist the loads, like this:
                int tmp_d = d[i];
                res[i] = (p[i] == 0) ? res[i] : (res[i] + tmp_d);


Hope this helps,
Michael

> 
> or you can use the OpenMP 4 pragma:
> 
>  #pragma omp simd
> 
> -Hal
> 
> ----- Original Message -----
>> From: "RCU via llvm-dev" <llvm-dev at lists.llvm.org>
>> To: "llvm-dev at lists.llvm.org >> llvm-dev" <llvm-dev at lists.llvm.org>
>> Sent: Friday, April 22, 2016 4:21:22 PM
>> Subject: [llvm-dev] if-conversion
>> 
>> Hi.
>>     I'm trying to vectorize the following piece of code with Loop
>>     Vectorizer (from LLVM
>> distribution Nov 2015), but no vectorization takes place:
>>         int *Test(int *res, int *c, int *d, int *p) {
>>             int i;
>> 
>>             for (i = 0; i < 16; i++) {
>>                 //res[i] = (p[i] == 0) ? c[i] : d[i];
>>                 res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];
>>             }
>> 
>>             return NULL;
>>         }
>> 
>>     It seems the problem is the if conversion, which is not working
>>     on this simple
>> example, although I guess it should.
>>     Is it a problem of low profitability given the loads?
>> 
>>     Could you please tell me if there is any way to make If
>>     conversion work on programs
>> like this.
>> 
>> 
>>     Below is an older message from 2013 about the status of if
>>     conversion from LLVM at
>> that date (from
>> http://lists.llvm.org/pipermail/llvm-dev/2013-November/067427.html
>> or
>> https://groups.google.com/forum/#!msg/llvm-dev/FlDGnqSGbR8/YZUN3h4IzA8J
>> ).
>>> Hi Rob,
>>> 
>>> I chose to answer on the list since from time to time people come
>>> back
>>> to this.
>>> 
>>> That said, I did implement the generic variant of if-conversion
>>> that is
>>> called "control-flow to data-flow conversion" as a basis for SIMD
>>> vectorization. Essentially, the conversion removes all control
>>> flow
>>> except for loop back edges and replaces it by masks and blend
>>> (select)
>>> operations.
>>> 
>>> Details on the algorithm can be found in our paper on
>>> "Whole-Function
>>> Vectorization" (CGO 2011). The old, LLVM-based implementation of
>>> the
>>> algorithm is still online at github I believe. A completely
>>> rewritten
>>> one will be released along with submission of my PhD thesis at the
>>> end
>>> of the year.
>>> 
>>> That said, if you are only looking for if-conversion of code with
>>> limited complexity (e.g. no side effects, no loops), it is really
>>> simple:
>>> - Compute masks for every block (entry mask: disjunction of
>>> incoming
>>> masks, exit masks: conjunctions of entry mask and (negated)
>>> condition).
>>> - Replace each phi by a select that uses the entry mask of the
>>> corresponding block.
>>> - Order blocks topologically by data dependencies, remove outgoing
>>> edges, create unconditional branches from each block to the next
>>> in the
>>> list.
>>> 
>>> Cheers,
>>> Ralf
>>> 
>>> 
>>> On 06/11/13 19:50, RobBishop wrote:
>>>> Hi all,
>>>> 
>>>> Sorry to dig up an old thread but I wondered what the status of
>>>> if-conversion in LLVM is. Has any work been done towards
>>>> handling this as a
>>>> transform pass on the IR?
>>>> 
>>>> I'm looking to implement an if-conversion pass and wanted to
>>>> ensure that I'm
>>>> not duplicating work. Is this something that others would also
>>>> find useful?
>>>> 
>>>> Rob
>>>> 
>>>> 
>>>> 
>>>> --
>>>> View this message in context:
>>> http://llvm.1065342.n5.nabble.com/if-conversion-tp2349p62937.html
>>>> Sent from the LLVM - Dev mailing list archive at Nabble.com.
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>> 
>> 
>>  Thank you,
>>     Alex
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> 
> 
> -- 
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160423/8589a9e7/attachment.html>


More information about the llvm-dev mailing list