The api is meant to handle scalar and vector: /// \return The number of scalar or vector registers that the target has. /// If 'Vectors' is true, it returns the number of vector registers. If it is /// set to false, it returns the number of scalar registers. virtual unsigned getNumberOfRegisters(bool Vector) const;
We don’t actually use the number of scalar registers anywhere and this number would depend on the (dominant) type (so would the vector number). I think, we can revisit this when we revisit the unrolling heuristic in the loop vectorizer (I have a radar for this, it is just not my highest priority). On Sep 9, 2013, at 11:05 AM, Eric Christopher <[email protected]> wrote: > Drive by comment, should probably be "getNumberOfVectorRegisters" or > some sort of query with vector in the name :) > > -eric > > On Mon, Sep 9, 2013 at 8:43 AM, Arnold Schwaighofer > <[email protected]> wrote: >> Hi Robert, >> >> I think Nadav meant to add code to the LoopVectorizer and SLPVectorizer that >> calls "TTI.getNumberOfRegisters(true)” and stops vectorization if it returns >> 0. Something like: >> >> --- a/lib/Transforms/Vectorize/LoopVectorize.cpp >> +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp >> @@ -906,6 +906,11 @@ struct LoopVectorize : public LoopPass { >> DT = &getAnalysis<DominatorTree>(); >> TLI = getAnalysisIfAvailable<TargetLibraryInfo>(); >> >> + // If the target claims to have no vector registers don't attempt >> + // vectorization. >> + if (!TTI->getNumberOfRegisters(true)) >> + return false; >> + >> if (DL == NULL) { >> DEBUG(dbgs() << "LV: Not vectorizing because of missing data layout"); >> return false; >> >> >> >> diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp >> b/lib/Transforms/Vectorize/SLPVectorizer.cpp >> index 1f288bc..6ddcc51 100644 >> --- a/lib/Transforms/Vectorize/SLPVectorizer.cpp >> +++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp >> @@ -1565,6 +1565,11 @@ struct SLPVectorizer : public FunctionPass { >> if (!DL) >> return false; >> >> + // If the target claims to have no vector registers don't attempt >> + // vectorization. >> + if (!TTI->getNumberOfRegisters(true)) >> + return false; >> + >> // Don't vectorize when the attribute NoImplicitFloat is used. >> if (F.hasFnAttribute(Attribute::NoImplicitFloat)) >> return false; >> >> On Sep 9, 2013, at 7:13 AM, Robert Lytton <[email protected]> wrote: >> >>> Hi Rafael, Nadav, >>> >>> Thank you for the input but I don't follow where the change needs to be >>> made. >>> >>> Are you suggesting changes to llvm's >>> lib/Transforms/IPO/PassManagerBuilder.cpp? >>> This approach would make the '-vectorize-loops' & '-vectorize-slp' flags >>> only relevant for targets with vector registers? >>> >>> Or in clang/lib/Driver/Tools.cpp? >>> >>> In either case, I can't see how to get hold of the TargetTransformInfo >>> cleanly. >>> >>> Robert >>> >>> ________________________________________ >>> From: Rafael Espíndola [[email protected]] >>> Sent: 06 September 2013 18:43 >>> To: Nadav Rotem >>> Cc: Robert Lytton; [email protected]; Arnold Schwaighofer >>> Subject: Re: XCore target: disable vectorization >>> >>>> unsigned TargetVectorRegisters = TTI.getNumberOfRegisters(true); >>> >>> And not vectorize if the target says 0? I like that idea. >>> >>> Cheers, >>> Rafael >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
