[LLVMdev] [PATCH] Add a Scalarize pass

Nadav Rotem nrotem at apple.com
Fri Nov 15 09:13:38 PST 2013


Hi Richard, 

The discussion on llvmpipe is irrelevant.  llvmpipe has its own pass manager and optimization pipe, it is not a C compiler.  

Nadav 


On Nov 15, 2013, at 3:26 AM, Richard Sandiford <rsandifo at linux.vnet.ibm.com> wrote:

> Nadav Rotem <nrotem at apple.com> writes:
>> On Nov 14, 2013, at 2:32 PM, Richard Sandiford
>> <rsandifo at linux.vnet.ibm.com> wrote:
>>> Richard Sandiford <rsandifo at linux.vnet.ibm.com> writes:
>>>> Are you worried that adding it to PMB will increase compile time?
>>>> The pass exits very early for any target that doesn't opt-in to doing
>>>> scalarisation at the IR level, without even looking at the function.
>>> 
>>> As an alternative, adding Scalarizer and InstCombine passes to
>>> SystemZPassConfig::addIRPasses() would probably give me most of the
>>> benefit without affecting the PMB.  Scalarizer itself would then not
>>> test TargetTransformInfo at all, at least in the initial version,
>>> and the scalarisation would still logically be done by codegen.
>>> Would that be OK?
>> 
>> I actually prefer that the Scalarizer would not touch TTI at all because
>> I view scalarization a canonicalization phase for DSLs, much like SROA
>> breaks structs.
> 
> That's what Pekka is thinking of using it for, but it wasn't the reason
> I wrote it.  The original motivation was llvmpipe, which is a rasteriser
> rather than a DSL compiler.  The motivation wasn't to canonicalise,
> it was to do the same thing that codegen currently does, but in a better
> place from an optimisation perspective.
> 
> You said in an earlier message:
> 
>  Other users of LLVM (such as OpenCL JITs) do scalarize early in the
>  optimization pipeline because the problem-domain presents lots of
>  vectors that needs to be legalized.
> 
> But:
> 
> (a) Scalarising and revectorising only makes sense if the vectorisation
>    is done with the target in mind.  If going from scalar code to vector
>    code can depend on the target, why shouldn't the same be true in the
>    other direction, for targets without vector support?
> 
> (b) The situation you describe isn't the one that applies to llvmpipe.
>    In llvmpipe the vectors are nice, known widths that are under the
>    driver's own control.  We certainly don't want to scalarise and
>    revectorise llvmpipe IR on x86_64, or on powerpc with Altivec/VSX.
>    The original code is already well vectorised for those targets.
>    (And also for ARM NEON I expect.)
> 
>    In the llvmpipe case, codegen's type legaliser already makes a good
>    decision about what to scalarise and what not to scalarise, without
>    any help from llvmpipe.  The problem I'm trying to solve is that
>    codegen is too late to get the benefit of other IR optimisations.
> 
>    So in my case I do not want to _change_ the decision about which
>    vectors get scalarised and how.  I just want to do it earlier.
>    It would be a shame if that meant that llvmpipe had to duplicate
>    exactly the decisions that codegen makes wrt scalarisation,
>    since codegen can easily make those decisions available through
>    TargetTransformInfo.
> 
> That's why I thought using TTI in the Scalarizer was a good thing
> in principle, at least as an option.
> 
> SystemZ is a simple case because there is no vector support.  But take MIPS
> (which is often a good example when it comes to complicated possibilities :-)).
> It has at least four separate vector extensions:
> 
>  - <2 x float> support from the MIPS V floating-point extensions,
>    carried over to MIPS 32/64.
> 
>  - <8 x i8> and <4 x i16> support from the optional MDMX extension,
>    now deprecated but used on older chips like the SB-1 and (in a
>    modified form) the VR5400.
> 
>  - Processor-specific vector extensions for the Loongson range.
> 
>  - The new MSA ASE.
> 
> That's a lot of possiblities.  Maybe the LLVM port will never support
> Loongson and MDMX (almost certain for the latter), but the point is that
> even if it did support them, the current codegen interface would make the
> right decisions about which of the llvmpipe vectors should be scalarised
> and how.
> 
> If Scalarizer is an all-or-nothing pass then it cannot make as good a
> decision for llvmpipe IR, where we don't expect to revectorise the result.
> Obviously the current pass is all-or-nothing anyway, but I tried to
> structure it so that it would be easy to make per-type decisions in
> the future, based on the TargetTransformInfo.
> 
> I realise I'm not going to convince you, and I'm going to make the
> change anyway.  I still think it's the wrong direction though.
> 
> Thanks,
> Richard
> 




More information about the llvm-dev mailing list