[llvm-dev] [RFC] Vector Predication

Simon Moll via llvm-dev llvm-dev at lists.llvm.org
Wed Feb 27 04:56:03 PST 2019

On 2/25/19 4:22 PM, David Greene wrote:
> "Saito, Hideki" <hideki.saito at intel.com> writes:
>> Constrained intrinsics should be extended to take a mask
>> parameter. Scalar call sites should be verified to have constant TRUE
>> mask value.
>>      llvm.experimental.constrained.fdiv(b[i], c[i], tonearest, maytrap),
> Yes, they should and I believe that is part of Simon's proposal.
>                                -David

We will make them available as llvm.vp.constrained.fdiv(..etc..)

- Simon

>> -----Original Message-----
>> From: David Greene [mailto:dag at cray.com]
>> Sent: Thursday, February 21, 2019 10:28 AM
>> To: Philip Reames <listmail at philipreames.com>
>> Cc: Simon Moll <moll at cs.uni-saarland.de>; via llvm-dev
>> <llvm-dev at lists.llvm.org>; Maslov, Sergey V
>> <sergey.v.maslov at intel.com>; Saito, Hideki <hideki.saito at intel.com>;
>> Topper, Craig <craig.topper at intel.com>
>> Subject: Re: [llvm-dev] [RFC] Vector Predication
>> Philip Reames <listmail at philipreames.com> writes:
>>> I was not suggesting that you rely on pattern matching predication for
>>> correctness.  As you point out, that's obviously incorrect.  I was
>>> assuming that you have a correct but slow lowering for the select
>>> form.  I was suggesting your ISEL attempt to use a predicated
>>> instruction where possible for performance.
>> The whole reason for using predication is performance.  In the
>>> presence of traps, the select form should never even be created in
>>> the first place.
>>> The point about pattern complexity is an inherent difficulty w/any
>>> intermediate IR.  We do quite well pattern matching complicate
>>> constructs in existing backends - x86 SIMD comes to mind - and I'm
>>> unconvinced that predication is somehow inherently more difficult.
>> Our experience tells us otherwise.  Intrinsics, and ultimately first-class IR support is the most reasonable way to get correctness and performance.  How should we translate this to get predicated instructions out?
>>    for (int i=...) {
>>      if( fabs(c[i]) > epsilon) {
>>        a[i] = b[i]/c[i];
>>      }
>>      else {
>>        a[i] = 0;
>>      }
>>    }
>> We can't use select even with constrained intrinsics, because the constrained intrinsics only tell the optimizer they can't be speculated.
>> This is not a legal translation:
>>    %cond = fabs(c[i]) > epsilon
>>    %temp = select %cond,
>>      llvm.experimental.constrained.fdiv(b[i], c[i], tonearest, maytrap),
>>      0
>>    store a[i], %temp
>> According to the IR, we've already speculated llvm.experimental.constrained.fdiv above the test.
>> I believe the only way to safely do this with the current IR is via control flow and now we have to match complex control flow during isel.
>> Who knows what other things passes may have put into our carefully constructed basic blocks?
>> The ARM backend has (had?) logic for trying to match predicated scalar things.  I would not wish it on any codegen person.
>>                              -David


Simon Moll
Researcher / PhD Student

Compiler Design Lab (Prof. Hack)
Saarland University, Computer Science
Building E1.3, Room 4.31

Tel. +49 (0)681 302-57521 : moll at cs.uni-saarland.de
Fax. +49 (0)681 302-3065  : http://compilers.cs.uni-saarland.de/people/moll

More information about the llvm-dev mailing list