[llvm-dev] [RFC] Canonicalization of unsigned subtraction with saturation
Sanjay Patel via llvm-dev
llvm-dev at lists.llvm.org
Tue May 16 06:30:47 PDT 2017
Thanks for posting this question, Julia.
I had a similar question about a signed min/max variant here:
http://lists.llvm.org/pipermail/llvm-dev/2016-November/106868.html
The 2nd version in each case contains a canonical max/min representation in
IR, and this could enable more IR analysis.
A secondary advantage is that the backend recognizes the max/min in the
second IR form when creating DAG nodes,
and this directly affects isel for many targets.
A possibly important difference between the earlier example and the current
unsigned case:
is a select with a zero constant operand easier to reason about in IR than
the canonical min/max?
On Tue, May 16, 2017 at 5:30 AM, Koval, Julia <julia.koval at intel.com> wrote:
> Hi,
>
> This message is a result of a discussion of backend optimization for
> sub(max) pattern(https://reviews.llvm.org/D25987), which can be either
> converted to unsigned min-max or unsigned saturation instruction(if the
> target supports it).
> Currently these versions of the code produce different IR(and we need to
> manage both types in backend):
>
> (1.16)
> void foo(unsigned short *p, unsigned short max, int n) {
> int i;
> unsigned short m;
> for (i = 0; i < n; i++) {
> m = *--p;
> *p =(m >= max ? m-max : 0);
> }
> }
>
> (2.16)
> void goo(unsigned short *p, unsigned short max, int n) {
> int i;
> unsigned short m;
> for (i = 0; i < n; i++) {
> m = *--p;
> unsigned short umax = m > max ? m : max;
> *p =umax - max;
> }
> }
>
> (1.16)
> %cmp = icmp ugt i16 %x, %y
> %sub2 = sub i16 %y, %x
> %res = select i1 %cmp, i16 0, i16 %sub2
>
> or
>
> (2.16)
> %cmp = icmp ugt i16 %x, %y
> %sel = select i1 %cmp, i16 %x, i16 %y
> %sub = sub i16 %sel, %x
>
> Which of these versions is canonical? I think first version is better,
> because it can be converted to unsigned saturation instruction(i.e.
> PSUBUS), using existing backend code.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170516/196368bc/attachment.html>
More information about the llvm-dev
mailing list