[PATCH] Fix for previously reverted SLPVectorizer cost model improvement

Arnold aschwaighofer at apple.com
Thu Apr 10 05:37:40 PDT 2014


Yes, committed as 205855.

> On Apr 9, 2014, at 10:47 PM, Eric Christopher <echristo at gmail.com> wrote:
> 
> Looks like this got committed? (No problem on my end, just closing out
> the thread in my inbox after my flight back)
> 
> -eric
> 
>> On Tue, Apr 8, 2014 at 8:22 PM, Tyler Nowicki <tnowicki at apple.com> wrote:
>> Thanks for the review!
>> 
>> For lack of a better place I moved isTriviallyVectorizable() to
>> VectorUtils.h and I left the function name as is.
>> 
>> Here is the updated patch.
>> 
>> Tyler
>> 
>> 
>> 
>> On Apr 8, 2014, at 7:50 AM, Eric Christopher <echristo at gmail.com> wrote:
>> 
>> On Mon, Apr 7, 2014 at 6:34 PM, Arnold Schwaighofer
>> <aschwaighofer at apple.com> wrote:
>> 
>> 
>> On Apr 6, 2014, at 9:14 PM, Nadav Rotem <nrotem at apple.com> wrote:
>> 
>> +    static inline bool isTriviallyVectorizable(Intrinsic::ID ID) {
>> 
>> I don't think that this function belongs in include/llvm/IR/IntrinsicInst.h.
>> This function describes the current capabilities of the loop vectorizer.
>> Would you add a similar function that describes functions that can be
>> LICM-ed or Scalarized or Unrolled into Intrinsics.h?  Moreover, we could
>> easily teach the vectorizer to vectorize these functions (we have done it
>> with Intel's OpenCL vectorizer).
>> 
>> 
>> I think this api describes a property of the intrinsic instruction: Whether
>> all operands are vector operands of the same width when the instruction is
>> vectorized. Maybe, we should name it such: areAllOpdsIdenticallyWidened?
>> 
>> It is used by the two vectorizers to determine whether they can vectorize
>> the instruction by simply widening the types:
>> 
>> float @llvm.pow.f32(float  %Val, i32 %power) => <2 x float>
>> @llvm.pow.f32(<2 x float> %Val, <2 x i32> %power)
>> 
>> in contrast to:
>> 
>> float @llvm.powi.f32(float  %Val, i32 %power) => <2 x float>
>> @llvm.powi.f32(<2 x float> %Val, i32 %power)
>> 
>> 
>> I think I agree with Nadav here. It's a piece of knowledge that's not
>> generally useful outside of the vectorizer pass and there's really no
>> reason for it to be in Intrinsics.h. It describes a property, but we
>> should only put things in Intrinsics.h if they describe properties on
>> the intrinsic definition.
>> 
>> Thoughts?
>> 
>> -eric
>> 
>> 
>> Best,
>> Arnold
>> 
>> 
>> 
>> 
>> On Apr 6, 2014, at 5:47 PM, Arnold Schwaighofer <aschwaighofer at apple.com>
>> wrote:
>> 
>> Can you change the comment to:
>> 
>> 
>> +    /// This method returns true if the intrinsic's argument types are all
>> scalars
>> 
>> 
>> from:
>> 
>> 
>> +    /// Method returns true if intrinsic arguments types are all scalars
>> +    /// for the scalar form of the intrinsic and all vectors for the vector
>> +    /// form of the intrinsic.
>> 
>> 
>> 
>> with this change this LGTM.
>> 
>> 
>> 
>> On 04/04/14, Tyler Nowicki   wrote:
>> 
>> Thanks for the review
>> 
>> Here is an updated patch. I made the changes you asked for including
>> splitting out the unrelated code, modifying the comment, removing the
>> lifetime intrinsics. I also adding ctpop which was previously missing.
>> 
>> Tyler
>> 
>> 
>> 
>> 
>> 
>> On Apr 3, 2014, at 4:30 PM, arnold <aschwaighofer at apple.com> wrote:
>> 
>> --- include/llvm/IR/IntrinsicInst.h        (revision 205571)
>> +++ include/llvm/IR/IntrinsicInst.h        (working copy)
>> @@ -44,6 +44,38 @@
>>   return (Intrinsic::ID)getCalledFunction()->getIntrinsicID();
>> }
>> 
>> +    /// Method returns true if any intrinsic argument types are scalar
>> +    /// in both vector and scalar forms of the intrisinc.
>> 
>> The other way round (except for lifetime_start). Like you describe below in
>> the explanation of the patch.
>> 
>> +    ///
>> +    static inline bool isTriviallyVectorizable(Intrinsic::ID ID) {
>> +      switch (ID) {
>> +        case Intrinsic::sort:
>> ...
>> +        case Intrinsic::lifetime_start:
>> +        case Intrinsic::lifetime_end:
>> +          return true;
>> +        default:
>> +          return false;
>> +      }
>> +    }
>> 
>> Because of Intrinsic::lifetime_start the comment is not totally true. A
>> lifetime_start/end is vectorizable because we simple scalarize it in the
>> loop vectorizer. For all other intrinsics we can vectorize them because all
>> their arguments become vectors when vectorized (like you mention below). I
>> think lifetime_start/stop should be handled separately (not be checked as
>> part of isTriviallyVectorizable).
>> 
>> Can you separate the patch into two patches? One that corrects the handling
>> of mixed argument intrinsic and the second one reverting my revert.
>> 
>> You can test the first patch by moving both insertelement instructions in
>> the example non-vectorizable-intrinsic.ll before the return.
>> 
>> Thanks for working on this!
>> 
>> On Apr 3, 2014, at 2:44 PM, Tyler Nowicki <tnowicki at apple.com> wrote:
>> 
>> Hi,
>> 
>> This patch modifies r205260 which was previously reverted by r205018 because
>> it a crash. The original patch by Arch Robison and Arnold Schwaighofer.
>> 
>> This patch stops the SLP vectorizer from trying to vectorize a call that is
>> not trivially vectorizable. An intrinsic is not trivially vectorized if any
>> of the arguments cannot be simply packed together into a tuple. For example,
>> the call to CTLZ cannot be trivially replaced with a vector intrinsic
>> because the second parameter is scalar in both its scalar and vector forms.
>> 
>> Tyler Nowicki
>> 
>> <slp_insertelements_fix2.patch>_______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
>> 
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
>> 
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
>> 
>> 



More information about the llvm-commits mailing list