[llvm-dev] if-conversion

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Fri Apr 22 20:27:40 PDT 2016


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)

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


More information about the llvm-dev mailing list