[llvm-commits] [LLVMdev] [PATCH] BasicBlock Autovectorization Pass

Tobias Grosser tobias at grosser.es
Wed Jan 25 02:12:52 PST 2012


On 01/24/2012 10:01 PM, Hal Finkel wrote:
> I have attached the latest version of my basic-block autovectorization
> pass.

Nice.


> With regard to the non-trivial cycle checking I had mentioned
> previously, I implemented the "late abort" solution and made it the
> default for cases where the full cycle check would be expensive (for
> blocks that have many candidate pairs). For blocks with fewer candidate
> pairs, the full cycle check is used.

Good.

> I believe that I have addressed all concerns raised thus far (except for
> the container Value* ->  Instruction* type changes, which Tobias said he
> would be okay with having changed post commit). If I receive no
> objections over the next few days, I'll commit.

Alright.

> I would like to thank everyone who has provided feedback, many of the
> suggestions have proved quite valuable.

A final nitpick:

> +    if (CallInst *C = dyn_cast<CallInst>(I)) {
> +      if (!isVectorizableIntrinsic(C))
> +        return false;
> +    } else if (LoadInst *L = dyn_cast<LoadInst>(I)) {
> +      // Vectorize simple loads if possbile:
> +      IsSimpleLoadStore = L->isSimple();
> +      if (!IsSimpleLoadStore || NoMemOps)
> +        return false;
> +    } else if (StoreInst *S = dyn_cast<StoreInst>(I)) {
> +      // Vectorize simple stores if possbile:
> +      IsSimpleLoadStore = S->isSimple();
> +      if (!IsSimpleLoadStore || NoMemOps)
> +        return false;
> +    } else if (CastInst *C = dyn_cast<CastInst>(I)) {
> +      // We can vectorize casts, but not casts of pointer types, etc.
> +      if (NoCasts)
> +        return false;
> +
> +      Type *SrcTy = C->getSrcTy();
> +      if (!SrcTy->isSingleValueType() || SrcTy->isPointerTy())
> +        return false;
> +
> +      Type *DestTy = C->getDestTy();
> +      if (!DestTy->isSingleValueType() || DestTy->isPointerTy())
> +        return false;
> +    } else if (!(I->isBinaryOp() || isa<ShuffleVectorInst>(I) ||
> +        isa<ExtractElementInst>(I) || isa<InsertElementInst>(I)))
> +      return false;

You may want to add braces to a single statement branch, if the other
branches have also braces. (I think I have seen this happening a couple
of times).

Cheers
Tobi



More information about the llvm-commits mailing list